今天来看一看JDK8中String的源码,比较简单,这个系列后续就只关注JUC 了。
String内部实际上的存储结构为char数组,实现了Serializable,Comparable等接口,且用final修饰。来看一下String的大致结构
public final String implements Serializable, Comparable<String>, CharSequence {
char[] value;
Integer hash; //default to 0
.........
}
String类呢最主要就是操作这个char数组。来看几个值得注意的方法。
- isEmpty():
public boolean isEmpty() {
return value.length == 0;
}
一般用不到,因为char[]存的可能全是"",判空一般用StringUtils.isNotBlabk判断
2. equals():
在Object类中,equals方法等价于==,也就是说如果其子类没有重写equals方法,equals也等价于==,不过String类重写了equals方法,主要就是循环去判断char[]的值是否一致,实现比较简单。
- replace和replaceAll的区别
replace: 使用字符串去匹配
replaceAll:使用正则表达式去匹配
- 其他的方法:
如果返回值是String类型,那么就是使用new String(),
如果返回值是char[],那么使用的就是System.arrayCopy()
有一个比较经典的面试题:String用final修饰的好处?
这其实是一个设计类型的问题了。java语言之父给出的答案是:
1、能够缓存结果。当使用String传参数时,不用担心谁会修改它的值(java仅支持值传递)
2、安全。不管是在应用内部还是在网络中,无论什么类型,我们都是使用String进行传输的,有可能进行一系列的校验和操作后,String内部的值就变了,从而引发异常。如果是final 的话就不用担心这个问题
其实总的来说 就是为了安全。
看完之后感觉对自己的帮助不是很大,所以决定像Integer等比较简单源码以后就不写了。