String类创建对象

String类:


final表示不能被继承;


String类:

  • 代表字符串。

  • String类是一个final类,代表不可变的字符序列。

  • 字符串是常量,双引号引起来表示,他们的值在创建后不能更改。

  • String对象的字符内容是存储在一个字符数组value[]中的。


 

 

 


通过字面量的方式(区别于new)给一个字符串赋值,此时的字符串声明在字符串常量池中。

字符串常量池中是不会存储相同内容的字符串的。字符创常量池在方法区里。

当对字符串重新赋值时,需要重写指定内存区域赋值,不能使用原有的value进行赋值。

当对现有的字符串进行连接操作时,也需要重写指定内存区域赋值,不能使用原有的value进行赋值。

当调用string 的replace()方法修改指定字符或字符串时,也需要重新指定内存区域。

public static void main(String[] args) {
       String s1 = "abcd";
       String s2 = s1.replace("a","c");
       System.out.println(s1);//输出abcd
       System.out.println(s2);//输出cbcd
  }

 

 

 

 

 

 


因为String中涉及了堆栈方法区,特意补充:

 

 


 

 

上方结果出现原因:有变量名参与都相当于new,会在堆空间新开辟空间,而value值指向方法区常量池的字符串的地址。而常量和常量的拼接结果是在常量池中。

//在调用”ab”.intern()方法的时候会返回”ab”,但是这个方法会首先检查字符串池中是否有”ab”这个字符串,如果存在则返回这个字符串的引用,否则就将这个字符串添加到字符串池中,然会返回这个字符串的引用。
String s8 = s5.intern();//intern 返回s5在常量池中引用的javaEEhadoop
System.out.println(s3==s8);//true

 基本数据类型传递的是数据,引用数据类型传递的是地址值。

 

 上图为引用数据类型传递,传递的是地址。将ex.str的value指向的地址值传递给change方法中的str;ch[]数组也是如此传递。但String有不可变性,更改为"test ok"只能在常量池中重新开辟空间,而ch[]就被直接更改,输出为good和best。

posted @ 2021-07-15 15:00  Dudo1  阅读(208)  评论(0)    收藏  举报