equal 和 == 在对象、变量类型下的不同情况

简介: equal 和 == 在对象、变量类型下的不同情况

你是否遇到过这样的问题?

String str1 = "Hello";
        String str2 = new String("Hello");
        String str3 = str2; // 引用传递
        System.out.println(str1 == str2); 
        System.out.println(str1 == str3);
        System.out.println(str2 == str3); 
        System.out.println(str1.equals(str2)); 
        System.out.println(str1.equals(str3)); 
        System.out.println(str2.equals(str3)); 
        以上代码输出true还是false
复制代码

或者是这样的问题

Integer i6 = 123;
        System.out.println(i5 == i6); //true
        System.out.println(i5.equals(i6));//true
        Integer i7 = 130;
        Integer i8 = 130;
        System.out.println(i7 == i8); //false
        System.out.println(i7.equals(i8)); //true
        以上代码输出true还是false
复制代码

今天,让我们一起来解答Java中equal和==的异曲同工之处!

/**
 * 实战:equal 和 == 以及在对象、类型下的情况
 */
public class article0603 {
    /**
     * 理论1:
     * ==对比的是栈中的值,基本数据类型是变量值,引用类型是堆中的内存对象的地址
     * 理论2:
     * String类中被复写的equals()方法其实是比较两个字符串的内容
     * equal()比较的是类型和值,类型相等时再比较值,都相等时返回true
     */
    public static void test01() {
        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:
     * ==在比较引用类型时是比较的内存中栈的值
     * 理论4:
     * 为Integer赋值时调用的方法为Integer.valueOf(),当值在-127到128之间时会进行缓存,
     * 使用同一对象,超过时则创建新的对象
     */
    public static void test02() {
        Integer i1 = new Integer(100);
        Integer i2 = new Integer(100);
        System.out.println(i1 == i2);//false
        System.out.println(i1.equals(i2));//true
        Integer i3 = new Integer(129);
        Integer i4 = new Integer(129);
        System.out.println(i3 == i4); //false
        System.out.println(i3.equals(i4));//true
        Integer i5 = 123;
        Integer i6 = 123;
        System.out.println(i5 == i6); //true
        System.out.println(i5.equals(i6));//true
        Integer i7 = 130;
        Integer i8 = 130;
        System.out.println(i7 == i8); //false
        System.out.println(i7.equals(i8)); //true
    }
    /**
     * 理论5:
     * 实例化obj的equals()方法被重写,任何值都会返回true
     */
    public static void test03() {
        Object obj = new Object() {
            @Override
            public boolean equals(Object s) {
                return true;
            }
            @Override
            public String toString() {
                return "abc";
            }
        };
        System.out.println(obj);//abc
        System.out.println(obj.equals("abcde")); //true
    }
    public static void main(String[] args) {
        test01();
        test02();
        test03();
    }
}
复制代码

总结:

  • ==对比的是栈中的值,基本数据类型是变量值,引用类型是堆中的内存对象的地址
  • String类中被复写的equals()方法其实是比较两个字符串的内 equal()比较的是类型和值,类型相等时再比较值,都相等时返回true
  • ==在比较引用类型时是比较的内存中栈的值
  • 为Integer赋值时调用的方法为Integer.valueOf(),当值在-127到128之间时会进行缓存,==使用同一对象,超过时则创建新的对象
  • 例化obj的equals()方法被重写,任何值都会返回true


相关文章
|
14天前
如何判断`instanceof`操作符的返回值是否为`true`
`instanceof`操作符用于判断一个对象是否是指定类型或其子类型的实例。如果对象是指定类型的实例,则返回`true`,否则返回`false`。例如:`if (obj instanceof MyClass)` 会检查 `obj` 是否是 `MyClass` 类或其子类的实例。
|
1月前
|
C# 开发者
【捞底干货】C#中equals和==运算符的区别
【捞底干货】C#中equals和==运算符的区别
26 1
|
5月前
|
JavaScript 前端开发 索引
JavaScript有7个数据类型:Number, String, Boolean, Null, Undefined, Symbol(BES6)和BigInt(ES10)组成基本类型
【6月更文挑战第25天】JavaScript有7个数据类型:Number, String, Boolean, Null, Undefined, Symbol(BES6)和BigInt(ES10)组成基本类型,而Object包括Array、Function等是引用类型。Objects可以包含键值对,Array是特殊的Object。Functions也是对象。`null`和`undefined`被视为特殊的原始值。
54 1
TS定义布尔值,let flag:boolean = true,定义数字类型 let a1:number = 10,赋值 let str1:string = ‘‘,打印c~.log($(str1))
TS定义布尔值,let flag:boolean = true,定义数字类型 let a1:number = 10,赋值 let str1:string = ‘‘,打印c~.log($(str1))
|
5月前
|
安全 Java
比较java枚举成员使用equal还是==
比较java枚举成员使用equal还是==
112 0
|
算法
三元运算符 return mData == null ? 0 : mData.size();的含义
三元运算符 return mData == null ? 0 : mData.size();的含义
59 0
|
6月前
|
缓存 Java
equal 和 == 在对象、变量类型下的不同情况
equal 和 == 在对象、变量类型下的不同情况
34 0
|
6月前
|
JavaScript 前端开发
js基础语法:包括变量声明、数据类型(Number, String, Boolean, Null, Undefined, Symbol, Object)、运算符、流程控制语句(if...else, switch, for, while, do...while)等。具体案例使用演示
js基础语法:包括变量声明、数据类型(Number, String, Boolean, Null, Undefined, Symbol, Object)、运算符、流程控制语句(if...else, switch, for, while, do...while)等。具体案例使用演示
78 1
|
6月前
|
JavaScript 前端开发
JavaScript基础语法:包括变量声明、数据类型(Number, String, Boolean, Null, Undefined, Symbol, Object)、运算符、流程控制语句(if...else, switch, for, while, do...while)等。
JavaScript基础语法:包括变量声明、数据类型(Number, String, Boolean, Null, Undefined, Symbol, Object)、运算符、流程控制语句(if...else, switch, for, while, do...while)等。
66 0
|| 和 && 操作符的返回值?
|| 和 && 首先会对第一个操作数执行条件判断,如果其不是布尔值就先强制转换为布尔类型,然后再执行条件判断。