如何理解String

如题所述

java中的字符串。 String类是不可变的,对String类的任何改变,都是返回一个新的String类对象。 String 对象是 System.Char 对象的有序集合,用于表示字符串。String 对象的值是该有序集合的内容,并且该值是不可变的。
String 是特殊的引用对象,可以不用new ,就可产生对象。
例如:
String a="abc";
String b="abc";
String c=new String("abc");
这里一共生成了两个对象。"abc"一个对象,new String()一个对象。
a,b,c都在栈区创建了引用,
a,b指向的是常量池中的"abc",new String的值指向的也是常量池中的abc;
※同一个字符串,只会创建一次。
例如:
String a="abc";
a=a+"d";
执行这个操作,实际上产生了3个对象,一个"abc",一个“d”,一个“abcd”。
只是当拼接完成之后,"abc",“d”都失去了引用,成为垃圾对象了。
实际我改变不是"abc"本身,而只是把引用指向了“abcd”;
※对字符串本身操作时,不是改变了对象本身,而是改变了引用。
温馨提示:内容为网友见解,仅供参考
第1个回答  2019-03-08

Java详解【String】推荐你一个博客看

String类是被final所修饰的,因此String类对象不可变,也不可继承。这里要注意一个误区,字符串对象不可变,但字符串变量所指的值是可变的,即引用地址可变。String变量存储的是对String对象的引用,String对象里存储的才是字符串的值【注意区分对象和对象的引用】


String的两种赋值方式

※ 区分【String str="HW"】和【String str=new String("HW")】

(1)字面量赋值方式     eg:String str = "Hello";

该种直接赋值的方法,JVM会去字符串常量池(String对象不可变)中寻找是否有equals("Hello")的String对象,如果有,就把该对象在字符串常量池中"Hello"的引用复制给字符串变量str,如若没有,就在堆中新建一个对象,同时把引用驻留在字符串常量池中,再把引用赋给字符串变量str。

用该方法创建字符串时,无论创建多少次,只要字符串的值(内容)相同,那么它们所指向的都是堆中的同一个对象。

该方法直接赋值给变量的字符串存放在常量池里

(2)new关键字创建新对象     eg:String str = new String("Hello");

利用new来创建字符串时,无论字符串常量池中是否有与当前值相同的对象引用,都会在堆中新开辟一块内存,创建一个新的对象。

相似回答