class equaland{ public static void main(String[] args)
{
String a="mystring";
String b="mystring";
String c=new String(a);
if(a==b)
   System.out.println(a+"=="+b+" is right!");
else
   System.out.println(a+"=="+b+" is wrong!");
if(a.equals(b))
   System.out.println(a+" equal to "+b+" is right!");
else
   System.out.println(a+" equal to "+b+" is wrong!");
if(a==c)
   System.out.println(a+"=="+c+" is right!");
else
   System.out.println(a+"=="+c+" is wrong!");
if(a.equals(c))
   System.out.println(a+" equal to "+c+" is right!");
else
   System.out.println(a+" equal to "+c+" is wrong!");
}
}
结果像下面这样,有人能解释下为什么吗?
 

解决方案 »

  1.   

    mystring == mystring    is   right! mystring    equal   to   mystring    is   right! mystring == mystring    is   wrong! mystring    equal   to   mystring    is   right! 结果是这样... 有什么问题吗?
      

  2.   

    You may refer to this post for reference.http://topic.csdn.net/u/20071101/13/5ae1a46f-57b2-4a4b-91f5-162895d0307e.html
      

  3.   

    a与b的地址是一样的,因为JVM对String常数在类中的存储作了优化
    JVM在加载你的类的时候,就已经把你的类中会使用到的所有常量String,即"aa"这样写在代码中的String值保存到常量池中也就是你在代码中见到的所有"..."字符串其实在类加载的时候已经全部初始化好了,在String a = "..."时,实际上是将a指向了常量池中的那个String对象
    所以
    String   a= "mystring "; 
    String   b= "mystring "; 
    都指向了常量池中的同一个对象,所以a == bString   c=new   String(a); //这地方是生成新的String对象,与常量池中对象虽然内容一样,但是不是同一个对象,所以 a != c
    至于equals则是计算对象中包含的内容的,所以a.equals(b) 也a.equals(c)
      

  4.   

    equals() 里的源代码就是{xxx==xxx}
      

  5.   

    equals()   里的源代码就是{xxx==xxx} 
    ---
    错误!在java.lang.Object中equals与==是等价的,但是在java.lang.String已经覆盖了这个方法,已经变成了比较内容
      

  6.   

    ChDw正解。论坛有很多关于stack、heap、静态存储的帖子,看一下吧!
      

  7.   

    ==比较的是地址
    equals 比较的是对象的内容
    就这么简单
      

  8.   

    恩,不错~~~
    java里的常量池
    以后可以这样用了:"abc".intern() == "abc" 结果为true,呵呵
      

  9.   

    关于Stirng相等问题,网上有太多的讲解了。
    就是在csdn上也有很多的讲解,楼主可以自己动手搜索一下
      

  10.   

    关于equals()方法的用法和结果就不多说了(它是判断对象的内容是否相等)-->>java中有种说法叫"深相等"
    我说下你那个==判断的结果吧--->>浅相等(引用是否相等||内存地址是否一样)
    要明白这个实现要明白java的String对象的创建原理
    在java执行的过程中会维护一个String池(pool),对于一些已经存在的String对象,
    第二次创建新对象的时候是会共享的这个字符串的,目的就是为了节约内存,这就是你
    第一个和第二个String对象比较的时候相等的原因
    你用new在创建一个对象的时候是从新分配的内存,和以前是否存在该String字符窜无关
    !!!以上两点也就是这两种创建String的区别
    -----------
    我学java时间也不长啊
    不知道表达清楚没哦
    不过在林信良的那本<<java jdk5.0学习笔记>>中讲的倒是很明白
      

  11.   

    Thinking in Java讲过这个String在内部的优化问题,因为String的内容是一个不变的常量(内容可变的相应类有StringBuffer, StringBuilder),所以内部存储的时候会把a b放到一个空间里,可以这样理解:它其实就是Flightweight设计模式的一种应用,要知道在编程语言中,JAVA中用设计模式最火,可总觉得不怎么普及呢
    LZ多看书吧。。
    动手很重要,看书更重要。
      

  12.   

    谢谢各位的讲解,string的存储过程明白了
    那么基本数据类型存储又怎么样呢??
    我会很努力的看书的,努力地学英语,努力的写程序
    谢谢大家的支持