java字符串问题。
classTest{publicstaticvoidmain(String[]args){Strings="a"+"bc";Strings1="abc";System.o...
class Test
{
public static void main(String[] args)
{
String s="a"+"bc";
String s1="abc";
System.out.println(s==s1);
String s3=s+"def";
String s4="abc"+"def";
System.out.println(s3==s4);
}
}
为什么第二个输出的是false?请详细说明为什么 谢谢。 展开
{
public static void main(String[] args)
{
String s="a"+"bc";
String s1="abc";
System.out.println(s==s1);
String s3=s+"def";
String s4="abc"+"def";
System.out.println(s3==s4);
}
}
为什么第二个输出的是false?请详细说明为什么 谢谢。 展开
8个回答
展开全部
首先要明白JAVA对于String是如何处理的,Java为了更有效地使用内存,JVM留出一块特殊的内存区域,被称为“String常量池”。当编译器遇见String常量的时候,它检查该池内是否已经存在相同的String常量。如果找到,就把新常量的引用指向现有的String,不创建任何新的String常量对象。
注意:java中==是比较对象的引用地址和值是否都相等,equals只比较值是否相等。
java把括号括起来的当成一个string对象,而且String对象是不变的!可以变化的是String对象的引用。
所以当String s="a"+"bc"; 首先JVM会在常量池中产生两个对象“a”和“bc”,相加的时候JVM会先在常量池中寻找对象“abc”,没有找到JVM就会产生一个新的对象"abc”,然后再把“abc”的引用赋值给s,而s1=“abc”的时候,JVM也同样是在常量池中寻找,当发现有该对象时,将不再创建新的对象,直接将引用地址赋值给变量s1,所以s==s1对象的值和引用地址是完全相等的。输出:true
s3==s4为什么输出false
是因为s3=s+"def";中的s是对象,并不是在常量池中开辟的,而是在堆区开辟的,“def”则是在常量池中,同样“abc”+“def” 因为之前“abc”存在于常量池中,“def”也因为上一步也存在于常量池中
所以二者的引用地址不一样
注意:java中==是比较对象的引用地址和值是否都相等,equals只比较值是否相等。
java把括号括起来的当成一个string对象,而且String对象是不变的!可以变化的是String对象的引用。
所以当String s="a"+"bc"; 首先JVM会在常量池中产生两个对象“a”和“bc”,相加的时候JVM会先在常量池中寻找对象“abc”,没有找到JVM就会产生一个新的对象"abc”,然后再把“abc”的引用赋值给s,而s1=“abc”的时候,JVM也同样是在常量池中寻找,当发现有该对象时,将不再创建新的对象,直接将引用地址赋值给变量s1,所以s==s1对象的值和引用地址是完全相等的。输出:true
s3==s4为什么输出false
是因为s3=s+"def";中的s是对象,并不是在常量池中开辟的,而是在堆区开辟的,“def”则是在常量池中,同样“abc”+“def” 因为之前“abc”存在于常量池中,“def”也因为上一步也存在于常量池中
所以二者的引用地址不一样
展开全部
java中的==是引用比较,
String s3=s+"def"; 这里创建了一个S3的对象,并赋予了值abcdef,假设我们在内存中申请了一个位置a来存储 s3
String s4="abc"+"def"; 这里创建了一个S4的对象,并赋予了值abcdef,假设我们在内存中申请了一个位置b来存储 s4
==这个比较的是s3和s4在内存中存的位置一样么?答案肯定是否的,所以是false
如果是equal就是比较,s3和s4的值是一样么,答案明显是肯定的
String s3=s+"def"; 这里创建了一个S3的对象,并赋予了值abcdef,假设我们在内存中申请了一个位置a来存储 s3
String s4="abc"+"def"; 这里创建了一个S4的对象,并赋予了值abcdef,假设我们在内存中申请了一个位置b来存储 s4
==这个比较的是s3和s4在内存中存的位置一样么?答案肯定是否的,所以是false
如果是equal就是比较,s3和s4的值是一样么,答案明显是肯定的
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
先解释s == s1,
程序运行的时候,会在缓冲池里面生成"a", "bc" "abc"
s->指向"abc"内存区
s1 -->因为缓冲吃已经有"abc"了,所以自然指向"abc"内存区, s == s1为true
但是对于s3 = s +"def",进行变量赴值得时候,就不一样了,是存到对应的内存区域的,所以s3可以理解为开辟一篇新内存空间;而不是在缓冲池里面了。
s4生成的"abcdef"在缓冲吃,所以s3 !=s4
程序运行的时候,会在缓冲池里面生成"a", "bc" "abc"
s->指向"abc"内存区
s1 -->因为缓冲吃已经有"abc"了,所以自然指向"abc"内存区, s == s1为true
但是对于s3 = s +"def",进行变量赴值得时候,就不一样了,是存到对应的内存区域的,所以s3可以理解为开辟一篇新内存空间;而不是在缓冲池里面了。
s4生成的"abcdef"在缓冲吃,所以s3 !=s4
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
java中的字符串比较要用 .equal() 方法来进行比较。
如S3.equal(S4)。
如果对字符串用双等号进行判断,会一直得到false
如S3.equal(S4)。
如果对字符串用双等号进行判断,会一直得到false
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
java 虚拟机在编译的时候 会把 s = “a”+“bc” 合并成“abc”
而不会吧 s3 = s+“def" 合并,因为s 是个”abc"的引用。
而不会吧 s3 = s+“def" 合并,因为s 是个”abc"的引用。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询