Java中==和equals的区别

在Java中“==”和“equals()”都是用于比较两个对象是否相等,但是他们之间还是有着许多不同之处。

两者的区别

“==”是一个操作符,用于比较两个操作数的值是否相等。如果操作数为值类型,比较的是值是否相等,如果操作数为引用类型,比较的是地址值是否相等。

“equals()”是一个定义在Object类中的方法,默认情况下,它也是判断两个对象的值是否相等,即与"=="操作符等效。“equals()”方法通常被用于比较对象的内容是否相等,它是一个实例方法,需要被重写以实现自定义的对象比较逻辑。

特殊案例

  • 案例1:

    String str1 = "hello";
    String str2 = "hello";
    String str3 = new String("hello");
    
    System.out.println(str1 == str2); // true
    System.out.println(str1 == str3); // false
    

    在上面的例子中,str1和str2都是指向同一个字符串常量池中的"hello"字符串,所以它们的引用相等返回true。而str3则是通过new关键字新创建了一个String对象,它的引用指向堆内存中另外一个地址,与str1的引用地址不相等返回false。

  • 案例2:

    在Java中,对于小于等于127的整数类型和char类型的包装类型,会存在缓存机制。也就是说,当使用自动装箱或者调用valueOf()方法创建这些包装类型的对象时,如果值在-128到127之间,那么会从缓存中直接返回一个已经存在的对象,而不是新建一个对象,从而提高了性能和减少了内存开销。

    Integer a = 100;
    Integer b = 100;
    System.out.println(a == b); // true
    
    Integer c = 200;
    Integer d = 200;
    System.out.println(c == d); // false
    

    在上面的例子中,由于100在-128到127之间,所以a和b都会引用同一个对象,因此“==”运算符返回true;而200不在这个范围内,c和d会分别引用不同的对象,所以返回false。需要注意的是,这种缓存机制只针对自动装箱和valueOf()方法,而直接调用构造函数创建对象时则不会使用缓存。对于包装类型推荐使用 equals 方法进行判断。

posted @ 2023-05-18 23:00  Crazy_Joker  阅读(30)  评论(0编辑  收藏  举报