文章目录
- 字符串常量池
- intern方法
- 面试题
- 字符串常量池(StringTable)
为了提升性能和减少内存开销,避免字符串的重复创建,JVM维护了一块特殊的内存空间,就是字符串常量池。字符串常量池由String类私有的维护
Java中有两种创建字符串对象的方式:
- 直接使用字符串常量进行赋值
public class Test {
public static void main(String[] args) {
String s1 = "hello";
String s2 = "hello";
System.out.println(s1==s2);
}
}
//运行结果:true
- 通过new创建String类对象
public class Test {
public static void main(String[] args) {
String s1 = "hello";
String s2 = "hello";
String s3 = new String("hello");
String s4 = new String("hello");
System.out.println(s3==s4);
//运行结果:false
}
}
一道题:
//下面代码将输出什么内容:()
public class SystemUtil{
public static boolean isAdmin(String userId){
return userId.toLowerCase()=="admin";
}
public static void main(String[] args){
System.out.println(isAdmin("Admin"));
}
}
- intern方法
该方法的作用是手动将创建的String对象添加到常量池中
public class Test {
public static void main(String[] args) {
char[] chars = new char[]{'h','e','l','l','o'};
String s1 = new String(chars);
//s1.intern();
String s2 = "hello";
System.out.println(s1==s2);
}
//运行结果:false
}
因此输出:false
public class Test {
public static void main(String[] args) {
char[] chars = new char[]{'h','e','l','l','o'};
String s1 = new String(chars);
s1.intern();
String s2 = "hello";
System.out.println(s1==s2);
}
//运行结果:true
}
- 面试题
请解释String类中两种对象实例化的区别(JDK1.8中)
String str = "hello"
只会开辟一块堆内存空间,保存在字符串常量池中,然后str共享常量池中的String对象
String str = new String("hello")
会开辟两块堆内存空间,字符串"hello"保存在字符串常量池中,然后用常量池中的String对象给新开辟的String对象赋值
String str = new String(new char[]{'h', 'e', 'l', 'l', 'o'})
现在堆上创建一个String对象,然后利用copyof将重新开辟数组空间,将参数字符串数组中内容拷贝到String对象中