2024-11-07 01:37:51
你分析一下内存就很好理解了,我把图画出来了
当定义s3的时候系统会自动把"length: " + 10 转换成 “length: 10” ,让后看看栈空间里面有没有这个值存在,如果有的话就不会在划分空间来存放,直接引用已经存在的值,所以s1跟s3同时引用的都是"length: 10",但s2里面有s1.length()这个是需要通过计算的,每次计算出来的临时的值都会存放在堆空间里面,所以他们引用的地址是不同的,你看看图吧,
你可以测试一下String s4 = "length: "+s1.length(); System.out.println(s2 == s4); 出来的结果应该是false的,因为他们临时计算出来的值的地址都不一样的。希望你能理解吧,你看看马士兵的视频,有讲java的变量内存分配的
2024-11-07 02:45:55
你这个问题,实质是Java中字符串比较的问题。
(1)问题所在。
Java中判断两个字符串“内容”是否一样,要调用String的equals方法。Java中的“==”比较的是两个字符串的存储地址是否相等。
(2)分析
正如你的程序的运行结果所示,三个字符串的哈希码是一样的,这表明它们的内容完全一样。但它们在内存中的存储地址是不一样的,要了解为什么会这样,需要深入理解Java虚拟机的运行机制,推荐你参考《Java编程思想》一书。
(3)程序修改与验证
将你的程序修改如下:
public class Test {
public static void main(String[] args) {
String s1 = "length: 10";
String s2 = "length: "+s1.length();
String s3 = "length: " + 10;
System.out.println(s1);
System.out.println(s2);
System.out.println(s3);
System.out.println(s1.hashCode());
System.out.println(s2.hashCode());
System.out.println(s3.hashCode());
System.out.println(s1 == s2);
System.out.println(s1 == s3);
System.out.println(s1.equals(s2));//增加部分
System.out.println(s1.equals(s3));//增加部分
}
}
程序的运行结果如截图所示。
我想知道的是为什么s1和s2地址不相等而s1和s3地址相等
2024-11-07 06:11:50
2024-11-07 10:33:53
我看看,我也觉得是常量池的问题,自己不是很了解这个,就想请个高手了解下
哇靠,你这个追问让我如何回答?我无语。
哈哈,不是还是没明白,能解释得再通俗点吗
把术语去掉就没有真实原理了,加上术语看不明白,让我如何是好?
简单来说吧
+两边只要有引用的东西,结果就进入字符串缓冲池,如果没有就直接连接两个字符串。
直接连接的字符串只要内容一样地址就一样,而缓冲池中的东西每次连接均会有一个全新的副本,也就拥有不同的地址信息,所以==是不一样的。
这样够吗?
我觉得你说得有道理,但是我没完全明白你的意思,最好通俗点
我已经够俗的了。
真的没法再俗了,如果你还不能理解,我也没办法了。你需要补充一下基础概念了。
谢谢了
不客气
2024-11-07 00:11:53