是这样,==是用来比较引用的是,你new 或是外面传进来一个'ok'虽然内容相同,但引用句不同所以是false;
String有一个缓冲池,以你所写的这种方法来给string赋值的话,它会先去看一下缓冲池里有没有这样一个String,如果有,就把这个String的引用赋给它,如果没有才new 一个新的,这样一来,这两个String就指向同一个引用,所以是true:)

解决方案 »

  1.   

    str1==str2 比较的是地址,而不是字符串的值.
      

  2.   

    程序在运行的时候会创建一个字符串缓冲池
    当使用 str2 = "ok" 这样的表达是创建字符串的时候,程序首先会
    在这个String缓冲池中寻找相同值的对象,str1先被
    放到了池中,所以在str2被创建的时候,程序找到了具有相同值的 str1
    将 str2 引用 str1 所引用的对象"ok"如果用 new 操作符,就明白的告诉程序:
    “我要一个新的!不要旧的!”与是一个新的"ok"String对象被创
    建在内存中。他们的值相同,但是位置不同。
      

  3.   

    真相是这样的:
    对于相同的字符串常量(这里是"ok"),jvm里头只有唯一的一份copy,因而"ok"=="ok",that is true forever,也就是str1==str2,因为它们指向的是同一个对象嘛。
    而你用new String("ok")就不一样了,你告诉cvm你要一个完全新的对象,其值是“ok”,当然用==比较就完全是false了,你要用equals来比较其值。
    that is all.
      

  4.   

    你就记住 “==”  是比较地址
    ”equals“是比较值