java里 equals和== 区别

2024-11-23 12:28:46
推荐回答(5个)
回答1:

==是一个比较运算符,基本数据类型比较的是值,引用数据类型比较的是地址值。

(比较地址值即是指是否为同一个对象的引用)

equals()是一个方法,只能比较引用数据类型。重写前比较的是地址值,重写后比一般是比较对象的属性。

扩展资料:

java中的数据类型,可分为两类:

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方法也是用双等号(==)进行比较的,所以比较后的结果跟双等号(==)的结果相同。

回答2:

equals
public boolean equals(Object obj)

指示其他某个对象是否与此对象“相等”。
equals 方法在非空对象引用上实现相等关系:

自反性:对于任何非空引用值 x,x.equals(x) 都应返回
true。
对称性:对于任何非空引用值 x 和 y,当且仅当
y.equals(x) 返回 true 时,x.equals(y) 才应返回
true。
传递性:对于任何非空引用值 x、y 和 z,如果
x.equals(y) 返回 true,并且 y.equals(z) 返回
true,那么 x.equals(z) 应返回 true。
一致性:对于任何非空引用值 x 和 y,多次调用
x.equals(y) 始终返回 true 或始终返回 false,前提是对象上
equals 比较中所用的信息没有被修改。
对于任何非空引用值 x,x.equals(null) 都应返回
false。

Object 类的 equals 方法实现对象上差别可能性最大的相等关系;即,对于任何非空引用值
x 和 y,当且仅当 x 和 y
引用同一个对象时,此方法才返回 true(x == y 具有值 true)。
注意:当此方法被重写时,通常有必要重写 hashCode 方法,以维护 hashCode
方法的常规协定,该协定声明相等对象必须具有相等的哈希码。

参数:
obj - 要与之比较的引用对象。
返回:
如果此对象与 obj 参数相同,则返回 true;否则返回 false。

回答3:

=操作符专门用来比较变量的值是否相等。比较好理解的一点是:
int a=10;
int b=10;
则a==b将是true。
但不好理解的地方是:
String a=new String("foo");
String b=new String("foo");
则a==b将返回false。

对象变量其实是一个引用,它们的值是指向对象所在的内存地址,而不是对象本身。a和b都使用了new操作符,意味着将在内存中产生两个内容为"foo"的字符串,既然是“两个”,它们自然位于不同的内存地址。a和b的值其实是两个不同的内存地址的值,所以使用"=="操作符,结果会是false。诚然,a和b所指的对象,它们的内容都是"foo",应该是“相等”,但是==操作符并不涉及到对象内容的比较。
对象内容的比较,正是equals方法做的事。

回答4:

举个例子
String s1 = "Hello";
String s2 = "Hello";
if (s1 == s2)
{
System.out.println("s1 = s2");
}

String t1 = new String("Hello");
String t2 = new String("Hello");
if (t1 == t2)
{
System.out.println("t1 = t2");
}

我们知道进行字符串比较需要使用字符串对象String的equals方法。这是
因为操作符 == 进行的是狭义上的比较,而方法equals进行的是广义上的
比较。也就是说,操作符 == 比较的是引用,而方法equals比较的是被引
用的值。用C/C++的术语来说,操作符 == 比较的是指针的值,方法equals
比较的是被指针指向的值。

根据以上认识,我们会认为上述程序片断运行时肯定不会打印s1 = s2,
因为字符串s1和s2是两个不同的String对象,其引用应该是不同的。但是
这样的想法是错误的,因为程序运行时却是打印了s1 = s2。

Java通过重新利用相同的字符串对象从而达到节约系统资源的目的。由于
s1和s2的内容完全相同,因此s1和s2在内存中的地址是完全相同的。正是
因为这样的原因,s1 = s2成立。

那么t1和t2是否象等呢?他们的内容也完全相同。

答案是否定的,因为操作符new强制为t1和t2重新生成新的字符串对象,而
不是重新利用现有的具有相同内容的字符串对象。因此t1和t2在内存中的
地址是不同的,其引用也是不同的。因此,t1 = t2不成立。

回答5:

"=="操作符的作用
1、用于基本数据类型的比较
2、判断引用是否指向堆内存的同一块地址。
equals所在位置:
在Object类当中,而Object是所有类的父类,包含在jdk里面,但并不适合绝大多数场景,通常需要重写
public boolean equals(Object obj) {
return (this == obj);
}
equals的作用:
用于判断两个变量是否是对同一个对象的引用,即堆中的内容是否相同,返回值为布尔类型
equals的基本使用:
boolean b = obj1.equals(obj2);
String类型比较不同对象内容是否相同,应该用equals,因为==用于比较引用类型和比较基本数据类型时具有不同的功能。