Java基本类型和包装类什么情况下判断相等(“==“或“equals“)?

简介: Java基本类型和包装类什么情况下判断相等(“==“或“equals“)?

[1] 先讨论一个面试题


int a = 1;
Integer b = 1;
Integer c = new Integer(1);
Integer d = Integer.valueOf(1);
int e = d;
int f = d.intValue();

  请问以下式子的值?为什么?

a == b // true
a == c // true
b == c // false

[2] "=="与"equals"用法的不同


  对于Java中的判断相等,有两种方法:

  · 操作符==

  · 方法equals

  对于==操作符来说,区分是基本类型还是引用类型

  1、如果比较的数据是基本类型,则比较它们的值;

  2、如果比较的是对象,则会比较对象的内存地址。

  3、另外,如果一个是基本类型、一个是包装类型,在比较前会先把包装类型拆箱成基本类型,然后进行比较。

  equals方法是用来判断其他的对象是否和该对象相等,equals()方法在Object类中定义如下:

public boolean equals(Object obj) {  
    return (this == obj);  
}  

 很明显是对两个对象的地址值进行的比较(即比较引用是否相同)。但是我们知道,String 、Math、Integer、Double等这些封装类在使用equals()方法时,已经覆盖了object类的equals()方法。


 所以对于equals来说,区分调用者是否重写了equals方法:


 1、类没有重写equals()方法:通过equals()比较该类的两个对象时,等价于通过“==”比较这两个对象,使用的默认是Object类equals()方法,比较它们的地址值。

 2、类重写了equals()方法:一般我们都重写equals()方法来比较两个对象中的属性是

否相等;若它们的属性相等,则返回true(即认为这两个对象相等)。

【注意】equals()不能用于判断基本数据类型的变量,只能用来判断两个对象是否相等。

[3] 基本类型和包装类型的区别


  1、对于基本类与包装类的转换,Java提供了装箱、拆箱机制;

  2、包装类的缓存机制。Byte , Short , Integer , Long这 4 种包装类默认创建了数值 [-128,127]的相应类型的缓存数据, Character创建了数值在[0,127]范围的缓存数据,Boolean直接返回 True or False

  3、Java语言是面向对象的,但是Java的基本数据类型不是,将基本数据类型设计成类,可以增强Java面向对象的性质;

  4、包装类可以用于泛型,而基本类型不可以;

  5、基本类型在栈中直接存储的具体数值,而包装类型则存储的是堆中的引用。包装类型需要占用更多的内存空间。假如没有基本类型的话,对于数值这类经常使用到的数据来说,每次都要通过new一个包装类型就显得非常笨重。

[4] 3种创建基本类型的方式


  以int为例,这里我们把参与比较的类型分为三种:int直接new出来的Integer对象自动装箱出来的Integer对象。分类细节如图:

image.png

[4.1] int


int a = 1;
Integer b = 1;
int e = b;
int f = b.intValue();

  如上代码中,变量a、e、f的创建:

  a属于直接创建;

  e是对Integer类型进行自动拆箱,转化成int类型;

  f是调用变量bintValue()方法,可以理解为显式的拆箱。

[4.2] 直接new出来的Integer对象


Integer c = new Integer(1);

  没啥好说的。包装类型存储的是堆中的引用。

[4.3] 自动装箱出来的Integer对象


Integer b = 1;
Integer c = 128;
Integer d = Integer.valueOf(1);

  如上代码中,变量b、c的创建使用了自动装箱机制,自动装箱机制会调用指定包装类的valueOf方法,像变量d那样。

  由于具有包装类自动装箱时具有缓存机制,而它就是通过valueOf方法实现的,其代码如下:

public static Integer valueOf(int i) {
    if (i >= IntegerCache.low && i <= IntegerCache.high)
        return IntegerCache.cache[i + (-IntegerCache.low)];
    return new Integer(i);
}

  可以看到,在范围[-128,127]之间,包装类Integer自动装箱定义时会返回缓存中数据。

[5] 综上,我们回到面试题


int a = 1; // 直接定义,存在栈中
Integer b = 1; // 自动装箱,且1在[-128,127],b是缓存中数据
Integer c = new Integer(1); // new对象,存在堆中的引用

  由于对于操作符==,如果一个是基本类型、一个是包装类型,在比较前会先把包装类型拆箱成基本类型,然后进行比较。所以a == ba == c都为true。

  对于同样是包装类型的变量b、c,操作符==比较的是它们的引用,而一个是缓存中数据,一个在堆中,所以b == c为false。

a == b // true
a == c // true
b == c // false

【注意】对于变量b、c的比较,它们是引用类型了,我们应该使用equals()来判断它们的值是否相等,IDEA会有提示。而变量a、b,变量a、c之间的比较,不能用equals(),因为基本类型不可以使用equals()。

相关文章
|
9天前
|
存储 缓存 Java
大厂面试必看!Java基本数据类型和包装类的那些坑
本文介绍了Java中的基本数据类型和包装类,包括整数类型、浮点数类型、字符类型和布尔类型。详细讲解了每种类型的特性和应用场景,并探讨了包装类的引入原因、装箱与拆箱机制以及缓存机制。最后总结了面试中常见的相关考点,帮助读者更好地理解和应对面试中的问题。
33 4
|
1月前
|
存储 Java C++
java中“==”和equals,究竟比的是什么
java中“==”和equals,究竟比的是什么
36 3
java中“==”和equals,究竟比的是什么
|
2月前
|
Java 编译器 容器
Java——包装类和泛型
包装类是Java中一种特殊类,用于将基本数据类型(如 `int`、`double`、`char` 等)封装成对象。这样做可以利用对象的特性和方法。Java 提供了八种基本数据类型的包装类:`Integer` (`int`)、`Double` (`double`)、`Byte` (`byte`)、`Short` (`short`)、`Long` (`long`)、`Float` (`float`)、`Character` (`char`) 和 `Boolean` (`boolean`)。包装类可以通过 `valueOf()` 方法或自动装箱/拆箱机制创建。
35 9
Java——包装类和泛型
|
1月前
|
Java 编译器
【一步一步了解Java系列】:探索Java基本类型转换的秘密
【一步一步了解Java系列】:探索Java基本类型转换的秘密
34 3
|
1月前
|
Java 编译器 C语言
【一步一步了解Java系列】:探索Java基本类型与C语言的区别
【一步一步了解Java系列】:探索Java基本类型与C语言的区别
42 2
|
1月前
|
Java
【Java】什么是泛型?什么是包装类
【Java】什么是泛型?什么是包装类
18 0
|
3月前
|
Java
【Java基础面试二十三】、==和equals()有什么区别?
这篇文章区分了Java中的`==`运算符和`equals()`方法:`==`用于基本数据类型时比较值是否相等,用于引用类型时比较内存地址是否相同;而`equals()`默认实现按内存地址比较,但通常被重写以根据对象内容比较是否相等。
【Java基础面试二十三】、==和equals()有什么区别?
|
3月前
|
Java
【Java基础面试二十一】、说一说hashCode()和equals()的关系
这篇文章讨论了Java中`hashCode()`和`equals()`方法之间的关系,强调如果两个对象相等,它们必须有相同的哈希码,但有相同哈希码的对象未必相等,并解释了这一关系在HashSet集合中判断元素是否重复的应用场景。
【Java基础面试二十一】、说一说hashCode()和equals()的关系
|
3月前
|
Java
【Java基础面试二十二】、为什么要重写hashCode()和equals()?
这篇文章解释了为什么需要重写`hashCode()`和`equals()`方法:因为Object类的`equals()`默认使用`==`比较,这在业务中通常是不够的,我们需要根据对象内容来比较相等性;同时,为了保持`hashCode()`与`equals()`的联动关系,一旦重写了`equals()`,通常也需要重写`hashCode()`。
【Java基础面试二十二】、为什么要重写hashCode()和equals()?
|
2月前
|
存储 Java 测试技术
Java零基础教学(10):包装类
【9月更文挑战第1天】Java零基础教学篇,手把手实践教学!
41 1