【java】java的String有时候可以用==比较的本质

来源:互联网 发布:激光器的软件 编辑:程序博客网 时间:2024/05/17 05:05

今天遇到一个很奇怪的事情,在GUI编程的时候居然可以用String的==比较两个字符串内容是否相等(其实分析结束后还是没有比较内容相等,而是比较引用的内容,即地址),我觉得万分诧异。下面将我遇到的事情贴出来:

比如:

Label t=new Label("hi");

if(t.getText()=="hi")

{

    System.out.println("equals");

}

else

{

  System.out.println("not equals");

}

 

运行结果:equals

 

 

你会发现,打印出来的是equals,这个很奇怪,不是说比较字符串内容相等必须用equals嘛?怎么可以用==了。

解释如下:

其实java里面有一个字符串池,如果说我们用""这个符号来申明字符串,那么它就会在那个字符串池中找是否存在此字符串,不存在就在字符串池里面开辟一块空间。

 

下面给出两段小程序来测试一下:

第一段:

这段程序的运行结果是不会打印出ok的
第二段:
运行结果:ok
奇怪了吧,比较一下,区别就在那个ho,一个是用new申请的,一个是直接用“”赋值的,就如上面所说,用new的就会在堆申请一个空间,所以他的地址跟字符串池中的""肯定不一样。但是下面的String s="ho",他会去字符串池中开辟一块空间叫做ho,然后我在比较的时候:s=="ho",这里的"ho"也会去字符串池开辟一段空间,不过这时候,他发现已经有了,所以就用已有的,所以==左右两边其实是对同一个地址的比较,所以他们才相等,所以请你注意,虽然结果相等,但比较的还是地址,不是内容!!!
这样接着解释上面的GUI,那个东西Label t=new Label("hi");这里的"hi",我们用的是"",而不是new语句构造的,所以他回去字符串池开辟空间,接下来,getText返回的就是我们刚才开辟的那个字符串池中的地址,而getText()=="hi",右边的"hi",也会去池子里面开辟空间,但他发现池子里面已经有了,所以就沿用这个,所以比较结果是对的....但是还是强烈建议大家用equals()!!!