Java中的字符串常量池、StringBuilder和StringBuffer介绍(字符串常量池面试题)


前言

文本主要介绍Java中的字符串常量池的相关知识,以及StringBuilder和StringBuffer的区别。


一、字符串常量池

1.什么是字符串常量池?

字符串可通过初始化方式直接创建。
如:

public static void main(String[] args) {
    
    
 String s1 = "hello";  //直接创建
 String s2 = "hello";
 System.out.println(s1 == s2); // true
}

结果:S1==S2,即两个字符串指向的是同一个对象。
对于引用数据类型,==比较的是地址。
问题:为什么S1与S2的地址相等?

(1)字符串常量池:为了避免产生大量的字符串对象,使程序代码运行速度更快、更节省内存。java设计了一个字符串池(String Pool),将1, 2,“hello”等频繁使用的字面类型常量存入其中。
字符串常量池在JVM中是StringTable类,实际是一个固定大小的HashTable。 不同JDK版本下字符串常量池的位置以及默认大小。
在这里插入图片描述
(2)注意:
在这里插入图片描述

2.String类中两种对象实例化的区别

String s1 = "hello";//第一种
String s2 = new String("hello");//第二种

第一种:只会开辟一块堆内存空间,保存在字符串常量池中,然后s1共享常量池中的String对象。
第二种:会开辟两块堆内存空间,字符串"hello"保存在字符串常量池中,然后用常量池中的String对象给新开辟的String对象赋值。

3.其他常量池

Class文件常量池: 每个Java源文件编译后生成.Class文件中会保存当前类中的字面常量以及符号信息。
运行时常量池: 在.Class文件被加载时,.Class文件中的常量池被加载到内存中称为运行时常量池,运行时常量池每个类都有一份。

4.字符串常量池面试题

(1)String s = new String(“hello”) 创建多少个对象?

① 1个字符串常量池:“hello”
② 1个在堆上创建对象:new String(“hello”)
③ 1个s引用(将对象的值赋值给s)
一共创建 :3个对象

(2)String s = new String(“A”+“B”) ; 创建多少个对象?

① 3个字符串常量池:“A”,“B”,“AB”
② 1个在堆上创建对象:new String(“AB”)
③ 1个s引用(将对象的值赋值给s)
一共创建 :5个对象

(3)String s = new String(“ABC”) + “ABC” ; 创建多少个对象?

① 1个字符串常量池:“ABC”
② 1个在堆上创建对象:new String(“ABC”)
③ 1个s引用(将对象的值赋值给s)
一共创建 :3个对象


二、StringBuilder、StringBuffer

(1)由于String是一种不可变对象,其字符串中的内容时不可改变的。
注意: 所有涉及到String类可能修改字符串内容的操作都是创建一个新对象,改变的是新对象。
(2)为了方便字符串的修改,Java中又提供StringBuilder和StringBuffer类。
与String 类不同,StringBuffer 、StringBuilder 类的对象能够被多次修改,并且不产生新的未使用对象

1. StringBuilder

以下介绍StringBuilder的常用方法:
在这里插入图片描述
注意:
① String和StringBuilder类不能直接转换。如果要想互相转换,可以采用如下原则:
② String变为StringBuilder: 利用StringBuilder的构造方法或append()方法
③ StringBuilder变为String:调用toString()方法。

2.String、StringBuffffer、StringBuilder的区别

① String的内容不可修改,StringBuffffer与StringBuilder的内容可以修改。
② StringBuffffer与StringBuilder大部分功能是相似的 。
③ StringBuffffer采用同步处理,属于线程安全操作;而StringBuilder未采用同步处理,属于线程不安全操作


总结

以上就是本文的全部内容。

猜你喜欢

转载自blog.csdn.net/m0_53689542/article/details/124561774
今日推荐