以前知道,现在记不太清楚了,好像是jvm给向String m = "hello";
这样创建的String建立了一个缓冲池(暂且这么叫),也就是你创建的m,ml都指向缓冲池里面的对象,所以==成立。
而象String s = new String("Hello");这样建立的实例是分配不同的地址的,所以==不成立。
建议你发在认证区,那里的人可能更清楚。

解决方案 »

  1.   

    Java中相同的常量字符使用同一地址(正如m和m1),而使用new操作符后系统将
    分配一个新的地址(正如s和s1),在用'=='符号做比较时,程序判断符号两边的地址,如果相同则为true,不相同则为false,因而(s==s1)打印出来的是bad,但是(m==m1)是mok.
      

  2.   

    String s = new String("Hello");
    String s1 = new String("Hello");
    new String("Hello");被看成是不同的對象

    String m = "hello";
    String m1 = "hello";
    在String m = "hello";時,會在heap里為"hello"分配一個空間,
    當String m1 = "hello";時,系統會先去收索heap里有沒有"hello",如果有的話就把"hello"的地址福給m1
    因為'=='在倆邊都是對象時,是判斷兩邊對象的引用是否一樣
      

  3.   

    楼上诸位能确定吗?
    我比较赞同 lanmarco() 的说法
    也想知道确切的答案奥按理说,java编译器碰到常量字符串会创建一个新的String,只是不知道连续碰到相同的字符串,如何处理关注
      

  4.   

    String s = new String("Hello");
      String s1 = new String("Hello");
      String m = "hello";
      String m1 = "hello";
    s,s1为不同的实例
    m,m1为同一对象的不同句柄。
      

  5.   

    在定义m时,系统为m分配一个地址空间并存为hello,定义m1时由于并没有要求新空间,所以利用的还是原来的空间,说白了就是m和m1是一个"hello",而s和s1为两个不同的地址空间,所以会出现这种情况。就象两个人知道一个抽屉里有一把钥匙,和两个人知道两个抽屉里分别有一把两个一样的钥匙一样,虽然一样但还是两把钥匙。
      

  6.   

    S和S1中分别存储的是对两个字符串的引用,是两个内存地址,S==S1,表述的是:他们是不是指向同一个内存地址,所以……Java中不能使用==来比较两个字符串(因为是对象)是否相等,而是使用Equals来完成。至于以下两种写法,String m = "hello";String m1 = "hello";
    从理论上说结果也应该是Bad(好多书上也说是Bad),但遗憾的是我刚才试了一下,竟然是OK,为什么会这样,也请别的大虾指点一下。
    (还有大虾告诉我,用==比较对象,结果是不可预测的,也许OK,是因为不可预测而来的,但我希望这不是真正的原因)
      

  7.   

    我觉得:
    == 比较的一定是句柄(地址)
    equals缺省比较的是地址,除非对其进行重载,才会比较内容(搂主可以自己生成类来试验,比较重载equals前后的情况)因此,搂主的问题归结为
    “编译器连续出现的常量字符串的处理是什么样的”
      

  8.   

    这是由于equals()的默认行为是比较句柄。所以除非在自己的新类中改变了equals(),否则不可能表现出我们希望的行为。不幸的是,要到第7章才会学习如何改变行为。但要注意equals()的这种行为方式同时或许能够避免一些“灾难”性的事件。
    大多数Java类库都实现了equals(),所以它实际比较的是对象的内容,而非它们的句柄。
      

  9.   

    haha ~From
    Thinking In Java
      

  10.   

    字符串的比较不能用==程序运行的时候有一个字符串缓冲池,其中保存着所有的字符串对象
    对字符串进行的操作也都是从这个缓冲池中取出的。
    在调用==操作的时候只是在缓冲池中寻找两个对象进行比较,
    此时有可能调用字符串并不存在缓冲池中。而调用equals()方法的
    时候,会先生成一个调用的字符串在缓冲池中,这样
    缓冲池中就有了这两个字符串对象,就可以进行比较了
      

  11.   

    class test 
    {
    public static void main(String[] args) 
    {
    String t1 = new String("Hello");
    String t2 = "Hello";
    System.out.println("t1 == t2"+ (t1 == t2));
    }
    }====================================================================
    ---------- java ----------
    t1 == t2false
    Normal Termination
    Output completed (1 sec consumed).