"1"=="1"? true还是false

2025-05-18 16:47:47
推荐回答(3个)
回答1:

楼上说了那么多还是没切住楼主要点啊。
其实这个要讨论到2个蛮底层的东西。
1.==判断的的确是在内存中的同意引用地址,也就是楼主说的同一对象。

2.两个“1”都是同一个对象了? 回答是不是。

3.楼主最想明白的一点,为什么"1"=="1"是true吧。这里是第一个蛮高深的地方。因为"1"一出现,JVM给它一个内存地址,而第二个"1"出现的时候呢,并不是给他一个新地址,而是在字符串缓冲池中找是否有相同值的引用,如果可以,直接给他。很奇怪吧,但就是这样,但前提是,这里的两个“1”都当做了基础类型,并不是对象。
举个例子吧。String s1="1";String s2="1";然后s1==s2;是true,就是因为这里的s1和s2都是基础类型,类似于int,float这些基础类型(只要不是new出来的,String有点特殊,并不像int对应Integer,它的基础类型和对象类都是String)。再举个例子吧,String s1="1";String s2=new String("1");这个时候s1是基础类型,s2是对象,他们对应的地址引用不同,所以s1==s2;是false的,不信可以试试,嘿嘿。

4.==和.equals区别何在,这是第二个蛮底层的东西了。
在Java中,所有类的超类是Object,Object中有equals方法,但是它里面的equals是这样的。public boolean equals(Object obj) {
return (this == obj);
} 也就是说Object中equals就是==操作,也就是比较引用地址。那么为什么两个String对象,比如String s1=new String("1");String s2=new String("1");用s1.equals(s2);还是true呢,不是应该比较地址的么?那是因为大多数基础类型对应的类比如Integer,String,Float等都重写了equals函数了,他们比较的是对应的值的大小,而不是引用了,所以上面两个String的对象用equals比较的是他们的值,而他们的值都是"1",这再用到第3点中的方法,也就是他们的值相等,那么s1.equals(s2);就是true 了。

5.所以在很多时候,我们会重写equals方法,用我们自己的方法来判断两个对象是否equals。

补充回答:1.什么时候用常量池中的“1”,当然是在程序编译过程中如果有String s1="1";以后再有同样的String s2="1";之类的就用它了,关键是,不用new,不是新对象的话,只要之前在池子中的常量就会复用。
2.什么时候自己创建“1”对象?回答是,任何时候都没必要。知道为什么会有Integer,Float么,就是为了完全OOP,OOP好处是什么?可以有更多操作手段,有了Integer后,int基本类型的东西通过自动装箱可以很方便的用到Integer类中的函数方法。同样的String s1="1";中的s1可以自动装箱成为String s1=new String("1");中的s1,那么也就可以自动的像后面作为对象的s1一样用到String类中的函数了。
也就是说,除非特殊癖好(喜欢完全OOP格式什么的),new String完全没必要,因为JVM的自动装箱和拆箱功能完全可以满足了。

回答2:

这个好多人回答呀。
我只想补充几句。

由于JVM的共用常量池而导致的 == 返回true的情况,这个不是永远正确的情况。
由于 == 仅是返回了两个字符串对象引用是否指向同一个地方,而各种JVM出于性能优化、节省内存等需求,都可能尽量重用字符串常量,或者根本不重用字符串常量。
因此,即使"1" == "1"也可能在某些特殊的JVM下返回false。

在这里讨论使用常量池的"1"的情况没有意义,除非指定了某个特定厂家的特定版本的JVM,才能给出准确答案。不过如此限定就失去了Java的特性。

因此,实际编程时,请仅使用equals来判断字符串,任何时候都不要用==。

回答3:

用引号直接创建的字符串对象。。是先直接在常量池建一个。。以后如果还有一样的。。就都用那个了。。所以是一样的。。
比如String s1 = “a”;和String s2 = “a”;都是一样的。。因为第一次在产量池建了一个a。。第二次就不会建了。。

但是如果用String类的构造方法建就不一样了。。因为都是new出来的。每次new都会有一个新的对象。。

恩。。是那样的。。只要是双引号直接创建的都在常量池。。而常量池的东西是不会重复创建的。。为了节约资源。。其他方式得到的都相当于是new出来的。。比如你说的substring。。他的源代码就是返回的一个新的字符串对象。。

如果常量池中已经有“1”了。。比如你定义了String s1 = "1";
那么以后只要你再出现"1"都是用原来那个(new时除外比如new String(“1”))..比如String s2 = "1";并且s1.toLowerCase和s1.toUpperCase以及s1.substring(0)或者s1.substring(0, 1)以及String.valueOf(s1)或者String.valueOf("1")等--都是使用常量池中的那个1..这样节约资源..但是一旦你使用new关键字创建String对象的话..就不再是那个了..而是一个新的对象了..或许new关键字并不是你用的..可能是你调用的方法里面返回的是一个新的字符串对象.. 比如new String("1");new关键字在java里就是创建一个新对象的意思..