面试对线记录5 String详解

前几天和面试官对线时,面试官问了我一个问题,String类型常用方法有哪些,讲真哈,我平时用idea习惯了,早就不记得这些方法了,,,,丢人呀,所以在这里记录一下 String类型常用方法如下:

indexOf():返回指定字符的索引。
charAt():返回指定索引处的字符。
replace():字符串替换。
trim():去除字符串两端空白。
split():分割字符串,返回一个分割后的字符串数组。
getBytes():返回字符串的 byte 类型数组。
length():返回字符串长度。
toLowerCase():将字符串转成小写字母。
toUpperCase():将字符串转成大写字符。
substring():截取字符串。
equals():字符串比较。

这些函数中我基本都用过,这些意思大概都知道,也没什么好说的,下面我就扩展一下,讲一讲String这个类型。 在这里要说是的,String这个类型是不可变的。因为在idea中看源码的话,我们可以看到String继承了Serializable, Comparable, CharSequence,被final修饰,被final修饰的话说明该类不能被继承,内部的核心是一个被final修饰的char数组,被final修饰后的字段创建后不可变,but这是个数组奥(数组的老巢都在堆区中),只是说明地址不会变,但是地址上对应的数据还是会变的,所以这个数组被sun公司的程序员铁铁用private修饰,使得不向外暴露这个数组,并且用final严禁继承,简直是天衣无缝。。。。 我在网上查了很多种原因,总的说来大概就是由结果推断的原因。。。按照我的理解吧,这几种原因有以下几种:

  1. 避免安全问题 简单的来说,主要是String类型的数据在很多场景下用的很多,比如网络地址url,文件地址path以及Java很强大的反射机制的String参数等等,如果这些参数可变的话,那就会引起很重的安全问题。进而来说的话,我们储存密码的时候,非常不建议用String类型接收,因为String类型的所有对象会一直留在字符串缓冲池中,一直到gc把它给清除掉。这样子会有很大的安全隐患。
  2. 加快字符串处理速度 因为String类型时不可变的,所以也就保证了hashcode的唯一性,所以我们在创建String类型时不用重新计算hashcode,这样子速度就很快,比如Map中就很喜欢用String当作key。 3.便于实现字符串池 因为在Java中设计了一个字符串池,会在堆空间中开辟一块存储空间来做字符串池,如果不创建这个池子的话,那么我们每声明一个就会创建一个String对象,这样子很是浪费空间和降低速度,有了字符串池以后,我们就可以在创建对象之间在池子中找找是否之前创建过这个对象,这样子就加快速度,节省cpu时间,这一切都建立在字符串不可变的情况下,如果可变了,那池子就失效了。。。