#私藏项目实操分享# String源码解析和部分面试题

举报
宇宙之一粟 发表于 2022/01/15 01:16:56 2022/01/15
【摘要】 不变性 一旦被初始化,就不能再被改变;即使修改,也是新的对象 String s = "Hello";s = "你好"; 为了满足不可变对象,Java语言要求遵守以下5条原则: 1. ...

不变性

一旦被初始化,就不能再被改变;即使修改,也是新的对象

String s = "Hello";s = "你好";
        

为了满足不可变对象,Java语言要求遵守以下5条原则:

1. 类内部所有的字段都是final修饰的

2. 类内部所有的字段都是私有的,也就是private修饰

3. 类不能够被集合和拓展

4. 类不能对外提供那些能够修改内部状态的方法,setter方法也不行

5. 类内部的字段如果是引用,也就是说可以指向可变对象,但我们不能获取这个对象

我们来看一下源码:

public final class String    implements java.io.Serializable, Comparable<String>, CharSequence {    /** The value is used for character storage. */    private final char value[];      /** Cache the hash code for the string */    private int hash; // Default to 0}  
        

从源码可以看出,String满足不可变对象的5条原则,源码解析:

  1. String类被final修饰,说明String类绝不可能被继承了,——也就是任何对String的操作方法,都不会被继承覆写。
  2. String 中保存数据的是一个char的数组value,同样也是被final修饰,——也就是value一旦被赋值,内存地址是绝对无法修改的
  3. value的权限是私有的,外部绝对访问不到
  4. String也没有开放出可以对value进行赋值的方法

综上,value一旦产生,内存地址就根本无法被修改。

String的其他方法是怎么回事?

既然String是不可变的,好像内部还有很多substring, replace, replaceAll这些操作的方法。好像都是对String对象改变了,解释起来也很简单,我们每次的replace这些操作,其实就是在堆内存中创建了一个新的对象。然后我们的value指向不同的对象罢了。

String str = “Hello world!”;str = str.replace("world", "World...");
        

String真的不可变吗?

真的不能改变String吗?别忘了反射机制,在通常情况下,他可以做出一些违反语言设计原则的事情。 通过反射来改变String:

public class StringDemo {    public static void main(String[] args) {        String str = "Hello";        System.out.println(str);        try {            // 通过反射获取内部的value字符数组            Field field = String.class.getDeclaredField("value");            field.setAccessible(true);            char[] value;            value = (char[]) field.get(str);            // 把字符串第一个字符H变成小写            value[0] = 'h';            System.out.println(str);        } catch (Exception e) {            e.printStackTrace();        }    }}
        

文章来源: blog.csdn.net,作者:宇宙之一粟,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/yuzhou_1shu/article/details/122476748

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。