String str=new String("a")和String str = "a"有什么区别?

本文解析了 Java 中使用 new String 和直接赋值创建 String 对象的区别。详细介绍了内存分配和对象引用的情况,并说明了这两种方式如何影响字符串的复用。

 

问:String str=new String("a")和String str = "a"有什么区别? 

答:String str = "a"; 这个只是一个引用,内存中如果有“a"的话,str就指向它;如果没有,才创建它;
  如果你以后还用到"a"这个字符串的话并且是这样用:
  String str1 = "a"; String str2 = "a"; String str2 = "a"; 这4个变量都共享一个字符串"a"。
  而String str = new String("a");是根据"a"这个String对象再次构造一个String对象,将新构造出来的String对象的引用赋给str

`String str="a"``String str=new String("a")`不一样。 `String str="a"`是将常量池中的字符串对象“a”的引用赋给变量`str`,如果常量池中已经存在“a”这个字符串,就不会再创建新的对象,而是直接复用已有的对象。 `String str=new String("a")`则是在运行时,通过`String`类的构造器在堆内存中创建一个新的空间,用以存储常量池中“a”的复制,然后再在栈内存中开辟一个名为`str`的空间,用来存放堆内存中“a”的地址。也就是说,每次使用`new String("a")`都会创建一个新的对象,即使值相同,对象的地址也不同。 这两者有以下区别: - **对象创建**:`String str="a"`可能不会创建新对象,而`String str=new String("a")`一定会创建新对象。例如,若再有`String str2="a"`,`str``str2`会指向同一个常量池中的对象;而若有`String str3 = new String("a")`,`str``str3`是不同的对象[^1][^2][^4]。 - **地址比较**:使用`==`比较引用类型时,比较的是地址值是否相同。所以`String str="a"``String str=new String("a")`使用`==`比较会返回`false`,因为它们的地址不同。例如: ```java public class Main { public static void main(String[] args) { String str1 = "a"; String str2 = new String("a"); System.out.println(str1 == str2); // 输出 false } } ``` - **内容比较**:`String`类重写了`equals()`方法,用于比较内容是否相同。所以使用`equals()`比较`String str="a"``String str=new String("a")`会返回`true`,因为它们的内容都是“a”。例如: ```java public class Main { public static void main(String[] args) { String str1 = "a"; String str2 = new String("a"); System.out.println(str1.equals(str2)); // 输出 true } } ``` - **哈希码**:虽然它们的内容相同,但由于是不同的对象,所以哈希码可能不同(尽管`String`类的哈希码是根据内容计算的,但不同对象可能在不同的内存位置,哈希码计算可能有不同的起始点等因素),不过在`String`类中哈希码通常是根据内容计算的,所以这两个对象的哈希码是相同的,但本质上它们还是不同的对象[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值