String

作者: isuntong | 来源:发表于2020-02-25 13:43 被阅读0次
三大核心机制

不变性、常量池优化、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了,其他类型还要计算。

相关文章

网友评论

      本文标题:String

      本文链接:https://www.haomeiwen.com/subject/xwmzqhtx.html