为什么java中的“1”==“1”是true,而new String("1"

Python09

为什么java中的“1”==“1”是true,而new String("1",第1张

这涉及到String的存储:

栈:JVM分配,存储数据引用

堆:存储对象数据

常量池:从堆中分配出来的一块存储区域,存储显示的String、Integer等

例:Stringstr = “abc”, abc这个字符串是显示声明,所以存储在常量池 

即:

String x = "x"  

"x" == x // true

而:

String x = new String("x") // 此处x是存储在堆中的对象的一个索引,

//很显然,常量与索引不相等

推荐:http://blog.sina.com.cn/s/blog_798b04f90100ta67.html

不可以这样。

如果是一个数组的话,判断数组中的某个元素是否等于1,首先应该遍历这个数组,找到数组中的所有元素,然后再一个一个的和1进行比较,判断数组中是否有等于1的元素。

如果数组的元素是已经定义完成的话,则进行下面的程序:

for(int i = 0i<a.lengthi++){ //遍历数组,得到数组中的所有元素

if(a[i]==1){//将数组的元素一一与1进行比较

System.out.print("数组中有等于1的元素")

}

}

a[1]==1是绝对错误的。首先,数组的下标是从0开始,那么a[1]表示的就是数组当中的地第二个数,而且这个表达式只是比较数组中的第二个数是否与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的自动装箱和拆箱功能完全可以满足了。