java中string相等问题("=="与".equal"的具体区别。求详细解释)

publicclassTest{publicstaticvoidmain(String[]args){Strings1="accp";Strings2="accp";St... public class Test{
public static void main(String[] args){
String s1="accp";
String s2="accp";
String s3=new String(s1);
if(s1==s2){
System.out.print("true,");
}else{
System.out.print("false,");
}
if(s1==s3){
System.out.println("true");
}else{
System.out.println("false");
}
}
}

解释结果为啥为true,false
展开
 我来答
一杯水S7r
推荐于2017-09-19 · TA获得超过419个赞
知道小有建树答主
回答量:202
采纳率:0%
帮助的人:154万
展开全部

这要和String的JVM内部工作原理相结合!

比如:String s1="accp"

Java内部将此语句转化为以下几个步骤:

  (1)先定义一个名为s1的对String类的对象引用变量放到栈中:String s1;

  (2)在常量池(字符串常量池)中查找有没有存放值为"accp"的地址,如果没有,则开辟一块存放字面值为"accp",并将这一块内存的指向地址放到栈中s1的变量中。如果已经有了值为"accp"的地址,则直接返回这个地址给栈中s1变量。所以如果常量池中已经有的值,直接返回地址就好。

  String s1 = "accp"; 其字符串值是保存了一个指向常量池中值的引用!

所以s1 和s2的引用地址是相同的,所s1==s2为true

------------------------------------------------------------------------------

而Strings3=newString(s1);

 (1)先定义一个名为s3的对String类的对象引用变量放到栈中:String s3;

(2)在堆中创建一个String类型的对象,这个对象的值,也就是s1的字面值为“accp”。会按照上面的第2的操作到常量池中获取,并返回一个常量池的引用给堆中的这个对象。

(3) 将堆中创建对象的地址返回给栈中变量s3。

所以 Strings3=newString(s1); 是一个指向堆中对象的引用地址。那么 s1 == s3 为false

下面给一个图更好理解吧:

对象引用大概图示

==是比较对象的引用地址,如果要比较对象的值的话用equal吧!

----------扩展-------------------------------------------------------------------

String有一个方法intern(),返回的是这个String对象的常量池引用对象。

如果用 

String s4 = s3.intern();
String s5= new String(s1).intern();

则 s1 == s4 和 s1 == s5 都为true

--------备注------------------------------------------------------------------------

这个问题以前的答案由于本人的经验和能力的不足,导致回答有很多错误的地方,在此表示非常抱歉。

乌光QS
2012-09-14 · TA获得超过1365个赞
知道小有建树答主
回答量:464
采纳率:100%
帮助的人:449万
展开全部
Java编译器认为String对象是不变的,所以所有这样直接写出来"accp"的常量,都编译为同一个实例(不变才能这么干,如果是能变的对象这么编译的话,结果改了s1就同时改了s2,就不对了),这就是为什么s1==s2,但是s3是new出来的实例,一定是另一个实例,当然不会s1==s3。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
百度网友067d73c9f
2012-09-15 · 超过22用户采纳过TA的回答
知道答主
回答量:122
采纳率:0%
帮助的人:60.3万
展开全部
同一和相同的区别,==比较的是不是同一对象,equals比较的是不是相同的。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式