您的位置:首页 > 其它

equals和==的区别及详解

2017-04-29 20:16 183 查看
equals和==的区别

java中equals();方法的源代码是

public boolean equals(Object obj){

return (this=obj);

}

equals方法只是简单的通过==,对于==,如果作用于基本数据类型的变量,则直接比较存储的值是否相等;如果作用于引用数据类型的变量,则比较的是所指向的对象的地址,基本数据类型就存放在栈中,同样存放在栈中的还有引用数据类型的引用,而真正的对象本身则存放在堆中,因此,equals方法只是比较两个对象在内存中的引用地址是否相等

String s1=“hello”;

String s2=new String(“hello”);

System.out.println(S1==S2);

S1和s2的引用地址不同

System.out.println(s1.equals(s2));

结果是false,true

在java中,字符串是引用数据类型,以实例对象的形式存在,因此,虽然s1与s2看上去定义方式不同,但是他们都新建了对象,本质其实是一样的,如上所述==比较的是引用数据类型在栈中的地址是否相同,s1与s2都新建了两个字符串对象,当然开辟了两个不同的内存空间,结果是false

看一下String   equals的源代码

public boolean equals(Object anObject){

  if(this==anObject){

     return true;

}

  if(anObject instanceof String){

   String anotherString=(String)anObject;

}

}

String 中的equals方法对equals进行了重写,重写后equals()方法要判断两个字符串的字符是否全部相等

基本数据类型;
byte,short,int,long
float,double,char,boolean;
引用数据类型;

数组;类;接口;

String s1="abc";

String s2="abc";

System.out.println(s1==s2);

结果是 :true

我们知道一些基本数据类型的变量和对象的引用变量都是在函数的栈内存中分配,而堆内存中则存放new出来的对象和数组,然而除此之外还有一块区域叫做常量池,像我们通常String s1;这样声明的字符串对象,其值就是存储在常量池中,当我们创建String s1=这样一个对象之后,就存储到了常量池中,当我们创建引用String s2=的时候,java底层就会优先在常量池中查找是否存在,如果存在则让s2指向这个值,不会重新创建,如果常量池中没有创建则创建并添加到常量池中,==比较的是索引地址是否相同,s1和s2返回的索引地址相同,所以结果是true

           栈                        堆

    dog  xt     f0         f0      new  dog()     存着属性值

    dog  wc     f1         f1      new  dog()     存着属性值

Dog xt=new Dog();

   xt.type="京巴";   //狗的品种属性

通过xt.找到地址f0  通过栈的地址f0找到堆内存中的属性   把值赋给属性 

Dog  wc=new Dog();

  wc.name="旺财";

例子:

String name="呵呵";

Dog xt=new Dog();

system.out.peintln(xt.name);   输出结果是 呵呵

Dog wc=xt;

  wc.name="旺财";

system.out.peintln(xt.name);旺财

system.out.peintln(wc.name);旺财

因为 xt把自己的地址f0给了wc,所以wc指向的地址是f0,自始至终只有一条狗,只是 叫的名不一样,有人叫它xt有人叫wc,最后wc.name="旺财"改名,所以最后都是旺财
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: