最近有篇博文,应该比较火。我只是看了题目“你是真的有十年工作经验,还是用一年的工作经验复制了十年”。我不能说我用一年的工作经验复制了十年,我是用3-4年的工作经验复制了十年(单纯指开发,因为后来做了项目管理,现在又转到互联网做开发)。此时此刻,我想用2年的时间,来弥补一下这十年的遗憾。尽管一万个看不下去源码,但是还是得坚持,从简单的看,然后测试,然后记录博客。以此来鼓励自己。
jdk1.8源码,
java.lang.String、StringBuffer、StringBuilder
- String是用final修饰的,表明不可变,String中的value数组也是final修饰的,表明不可变。StringBuffer和StringBuilder都是final修饰的,但是它们继承了AbstractStringBuilder是可变的, value数组也是可变的。
- 字符串在String类里就是以一个char型数组value存在
- charAt,就是按照下标返回数组里的对应元素
- toCharArray,使用System.arraycopy方法,将源数组复制到目标数组
- compareTo。value1.compareTo(value2): ab 和 abc,取minlength,然后循环数组从0循环到minlength, * 如果循环中每一个元素相同,实际最后返回value1.length-value2.length * 如果循环中碰到第一个不相同的元素,返回的是这个不相同元素的差值 * value1小,返回负数;value1大,返回正数,两者相等返回0。
- copyValueOf(char[]),首先说是一个静态方法,而且参数是char数组类型,但是返回值还是String类型调用了Arrays.copyOf(),将参数数组赋值到String的数组,Arrays.copyOf()实际调用System.arrayCopy()所以完成数组的复制,其实有两种形式,java.util.Arrays.copyOf()或者java.lang.System.arraycopy(),但是copyof()有局限性,只能从下标0开始复制,而arraycopy()可以指定下标
- 其实在理解了String是以一个数组形式实现的,startsWith直接就判断第一个元素和传入的参数是否相同如果传入的是多余一个字符呢?其实传入的还是字符串,又回到了字符串以数组形式存在,按照下标去匹配是否相等。endsWith其实也是调用的startsWith,只是起始点不一样
- 其实在理解了String是以一个数组形式实现的,indexOf直接就循环数组,判断数组的每一个元素和传入的参数是否相同如果传入的是多余一个字符呢?其实传入的还是字符串,又回到了字符串以数组形式存在,只判断传入参数数组的第一个元素indexOf()是从前向后循环,lastIndexOf()是从后向前循环注意:fromIndex传的负数,indexOf会默认成0处理,lastIndexOf则直接返回-1
- substring在jdk1.7之后,截取后的字符串是一个新的数组,只是测试:如果截取起始到结束的整个字符串,其实就是返回了对象本身。补充:所有操作返回的是一个新的字符串。StringBuffer和StringBuilder的substring方法,都是返回的新字符串,原字符串没有变。
- java.lang.StringBuffer和java.lang.StringBuilder都继承自AbstractStringBuilder,AbstractStringBuilder也是以数组形式实现的,StringBuffer和StringBuilder初始容量是16,StringBuffer的方法都加了synchronized,所以是线程同步的,
- String不可变,StringBuffer和StringBuilder可变,体现在比如append()、insert()、delete()上。实例如下:
String library = "library";
String libraryNew = library+":图书馆";
System.out.println("library..." + library + "...libraryNew...."+libraryNew); library library:图书馆
StringBuffer libraryBuffer = new StringBuffer("library");
StringBuffer libraryNewBuffer = libraryBuffer.append(":图书馆");
System.out.println("libraryBuffer..." + libraryBuffer + "...libraryNewBuffer..." + libraryNewBuffer);
library:图书馆 library:图书馆
StringBuilder libraryBuilder = new StringBuilder("library");
StringBuilder libraryNewBuilder = libraryBuilder.append(":图书馆");
System.out.println("libraryBuilder..." + libraryBuilder + "...libraryNewBuilder..." + libraryNewBuilder);
library:图书馆 library:图书馆
持续更新中。。。。。