8.String str=“i“与 String str=new String(“i”)一样吗?

本文深入探讨了Java中String对象的内存分配机制。通过对比String str=i与String str=new String(i)两种初始化方式,揭示了常量池与堆内存的区别。前者在常量池中共享内存,避免重复创建;后者在堆内存中创建新对象,导致地址值不同,即使值相同。

不一样

因为内存的分配方式不一样。String str="i"的方式,Java 虚拟机会将其分配到常量池中;而 String str=new String(“i”)方式,则会被分到堆内存中。

    String str1 = "i";
	String str2 = "i";
	String str3 = new String("i");
	System.out.println(str1 == str2);//ture
	System.out.println(str2 == str3);//false

解释:

  • Java 虚拟机会将其分配到常量池中:常量池不会重复创建对象。

在String str1="i"中,把i值存在常量池,地址赋给str1。假设再写一个String str2=“i”,则会把i的地址赋给str2,但是i对象不会重新创建,他们引用的是同一个地址值,共享同一个i内存。

  • 分到堆内存中:堆内存会创建新的对象。

假设再写一个String str3=new String(“i”),则会创建一个新的i对象,然后将新对象的地址值赋给str3。虽然str3和str1的值相同但是地址值不同。

拓展:

堆内存用来存放由new创建的对象和数组。 在堆中分配的内存,由Java虚拟机的自动垃圾回收器来管理。

常量池指的是在编译期被确定,并被保存在已编译的.class文件中的一些数据。

`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]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值