String的源码阅读
主要依赖于ArrayList
、Arrays
、Comparator
、StringJoiner
和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.copyOf
和System.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对象的时候,就返回这个字符串对象。否则这个对象就会添加到常量池,并且返回这个对象的引用。