风一样的过往 2022-03-05 21:48 采纳率: 100%
浏览 36
已结题

说说String str =new String("123") 与String str = "123"的不同

大家看看一下代码:

public class Main {

public static void main(String[] args) {
String str1 = new String("123456");
String str2 = new String("123456");
    System.out.println(str1 == str2);
}

}

输出结果为false(我知道是因为"=="符号比较的是str1与str2的空间存储位置,因为分配了两个空间存储·,所以输出false)

大家再看看这个代码

public class Main {

public static void main(String[] args) {
String str1 = "123456";
String str2 = "123456";
    System.out.println(str1 == str2);
}

}
输出结果为true,按我的理解就是这里没有new String()对象,而"123456"这个对象是系统分配分配空间的,只是把"123456"对象初始化str1和str2,也就是str1和str2引用了"123456";

大家对下面的代码有什么理解,欢迎帮我指导指导,感谢!

  • 写回答

2条回答 默认 最新

  • 小钊丶 2022-03-05 22:15
    关注

    其实博主你的理解已经差不多接近正确了。
    是用new来创建的话,每new一次都会在内存中开辟一个新的内存区域,所以第一个图str1和str2在内存中的地址是不同的,所以输出为false。
    第二个图直接将字符串赋值给变量的话,就需要了解字符串缓存机制程序。字符串赋值给变量时,先从缓存池中查找是否有相同的字符串对象,如果有的话就不会重新生成而是用缓存池中的字符串对象;如果在字符串缓存池中没找到相同的字符串对象时才会在内存中开辟一块内存区新建字符串对象。对于str1,当str1建立以后会将“123456”字符串放入缓存池中,所以运行 String str2 = "123456"的时候就会直接从缓存池中取出相同的对象,也就说,str1和str2的地址都是一样的,所以是true。
    哈哈以上是我的一些理解,如果有什么地方有疏漏,欢迎指正交流。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 3月13日
  • 已采纳回答 3月5日
  • 创建了问题 3月5日

悬赏问题

  • ¥15 在不同的执行界面调用同一个页面
  • ¥20 基于51单片机的数字频率计
  • ¥50 M3T长焦相机如何标定以及正射影像拼接问题
  • ¥15 keepalived的虚拟VIP地址 ping -s 发包测试,只能通过1472字节以下的数据包(相关搜索:静态路由)
  • ¥20 关于#stm32#的问题:STM32串口发送问题,偶校验(even),发送5A 41 FB 20.烧录程序后发现串口助手读到的是5A 41 7B A0
  • ¥15 C++map释放不掉
  • ¥15 Mabatis查询数据
  • ¥15 想知道lingo目标函数中求和公式上标是变量情况如何求解
  • ¥15 关于E22-400T22S的LORA模块的通信问题
  • ¥15 求用二阶有源低通滤波将3khz方波转为正弦波的电路