String 代表不可变的字符序列(笔记)


  • String 类型 常量池, 唯一一个可以直接String t1 = “abc” 而不需要new 的类,自面量的概念,常量池,String
    a1= “abc” 和String a2 = “abc” a1 和 a2 是使用同一块内存的,都是abc。
  • 当对现有的字符串进行重新操作的时候,需要新指定新的内存区域进行赋值,不能在原有的基础上进行赋值。
  • String a = “abc” a += “def”;现在的a和原来的a不在同一块内存区域。但是现在的a指向了新的区域。a现在的值是abcdef
  • 不可以在原来的内存区域上进行修改,这就是String的不可变性。
  • String 也可以使用new 的方式进行赋值,String s1 = new
    String()(毕竟String也是一个类啊!!!但是被final修饰了。)本质上this.value = new char[0].

 String str1 = “abc”   String str2 = new String(“abc”)  String str3 = new String(“abc”) 

  1. str1是通过字面量的方式进行定义的。此时的str1是声明在方法区中的字符串常量池中的。
  2. str2是使用new 构造器的方式进行声明的,是数据在堆空间中开辟新的空间。 str2 和 str3
  3. 的abc值存放在堆空间中,在栈中存放的是两个abc的地址。
    java基础——对String的理解_常量池
    String s = new Strng (“abc”)创建了几个对象。
    一个是堆空间中new 的结构,另一个是char[]对应的常量池中的数据“abc”

java基础——对String的理解_常量池_02

结论:
s3 和 s4 是相当于字面量的连接 所以是true,只要有变量名参与了,此时就不是在常量池中了。需要在堆空间中创建新的变量。(相当于new)

String s8 = s5.intern();

s3 == s8 //true

只要调用了intern方法返回的值就一定要在常量池中声明。

所以s3 的地址和s8 一样。