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()方法

 

posted @ 2017-03-14 14:48  纯丿乱  阅读(405)  评论(1编辑  收藏  举报