1. String两种实例化方式
- 字符串常量实例化,new String()构造实例化。
- 两种实例化方式都尝试首先去String常量池中拿值。拿不到再重新开辟堆内存和String常量池内存。直接实例化的方式对于String常量池中的同一个对象不再重新开辟堆内存,new构造方法的方式每次都会重新开辟堆内存,但是对于String常量池中的同一个String对象不会重新开辟String常量池内存。
- 字符串常量是匿名的String对象。
- 注意String的设计不同于其他类型,它采用String常量池的设计方式,有效的节省了String的内存消耗,因为任何方式开辟的String对象的值都永远存放在String常量池中:
String str1="abc"; String str2="abc"; String str3=new String("abc");
如下图:
- java中常见的常量池有3种:
(1) class常量池:保存编译期间就确定的常量,即final类型的;
(2) 运行时常量池:在JVM运行期间保存从class常量池中复制过来的副本;
(3) String常量池:字符串独有的设计,就是因为它的操作很频繁且内存消耗过大。
2. String和基本包装类型不可变
- String 类的内容一旦声明则不可变,只能重新创建String实例。
- String字符串的内容一旦声明则不可变,除了8大基本包装类型和Sring的内容不可变,其他的引用类型内容几乎都是可变的,通过引用操作 。
即String和8大基本包装类型其堆内存空间里的值不能被修改,因为String和8大基本包装类型的成员和类被JDK团队设计成了final类型的常量,所以只能重新开辟堆内存空间保存新的值。
而其他引用类型的设计确保了同一块堆内存空间中的值是可以被修改的。
3. java中的equals()和==的区别
- 变量分为基本变量和引用变量,基本变量中直接存放的就是当前变量的值,而引用类型的变量中存放的是指向其堆内存空间的地址,即引用;
- 所以==永远比较的都是当前变量的值,对于引用类型来说需要使用equals()比较堆内存中的内容。
- 总的一句话:分清楚变量和对象实体;分清楚初始化变量和实例化对象,则很多问题迎刃而解!
4. String和StringBuffer的区别
- String类型的变量一旦声明、其变量内容(注意是内容,指的是对象实体)将不会改变,之所以不会改变是因为任意一个字符串都是一个String类的匿名对象且成员被设计成了final类型,只要String对象的值一改变就相当于重新开辟了一块内存空间;
- StringBuffer类声明的对象也可以定义字符串,但是StringBuffer类中声明的字符串是可以改变的,而不会重新开辟内存空间,因为它采取了缓冲区的机制。
StringBuffer是线程安全的类;(效率偏低)
StringBuilder是非线程安全的类;(效率高)
5. String、StringBuffer、StringBuilder三者区别和联系汇总
这三个类的区别主要体现在两个方面,即运行速度和线程安全这两个方面。
执行速度:
StringBuilder>StringBuffer>String。
String最慢的原因:
String为字符串常量,而StringBuffer和StringBuilder均为字符串变量,即String对象一旦创建之后其内容不是能改变的,如果改变,改变的也是String对象的引用地址的指向,但是后两者一旦创建其内容是可以改变的,所以StringBuffer和StringBuilder对对象进行操作是直接通过地址改变对象实体的,不用每次多开辟内存空间和回收,所以速度优于String。线程安全方面:
StringBuilder是非线程安全的类,而StringBuffer是线程安全的类。
StringBuffer和StringBuilder中都存在成员变量,而是在多线程环境中我们在使用这两个对象的时候都会存在不安全的隐患;但是如果一个StringBuffer对象在字符串缓冲区中被多个线程对象使用时,StringBuffer中的很多方法都带有的Synchronized关键字,保证了多个线程对象对共享成员变量的线程安全操作;但是StringBuilder则没有Synchronized关键字,所以对于StringBuilder的多线程操作不能保证其线程安全性。
所以要进行的操作是多线程环境下,建议使用StringBuffer;如果是单线程环境下建议使用速度较快的StringBuilder;
总结:
String:适用于少量的字符串操作的情况;
StringBuilder:适用于单线程环境下在字符串缓冲区进行大量字符串操作的情况;
StringBuffer:使用于多线程环境下字符串缓冲区进行大量操作的情况。
文档信息
- 本文作者:Marshall