java基础复习--String类

1、String类初始化之后是不可变的。String 类是final类。也意味着String类不能被继承,并且它的成员方法默认都是final方法。在Java 中被final 修饰的类是不允许被继承,并且该类中的成员方法都默认为final,final 方法不允许被重写。

2、String 用final修饰的原因,主要为了安全性和效率的缘故:
(1、由于String类不可变,所以就不会被修改,这就避免了多线程竞争的线程安全问题
(2、String类在程序中出现得出频率较高,为了避免安全隐患,在它每次出现时都用final来修饰,如果使用当,显然会出现性能问题,所以直接将String 类定义为 final 类,放在常量池中实现数据共享,节省了资源,提高了效率,可以在jvm 里面做很多优化(static final 修饰的变量所在类不用初始化就可以直接使用变量)。

3、String 类实际上是通过char 数组来保存字符串的。

4、String 对象一旦被创建就是固定不变的,对String 对象的任何改变都不影响到原对象 。任何先关的改变字符串的操作都会生成新的对象。

5、字符串常量池:字符串常量池的优点是避免相同内容的字符串的创建,节省来看内存,提升了性能。
每次创建字符串常量时,JVM 首先会检查字符串常量池,如果该字符串已经存在于字符串常量池中,那么就直接返回常量池中的实例引用。如果字符串不存在在常量池中,就会实例化该字符串并将其放到常量池之中。
Java常量池分为两种,静态常量池和动态常量池。
静态常量池就是.class 文件中的常量池,class 文件中的常量池不仅仅包含字符串(数字)字面量,还包含类、方法的信息,占用了class 文件的大部分空间。
运行时常量池,则是jvm 虚拟机在完成类装载操作之后,将class 文件中的常量池载入到内存中,并保存在方法区里面,我们常说的常量池就是方法区中运行时常量池。

6、字符串的创建方式
(1、 单独使用双引号创建的字符串都是常量,编译器就已经确定并且存储到字符串常量池中了。
(2、使用new String(" ") 创建的对象会存储到heap 中,是运行期新创建的,new 创建字符串时,首先查看常量池中是否有相同值的字符串,如果有,则拷贝一份到堆中,然后返回堆中的地址,如果池中没有,则在堆中创建一个,然后返回堆中的地址,并且再常量池中也创建一个对象。

7、String 、StringBuffer、StringBuilder的联系与区别
(1、String 是不可变的, StringBuffer 和 StringBuilder 是可变的(其内部字符串数组是可变的)。
(2、String变量是不可变的,是常量,自然是线程安全的,StringBuffer 和 StringBuilder 中的方法和功能完全是等价的,只是StringBuffer中的方法大都采用了synchronized 关键字进行修饰,因此是线程安全的,而StringBuilder 没有这个修饰,可以被认为是非线程安全的。
所以就执行效率而言,StringBuilder > StringBuffer > String , 这个是相对而言的,不一定在所有情况下都是这样。
String:适用于少量字符串操作的情况。
StringBuiler: 适用于单线程,大批量操作的情况。
StringBuffer: 适用于多线程,大批量操作的情况。

8、String 中的final 用法和理解
final 只对引用的“值“ (即内存地址)有效,它迫使引用只能指向初始化指向的那个对象,改变它的指向会导致编译期出错。至于它所指向的对象的内容值变化,final 是不负责的。

猜你喜欢

转载自blog.csdn.net/weixin_43352448/article/details/87918910