首页 新闻 会员 周边

String类型

-1
悬赏园豆:5 [已解决问题] 解决于 2023-11-24 23:30


为啥打出来的地址是相同的,请大佬解释

戈壁老王-的主页 戈壁老王- | 初学一级 | 园豆:191
提问于:2023-11-22 21:11
< >
分享
最佳答案
1

==对比的是引用
你题目中贴的代码 String m = new String();String n = new String();本来是不同引用的对象也就是m != n
但是因为 m = "xx"; n = "xx"; 这种通过直接赋值字符串的方式,让他们指向了同一个引用,这点你也知道了

因为只有一个“老王”且存储在常量池中

你后来贴的代码不相等,在于new,既然new了 那就是创建了一个新的对象(也就是String m = a; 和 String m = new String(a);的差别),既然是新的对象,那引用肯定不一样。此时m, n只是值相等,但是引用不再相等了。

收获园豆:5
复制粘贴机器人 | 小虾三级 |园豆:702 | 2023-11-24 09:20

我可不可以这么理解:我第一段代码因为比较简单,在执行的时候为了节省空间,java帮我优化了,第二段代码复杂一些,java就不想给我优化,直接先搞出两个对象来,然后再去赋值

戈壁老王- | 园豆:191 (初学一级) | 2023-11-24 22:43

@戈壁老王-: 优化的话,我也不知道能不能这么说。
可以这么理解:所有对象的创建都要通过new,而通过双引号创建的字符串,是隐式的创建了一个String对象,比如String a = "abc"; 相当于 String internedA = new String("abc"); String a = internedA ;
之后再次使用"abc"时,比如String b = "abc"; 此时相当于 String b = internedA;

复制粘贴机器人 | 园豆:702 (小虾三级) | 2023-11-24 22:55

@复制粘贴机器人: 就是我的第一种写法中当写到String b =“老王”的时候他会去判断找“老王”有没有对应的internedA,有的话就不在创建新的对象,第二种写法,执行的时候就不会对参数进行判断,而是先在堆中创建两个对象,

戈壁老王- | 园豆:191 (初学一级) | 2023-11-24 23:14

@戈壁老王-: 是的,因为第二种明确用了new

复制粘贴机器人 | 园豆:702 (小虾三级) | 2023-11-24 23:15

@复制粘贴机器人: 就是java对不同的写法做了不同的定义,并进行了不同的执行流程?

戈壁老王- | 园豆:191 (初学一级) | 2023-11-24 23:18

@戈壁老王-: 这个叫字符串驻留

复制粘贴机器人 | 园豆:702 (小虾三级) | 2023-11-24 23:19

@复制粘贴机器人: 聊了这么久,感谢大佬解惑,刚又提了一个问题您顺便看下不

戈壁老王- | 园豆:191 (初学一级) | 2023-11-24 23:21
其他回答(3)
0

操作符重载了,String的==比较的就是值。

水晶途途 | 园豆:1443 (小虾三级) | 2023-11-22 21:51

假设我用别的方法能够比较地址,那么还是那个问题,这两个地址为什么相同啊?

支持(0) 反对(0) 戈壁老王- | 园豆:191 (初学一级) | 2023-11-22 21:55

String m = "老王"
String n = "老王"
这个我知道他们的地址是相同的,因为只有一个“老王”且存储在常量池中

支持(0) 反对(0) 戈壁老王- | 园豆:191 (初学一级) | 2023-11-22 21:57
0

对于字符串字面值或常量,Java 会自动将它们放入一个字符串常量池中,并复用已存在的相同的字符串对象。因此,对于你的代码,虽然 m 和 n 引用了不同的 String 对象,但由于它们所包含的字符串 "老王" 是相同的,因此它们会指向相同的字符串常量池中的对象。

凉彧 | 园豆:224 (菜鸟二级) | 2023-11-23 10:32


但是你看这两个mn不相等,这是怎么回事啊

支持(0) 反对(0) 戈壁老王- | 园豆:191 (初学一级) | 2023-11-23 20:57
0

你这四句代码不就是相当于 String m = "老王"; String n = "老王"; 嘛

让我发会呆 | 园豆:2929 (老鸟四级) | 2023-11-23 15:42
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册