三大核心机制
不变性、常量池优化、final
不变性:是一个immutable(不变模式)模式的对象,不变模式的主要作用是当一个对象需要被多线程共享并频繁访问时,可以保证数据一致性(每次修改都创建新对象)
常量池优化:String对象创建之后,会在字符串常量池中尽心缓存,下次创建同样的对象时,会直接返回缓存的引用
final:String类不能被继承,提高了系统的安全性
String不是基本数据对象
String实例化有两种方式:
- 直接赋值
- 通过构造函数,可以直接将字符串的值传入,也可以传入一个char数组
String str = "Hello";
String str2 = new String("Hello");
char[] chars = {'你','好'};
String str3 = new String(chars);
直接赋值存在字符串常量池
new存在堆内存中

直接赋值会在常量池中招,然后创建,常量池同样会有地址,第二次就直接引用这个地址了,所以直接赋值,二者相同
new的话,会在堆内存开辟空间,存的Hello,然后将引用指向堆内存地址,第二次来还是会来创建。同时常量还会被放在常量池中,相当于创建了两个对象
equals() 方法
equals方法 原生是双等号判断,String重写了equals方法
将String转换成char数组,然后逐个判断
String的不可变
String str5 = new String("Hello");
String str6 = str5;
System.out.println(str5 == str6);
str5 = str5 + "World";
System.out.println(str5 == str6);
打印true、false
值一修改就变成了新对象了
intern方法
String str7 = "Hello";
String str8 = new String("Hello");
System.out.println(str7 == str8);
System.out.println(str7 == str8.intern());
打印false、true
当调用某个字符串的intern方法时,回去字符串常量池中寻找,如果已经存在一个值相等的字符串对象的话,则直接返回该对象的引用。如果不存在,则在字符串常量池中创建该对象,并返回。
Arrays.toString(array);
可以打印数组
问题1
String str9 = "HelloWorld";
String str10 = "Hello"+"World";
System.out.println(str9 == str10);
打印的是true,字面值可拼接
String str11 = "HelloWorld";
String str12 = "Hello";
str12 += "World";
System.out.println(str11 == str12);
打印false,因为直接赋值是在String常量池中,如果修改了就会返回一个新的对象
变量和常量拼接,存在堆里面
String str13 = "Hello";
String str14 = "World";
str14 = "Hello";
System.out.println(str13 == str14);
这样打印的就是true
String str15 = "HelloWorld";
final String str16 = "Hello";
String str17 = str16 + "World";
System.out.println(str15 == str17);
j加上final使其变成常量,这样常量和常量拼还是存在常量里
String str18 = "HelloWorld";
final String str19 = new String("Hello");
String str20 = str19 + "World";
System.out.println(str18 == str20);
打印false,因为final修饰也是个堆内存
什么是字符串常量池
String是线程安全的吗
类不可变,值不可改变,实例可以被多个线程共享,修改只会new一个类
在使用Hashmap时,用String做key有什么好处
key通过hashcode确定位置,String是不可变的,创建的时候HashCode值就缓存下来了,后续操作就不用计算HashCode了,其他类型还要计算。
网友评论