String的源码阅读

主要依赖于ArrayListArraysComparatorStringJoiner和nio包的Charset类。

Java程序中所有的字符串字面量都是由该类的实例来实现的。

正因为String对象是不可变的,所以他们在多线程下可以共享,是线程安全的。

String 方法不可以把null作为参数去构造对象,会造成NullPointerException异常。

String类是用final修饰的,表示其不可被继承。内部实现主要是final char vale[]

  • String的构造函数其实内存就是参数的复制或者Arrays.copyOfRange()实现的。
equals()方法

首先先判断是不是同一个对象,是返回true。如果不是同一个对象的话,判断长度是否相等,接着逐个对比字符,如果都相等的话,那么就会返回true,否则返回false。

compareTo()方法

比较字符串大小,先取较短字符串长度,遍历短长度,如果字符不想等,返回相减的值。大于0,前一个大,小于0,参数内字符串大。都相等,比较二者谁更长。

String内部类CaseInsensitiveComparator实现了大小写不敏感的字符串的比较。和原字符串比较的代码相比,添加tolowercase统一转化为小写,再进行比较。

regionMathches()方法

获得char[] 数组和偏移点,判断越界信息,接着在范围内逐个比较,不等返回false;全部相等返回true。

startwith判断前缀函数,实现和regionMatches方法类似。

hashcode()方法

将每个字符✖31再加上当前字符的ascii编码值。

indexOf(int)方法与lastindexOf(int)方法

找寻ascii值与字符串数组值相同的值,返回其下标索引。

  • unicode前10位和后10位。

lastindexOf()从后往前数,找到最后一个数组内ascii码相同的数值。

indexOf(找到相同的字串KMP算法)
subString()方法

查看参数是否为0,为0返回原来字符串,否则用String内部构造函数的方法,新构造一个字符串,并返回新字符串。

concat()方法

底层采用Arrays.copyOfSystem.copyOf的方法

contains()方法

判断子序列是否存在,用的是indexOf方法。

split()方法
list.subList(0, resultSize).toArray(result);

可以实现从ArrayList转为数组。很好用,仅适用于包装类。

trim()方法

裁剪掉左右两端ascii码小于32的字符。小于32的为非打印字符,32的为空格。

join()连接多个字符串

底层还是用StringBuilder()方法

tolower和toupper方法

用的是Character的tolower和toupper方法。

valueOf()静态方法

将其他类型转化为字符串类型。

intern()方法

这个方法是本地方法。char是通过构造的方式,而boolean变量是通过三元表达式转换。

当调用intern方法的时候,如果常量池包含了这个String对象的时候,就返回这个字符串对象。否则这个对象就会添加到常量池,并且返回这个对象的引用。