目录
1. concat 和 “+” 的区别
从底层代码来看,区别在于:
(1)使用"+"号会将字符串转换为StringBuilder,然后执行连接操作,最后将StringBuilder转换回String。StringBuilder具有一个大小为16的数组空间,用于执行a和b的连接运算,这会占用更多内存,但内存效率更高。
(2)而使用concat方法则是利用System.array_copy来产生一个新的字节数组,该数组的长度为两个字符串的和,用于存储数据。Concat占用的内存空间较少,但效率并不一定更高。
2. indexOf 和 lastIndexOf
IndexOf方法用于正向输出字符在字符串中的索引,
lastIndexOf方法则用于倒序输出字符在字符串中的索引。
3. endsWith 和 startsWith
startsWith方法用于判断字符串的开头内容,对文件管理及命名问题有帮助,特别是在进行文件操作时(例如sd1、sd2、sd3)。
endsWith方法则用于判断字符串的结尾内容,类似于文件打开操作中通过后缀名来确定文件类型。
4. equals 和 hashCode
Equals方法用于判断两个字符串的值是否相等,但其效率并不高,因为其底层源码是使用for循环实现的。
hashCode方法返回一个哈希值。在String中,对元素进行算法,得到一个hashCode值。如果两个值的hashCode相等,那么这两个值可能相等。对于String中的每个元素,其hashCode算法是将每个元素的字节加上31乘以前一个元素的哈希值,而默认情况下,前一个元素的哈希值为0。在比较字符串是否相等时,最科学的方法是先比较hashCode,然后再比较equals方法。使用hashCode进行switch比较的效率会非常高。
5. length() 和 charAt()
在Java中使用StringBuilder来执行字符串相关的操作。存储的值’a’被视为一个对象来存储。使用new String()创建的对象是一个地址,底层的char[]数组value也是一个地址。最后,合成字符串"ab"的是一个char数组,这个对象是"ab",没有使用new关键字。
length()方法对字符串来说是一个方法,对于数组来说是一个属性。字符串的方法调用了数组的属性。
6. substring() 子串
使用Substring方法来获取子串,需要指定起始位置和结束位置,即startIndex和endIndex。区间为左闭右开,即底层的操作是endIndex减去startIndex,因此不包含endIndex位置的字符。实际底层操作是从startIndex开始取几个字符,并不是取从startIndex到endIndex位置的字符。