String源码学习感悟
今天学习了一下String的源码。下面是我的学习感悟。
1.
String str = "ABC"; Char[] data = {'A','B','C'}; String str = new String(data);
这两个是一样的。也就是说:String的底层就是字符的数组。
2.
java提供了特殊的运算符'+',这个运算符可以用来将两个String类型的字符串相加获得新的字符串。
String str1 = "AAA"; String str2 = "BBB'; String str = str1 + str2;
实际上,这个是将str1变成了stringBuilder1,str2变成了stringBuilder2,然后运行stringBuilder = stringBuilder1.append(stringBuilder2),获得的结果为stringBuilder.toString();就变成了str。
3.
public final class String implements Serializable,Comparable,CharSequence{ }
这个是源码的第一行,定义了String类是个final类,它不能被任何的类继承,同时String类实现了Serializable、Comparable、CharSequence接口。这就意味着String类里面有这三个接口声明的方法。
4.
属性: private final char value[];
通过final来看,我们知道,String一旦被初始化,就不能被更改
第二个属性: private int hash;
缓存的字符穿hashCode 默认为0
第三个属性:
private static final long serialVersionUID = -6849794470754667710L; private static final ObjectStreamField[] serialPersistentFields = new ObjectStreamField[0];
String 拥有序列化和反序列化的功能,这个功是实现了Serializable接口的,
5.
StringBuffer和StringBuilder的功能差不多,只不过StringBuilder更快,而StringBuffer更安全。
官方文档是说StringBuffer的toString方法是同步的,牺牲了效率保证了线程的安全。
6.
其它方法:
7.
public native String intern();
native的意思是生成动态链接库文件,可以更快速的访问。
intern()方法是返回一个字符串对象的内部引用,当intern()被调用的时候,会先在常量池中寻找,如果常量池中有这样一个相等的字符串,则返回常量池中的实例,反之则在常量池中创建字符串,然后返回这个字符串的引用
8.
int i = 5; String i1 = ""+i; String i2 = String.valueOf(i); String i3 = Integer.toString(i);
第三行的底层也是按照第四层来执行的。意思就是说第三层和第四层是一样的。而第二层则是先创建一个StringBuilder,在执行stringBuilder.append(i),再调用toString()方法