论 == ,和equals 在比较中的不同

松梓 发布于 2016/08/30 19:20
阅读 700
收藏 1

这是我自己写的,比较没有问题

我同学用(if(newpw.equals(newpw2)))这个语句,里面结果却为false;

加载中
0
kukudeku
kukudeku
equals是Object类中的方法,用于比较两个实例是否相等,也就是说,这两个对象是否是指向同一个引用。equals方法在Object内部实现是public boolean equals(Object obj) {return (this == obj);};而==比较,比较的是两个对象的物理地址是否一致。因此在比较对象是否相等时,要用equals而不是==,==比较可用于基本类型是否相等
绝对是路过
回复 @松梓 : ==是比较的对象对应的地址
kukudeku
kukudeku
回复 @松梓 : 简单来讲,java中在创建对象时会在堆中为这个对象实例分配空间,并返回指向这个空间的引用,也即String s ="abc"中的s是abc字符串空间的引用,equals比较的就是这样的引用。每个对象在内存中都有自己的地址,相当于门牌号,==比较的是这个地址=
kukudeku
kukudeku
回复 @松梓 : 简单来讲,equals
松梓
松梓
谢谢您认真的讲解,但是看了你的讲解我又产生了疑惑,为什么比较对象相等用equals呢?你说equals底层实际上就是用 ==判断,那跟直接用 ==判断有何区别的?
2
s
shenwc931205
equals()比较两个字符串是否相等,==比较两个字符串的指针是否指向同一个内存地址。
s
shenwc931205
回复 @松梓 : 通过String a="a" ;这样的形式申明的String类型变量会在编译的时候被存放在常量池中,但是这里newpw与newpw2是在运行时才拿到的值,这些值被放在不同的内存地址上,所以用==比较时为false
松梓
松梓
不是说String类型的数据在内存中是存储在常量池中的么,而常量池中相等的数据不是应该地址相同的么
1
SVD
SVD
#include<stdio.h>
 
int main()
{
    static char *s[] = {"black", "white", "pink", "violet"};
    char **ptr[] = {s+3, s+2, s+1, s}, ***p;
    p = ptr;
    ++p;
    printf("%s", **p+1);
    return 0;
}



    感受一下来自指针的满满的恶意,就知道底层的地址操作是多么细微。

楼主的问题是内存地址和内容的问题.


0
乌龟壳
乌龟壳
应该不会吧,equals就能正确判断是否相等了,断点调试下看看咯。
松梓
松梓
@乌龟壳 懂了,谢谢
乌龟壳
乌龟壳
回复 @松梓 : 虽然我以前也很反感这个,但当了解到java简洁的语法设计原则后,就接受了。因为在java里,对于非基本类型,==就是比内存地址是否相等,很纯粹。
乌龟壳
乌龟壳
回复 @松梓 : java里的==意义是比内存地址是否相同,两个String实例的内存地址自然是不同的,所以要比它们的值是否一致,需要用到equals
松梓
松梓
对,我用equals结果是对的,但是我隔壁用==就不对了
0
如比如比
如比如比
可能是编码的问题导致的。参照:http://ask.csdn.net/questions/201911
松梓
松梓
并不是0.0不过还是谢谢了
0
老飞的天空
老飞的天空
比较之前打印一下,
0
西红柿幽幽子
西红柿幽幽子
Scaner的话,考虑下空格回车什么的问题,trim一下看看?
0
Mike__Long
Mike__Long
1.基本数据类型,也称原始数据类型。byte,short,char,int,long,float,double,boolean 
  他们之间的比较,应用双等号(==),比较的是他们的值。 
2.复合数据类型(类) 
  当他们用(==)进行比较的时候,比较的是他们在内存中的存放地址,所以,除非是同一个new出来的对象,他们的比较后的结果为true,否则比较后结果为false。 JAVA当中所有的类都是继承于Object这个基类的,在Object中的基类中定义了一个equals的方法,这个方法的初始行为是比较对象的内存地 址,但在一些类库当中这个方法被覆盖掉了,如String,Integer,Date在这些类当中equals有其自身的实现,而不再是比较类在堆内存中的存放地址了。

  对于复合数据类型之间进行equals比较,在没有覆写equals方法的情况下,他们之间的比较还是基于他们在内存中的存放位置的地址值的,因为Object的equals方法也是用双等号(==)进行比较的,所以比较后的结果跟双等号(==)的结果相同。


我在网上找来的,比较详细的答案。

0
z
zkatt
除了覆写equals方法的类(比较的是值),其余equals方法由于是继承于Object类,默认比较的是引用,而==比较的是具体的值,
0
要成为海贼王的路小飞
要成为海贼王的路小飞
= =比较的是地址(也可以说引用)。除非重写了equals方法的类,可以自定义比较的依据,例如(比较他们的值),否则equals方法比较的也是地址。那是因为所有的类都继承于Object类,Object类的equals方法就是用==实现的(可以去看源代码),所以Object类的equals方法比较的也是地址。但是String类是重写了equals方法,所以比较的是值。
返回顶部
顶部