String x = "abc" 和 String x = new String("abc")有什么区别?

本文详细解析了Java中字符串常量池的工作原理。通过具体的代码示例,展示了当使用直接赋值与new关键字创建字符串时,常量池是如何处理这些操作的。这有助于理解字符串对象的内存分配和引用比较。
如果是String x = "abc";编译器首先会在常量池中寻找有没有"abc"这个字符串,如果有则直接从常量池中取,不会new,如果常量池中没有,则会new一个,并将"abc"存放到常量池中。

而String x= new String( "abc");则编译器直接new一个字符串,不会到常量池中查询。

所以:
String x1= "abc";
String x2= "abc";//x1是"abc",常量池中已经有了"abc",所以x2直接从常量池中取
String x3 = new String("abc");
String x4 = new String("abc");

System.out.println(x1 == x2);//true
System.out.println(x2 == x3);//false
System.out.println(x3 == x4);//false
### 代码含义分析 - `String s = new String("abc");`:使用 `new` 关键字创建一个 `String` 对象。这里的 `"abc"` 是一个字符串字面量,`new String("abc")` 会在堆内存中创建一个新的 `String` 对象,该对象的内容是 `"abc"`,并将该对象的引用赋值给变量 `s`。 - `String S1 = "abc";`:在栈内存中创建一个引用变量 `S1`,然后检查字符串常量池中是否已经存在 `"abc"` 这个字符串对象。如果存在,`S1` 直接指向常量池中的 `"abc"` 对象;如果不存在,则在常量池中创建一个 `"abc"` 对象,再让 `S1` 指向它。 - `String S2 = "abc";`:同样在栈内存中创建一个引用变量 `S2`,由于常量池中已经存在 `"abc"` 对象(前面 `S1` 已经检查过),所以 `S2` 直接指向常量池中的 `"abc"` 对象。 ### 内存分配情况 - **`String s = new String("abc");`**: - 首先检查字符串常量池,如果常量池中没有 `"abc"`,则在常量池中创建一个 `"abc"` 对象。 - 然后在堆内存中创建一个新的 `String` 对象,该对象的内容是 `"abc"`,并将该对象的引用赋值给变量 `s`。所以这里可能创建了 1 个或 2 个对象,取决于常量池中是否已经存在 `"abc"`。 - **`String S1 = "abc";`**: - 在栈内存中创建一个引用变量 `S1`。 - 由于前面已经检查过常量池,所以这里不会再创建新的 `"abc"` 对象,`S1` 直接指向常量池中的 `"abc"` 对象。 - **`String S2 = "abc";`**: - 在栈内存中创建一个引用变量 `S2`。 - `S2` 同样直接指向常量池中的 `"abc"` 对象。 ### 代码示例验证 ```java public class StringMemoryAnalysis { public static void main(String[] args) { String s = new String("abc"); String S1 = "abc"; String S2 = "abc"; System.out.println(s == S1); // false,s 指向堆中的对象,S1 指向常量池中的对象 System.out.println(S1 == S2); // true,S1 S2 都指向常量池中的同一个对象 } } ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值