1、===:称为等同符,当两边值的类型相同时,直接比较值,若类型不相同,直接返回false;
2、==:称为等值符,当等号两边的类型相同时,直接比较值是否相等,若不相同,则先转化为类型相同的值,再进行比较;
类型转换规则:1)如果等号两边是boolean、string、number三者中任意两者进行比较时,优先转换为数字进行比较。
2)如果等号两边出现了null或undefined,null和undefined除了和自己相等,就彼此相等
注意:NaN==NaN //返回false,NaN和所有值包括自己都不相等。
一、"=="和equals方法究竟有什么区别?
==操作符比较的是值【变量(栈)内存中存放的对象的(堆)内存地址】,也就是用于比较变量所对应的堆内存中所存储的数值是否相同。
equal用于比较两个对象的值是否相同【不是比地址】
【特别注意】 Object类中的equals方法和“==”是一样的,没有区别,而String类,Integer类等等一些类,是重写了equals方法,才使得equals和“==不同”。对于基础数据类型来说,没有重写equals方法,故两者是一样。
二、入门案例
1、基础数据类型 使用==和equals进行比较
public class BaseTypeDemo {
public static void main(String[] args) {
//对于基本类型的变量。"=="和"equal"的区别
int t1=57;
int t2=67;
int t3=124;
int t4=124;
//“==”对于基本数据类型,判断两个变量的值是否相等。
Boolean result1=(t1==t2);
Boolean result2=((t1+t2)==t3);
Boolean result3=(t3==t4);
System.out.println("【t1==t2】"+result1);
System.out.println("【(t1+t2)=t3】"+result2 );
System.out.println("【t3=t4】"+result3);
//“equal”不能用于基本数据类型。只能用于类变量。对于基本数据类型要用其包装类。
Integer i1=new Integer(t1);
Integer i2=new Integer(t2);
Integer i3=new Integer(t3);
Integer i4=new Integer(t4);
Boolean ri1=i1.equals(i2);
Boolean ri2=i3.equals(i1+i2);
Boolean ri3=i3.equals(i4);
System.out.println("【i1.equals(i2)】"+ri1);
System.out.println("【i3.equals(i1+i2)】"+ri2);
System.out.println("【i3.equals(i4)】"+ri3);
}
}
【t1==t2】false
【(t1+t2)=t3】true
【t3=t4】true
【i1.equals(i2)】false
【i3.equals(i1+i2)】true
【i3.equals(i4)】true
2、String数据类型 使用==和equals对比
public class StringDemo {
public static void main(String[] args) {
String str1 = "Hello";
String str2 = new String("Hello");
String str3 = str2; // 引用传递
System.out.println(str1 == str2); // false
System.out.println(str1 == str3); // false
System.out.println(str2 == str3); // true
System.out.println(str1.equals(str2)); // true
System.out.println(str1.equals(str3)); // true
System.out.println(str2.equals(str3)); // true
}
}
3、Object数据类型 使用==和equals对比
如果一个变量指向的数据是对象类型的,那么,这时候涉及了两块内存,对象本身占用一块内存(堆内存),变量也占用一块内存,例如Objet obj = new Object();变量obj是一个内存,new Object()是另一个内存,此时,变量obj所对应的内存中存储的数值就是对象占用的那块内存的首地址。对于指向对象类型的变量,如果要比较两个变量是否指向同一个对象,即要看这两 个变量所对应的内存中的数值是否相等,这时候就需要用==操作符进行比较。
1)如果没有重写 对象的Equals方法,直接对比,走的是跟 == 一样的方法
@Test
public void testEquals(){
System.out.println("application ....................");
User u = new User("xiaozheng","123456");
User u1 = new User("xiaozheng","123456");
System.out.println(u.equals(u1));
System.out.println(u == u1);
}
false
false
这是因为,默认情况下,如果不重写equals方法,默认走的是 == ,比较对象的值是否一样
2)重写 对象的Equals方法:
@Override
public boolean equals(Object obj) {
//如果内存地址相等,那么一定是同一个对象,就无需比较两个对象的属性值
if(this==obj){
return true;
}
//判断obj是否为Baboon类型的实例
if(obj instanceof User){
User b = (User)obj;//强制转换
if(!this.username.equals(b.username)){
return false;
}else if(!this.password.equals(b.password)){
return false;
}
return true;
}else{
return true;
}
}
@Test
public void testEquals(){
System.out.println("application ....................");
User u = new User("xiaozheng","123456");
User u1 = new User("xiaozheng","123456");
System.out.println(u.equals(u1));
System.out.println(u == u1);
true
false
————————————————
版权声明:本文为CSDN博主「xiaozhegaa」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/xiaozhegaa/article/details/84065922