Java中,这个基础问题怎么解决?

秋天种树 2020-04-12 11:26:32
有懂的大神吗?内存中发生了什么事情? 详细的来,不懂的也乱答 String a = new String("A"); String a ="A"; 这两个区别,图片中为什么答案是这样。 不要用旧的JDK知识回答
...全文
234 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
ywfpclt 2020-04-14
  • 打赏
  • 举报
回复
引用 3 楼 dkwuxiang 的回复:
没有一个解释的;
// ① 堆内存中会 出现  变量a4_1(地址为Da41值为AA)  ,a4_2 (地址为Da42值为BB), a4(地址为Da4值为 AABB)
		// 常量池中出现 AA(Ca41), BB(Ca42)
		String a4 = new String("AA") + new String("BB");
		// intern() 会先判断 常量池中是否已存在 AABB, 如果存在 返回 常量池中AABB 的地址,如果不存在,将AABB(a4)写入常量池 地址为 a4 的内存地址
		a4.intern();
		// a5 直接指向 常量池中  AABB 的地址,a5(地址a4)
		String a5 = "AABB";
		// 此时 a4 a5 的内存地址相同
		System.out.println(a4 == a5); // true
		
		// new String() 重新开辟内存地址 a6 (Da6)
		String a6 = new String("AA");
		// 先判断  发现 AA 已经存在于常量池 (① 中 AA 已被写入常量池)
		a6.intern();
		// 指向 常量池中的 AA (a41)
		String a7 = "AA";
		System.out.println(a6 == a7); // false
		String a1 = new String("AA") ;
		a1.intern();
		String a2 = "AA";
                System.out.println(a1 == a2); //为什么会是false呢?
dkwuxiang 2020-04-14
  • 打赏
  • 举报
回复
引用 6 楼 ywfpclt 的回复:
[quote=引用 3 楼 dkwuxiang 的回复:] 没有一个解释的;
// ① 堆内存中会 出现  变量a4_1(地址为Da41值为AA)  ,a4_2 (地址为Da42值为BB), a4(地址为Da4值为 AABB)
		// 常量池中出现 AA(Ca41), BB(Ca42)
		String a4 = new String("AA") + new String("BB");
		// intern() 会先判断 常量池中是否已存在 AABB, 如果存在 返回 常量池中AABB 的地址,如果不存在,将AABB(a4)写入常量池 地址为 a4 的内存地址
		a4.intern();
		// a5 直接指向 常量池中  AABB 的地址,a5(地址a4)
		String a5 = "AABB";
		// 此时 a4 a5 的内存地址相同
		System.out.println(a4 == a5); // true
		
		// new String() 重新开辟内存地址 a6 (Da6)
		String a6 = new String("AA");
		// 先判断  发现 AA 已经存在于常量池 (① 中 AA 已被写入常量池)
		a6.intern();
		// 指向 常量池中的 AA (a41)
		String a7 = "AA";
		System.out.println(a6 == a7); // false
		String a1 = new String("AA") ;
		a1.intern();
		String a2 = "AA";
                System.out.println(a1 == a2); //为什么会是false呢?
[/quote] 可以这么理解 所有出现在 “ ”之间的 字符 ,jvm都会将其写入 字符常量池
dkwuxiang 2020-04-14
  • 打赏
  • 举报
回复
我上面已经解释过了, a1 是指向 堆中的内存地址 D-a-1 a1.intern() 时,发现 AA 在 常量池中已经存在了,不会将 AA 的地址指向 a1 String a2 = AA ; a2 的内存地址是 常量池中 AA 的地址 和a1 堆中的地址是不相等的
46311062 2020-04-13
  • 打赏
  • 举报
回复
关于第一个问题:new的意思是在内存中新开辟一块字符串,新开辟的字符串值为"A",然后把新字符串的值---A,赋给a;
而String a="A"意为直接给a赋值为"A";

下面的问题是这样的:"=="比较的是储存地址;因为a4中已经开辟了AA的内存,所以a8是指向它的;
你用.equals比较就是true了.

昨天新建了一个群,欢迎小白,大神,非路人,入坑讨论
群号:
450339881
秋天种树 2020-04-13
  • 打赏
  • 举报
回复
引用 3 楼 dkwuxiang 的回复:
没有一个解释的;
// ① 堆内存中会 出现  变量a4_1(地址为Da41值为AA)  ,a4_2 (地址为Da42值为BB), a4(地址为Da4值为 AABB)
		// 常量池中出现 AA(Ca41), BB(Ca42)
		String a4 = new String("AA") + new String("BB");
		// intern() 会先判断 常量池中是否已存在 AABB, 如果存在 返回 常量池中AABB 的地址,如果不存在,将AABB(a4)写入常量池 地址为 a4 的内存地址
		a4.intern();
		// a5 直接指向 常量池中  AABB 的地址,a5(地址a4)
		String a5 = "AABB";
		// 此时 a4 a5 的内存地址相同
		System.out.println(a4 == a5); // true
		
		// new String() 重新开辟内存地址 a6 (Da6)
		String a6 = new String("AA");
		// 先判断  发现 AA 已经存在于常量池 (① 中 AA 已被写入常量池)
		a6.intern();
		// 指向 常量池中的 AA (a41)
		String a7 = "AA";
		System.out.println(a6 == a7); // false
能一步一步画图出来吗? 标明一下栈、堆、常量池在过程中的变化和关系
qq_39936465 2020-04-13
  • 打赏
  • 举报
回复
引用 楼主 m0_47020112 的回复:
有懂的大神吗?内存中发生了什么事情? 详细的来,不懂的也乱答 String a = new String("A"); String a ="A"; 这两个区别,图片中为什么答案是这样。 不要用旧的JDK知识回答
new String()都是放在堆中,“ “放在常量池中,String.intern()1.7版改为了首次引用,如果该字符串常量池没有则把该字符串的堆的引用地址给这个字符串常量,以后直接赋予字符串常量的都是直接引用了首次写入该常量的堆的引用地址。所以”aabb“在常量池中的是a4的引用地址。 而a6在执行intern(),因为a5赋值时aa已经被写入常量池,所以无效。
dkwuxiang 2020-04-13
  • 打赏
  • 举报
回复
没有一个解释的;
// ① 堆内存中会 出现  变量a4_1(地址为Da41值为AA)  ,a4_2 (地址为Da42值为BB), a4(地址为Da4值为 AABB)
		// 常量池中出现 AA(Ca41), BB(Ca42)
		String a4 = new String("AA") + new String("BB");
		// intern() 会先判断 常量池中是否已存在 AABB, 如果存在 返回 常量池中AABB 的地址,如果不存在,将AABB(a4)写入常量池 地址为 a4 的内存地址
		a4.intern();
		// a5 直接指向 常量池中  AABB 的地址,a5(地址a4)
		String a5 = "AABB";
		// 此时 a4 a5 的内存地址相同
		System.out.println(a4 == a5); // true
		
		// new String() 重新开辟内存地址 a6 (Da6)
		String a6 = new String("AA");
		// 先判断  发现 AA 已经存在于常量池 (① 中 AA 已被写入常量池)
		a6.intern();
		// 指向 常量池中的 AA (a41)
		String a7 = "AA";
		System.out.println(a6 == a7); // false
nayi_224 2020-04-13
  • 打赏
  • 举报
回复
再多写一行测试代码你就懂了
    	String s1_1 = new String("aaaa");
    	s1_1.intern();
        String s1_2 = "aaaa";
        System.out.println(s1_1 == s1_2);
        
        String s2_1 = new String("aa") + new String("bb");
        s2_1.intern();
        String s2_2 = "aabb";
        System.out.println(s2_1 == s2_2);
        
        String s3_1 = new String("aa") + new String("bb");
        s3_1.intern();
        String s3_2 = "aabb";
        System.out.println(s3_1 == s3_2);
返回false true false

62,628

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧