一。Integer类型对象之间大小比较
1. 使用new Integer()创建的对象:
首先,我们知道,在java中,基本类型之间是可以做大小比较的,例如int i=1,int j=2,是可以直接使用关系运算符“<”、“>”、“==”等符号来做比较的。但在实际开发中,基本类型的包装类更为常用,那么包装类型的比较运算是如何呢?
在main方法中执行下面代码:
Integer i = new Integer(100); Integer j = new Integer(100); System.out.println(i==j);
有人可能会说,jdk1.5以后,基本类型和包装类型之间是可以自由转换的,那么Integer对象也可以直接用关系运算符来做比较,但实际情况并非这样。执行上述代码,打印结果是:
false
其实原因很简单,上述代码中我们执行了两次new,所以创建了两个Integer型的对象,对象之间的“==”符是用来比较是否是一个对象的两个引用(即比较地址是否相同),上述代码中,两次new出来的对象地址显然是不可能相同的,故打印结果是false。
那么对于“<”、“>”这样的运算符呢?执行下面代码:
Integer i = new Integer(100); Integer j = new Integer(300); System.out.println(i<j);
打印结果是true,经过实验,对于“<=”、“>=”符号也是一样的
结论1:使用new关键字创建的包装类型对象,不可以直接使用“==”来做大小比较,但可以使用“<”、“>”、“<=”、“>=”来做大小比较。
2. 使用Integer.valueOf()创建的对象
当然,创建包装类型对象不一定非要使用new关键字,以Integer为例,我们可以使用Integer.valueOf()方法创建Integer对象。那么这种方法创建的对象如何做大小比较呢?执行下面的代码:
Integer i = Integer.valueOf(100); Integer j = Integer.valueOf(100); System.out.println(i==j);
执行后,我们发现,打印结果是true。
根据这个结果,我们是否可以认为,通过valueOf方法创建的对象,可以直接使用关系运算符做比较呢?
先别急,再执行一段代码:
Integer i = Integer.valueOf(400); Integer j = Integer.valueOf(400); System.out.println(i==j);
这段代码,打印结果居然是false!
那么对于“<”、“>”、“<=”、“>=”这几个符号呢?通过实验,得出的结论和1中相同,这几个符号仍然可以直接使用。
看来我们又可以得出一个结论,
结论2:通过valueOf方法创建的Integer对象,也不能随便使用“==”比较大小,但可以使用“<”、“>”、“<=”、“>=”来做大小比较。
3.使用基本类型赋值创建的对象
相比前两种方法,我们平时更常用的是直接将基本类型对象赋值给包装类型(即自动装箱),比如Integer i = 100这样的语法。那么通过这种方法创建的对象,可否使用关系运算符来比较大小呢?
Integer i = 100; Integer j = 100; System.out.println(i==j);
执行上面的代码,发现打印结果是true。当然有了2中的经验,我们使用400这个数来再试一次:
Integer i = 400; Integer j = 400; System.out.println(i==j);
执行这段代码后,发现和2中情况一样,仍然打印false;
通过实验,对于“<”、“>”、“<=”、“>=”这几个符号,和上面的情况都是一样的。
结论3:使用Integer i = 400这种方法创建的包装类对象,也不能随便使用“==”来比较大小,但可以使用“<”、“>”、“<=”、“>=”来做大小比较。
这些现象是什么原因导致的呢?请看下面的分析。
二。Integer对象不同创建方法之间的区别
上文得出的三个小结论,都说明了一个问题,包装类型是不能够随便使用关系运算符比较大小的,针对三种创建对象的方法,原因分析如下:
首先,对于new关键字创建的包装类对象,原因在上文已经说过了,两次new得到的对象引用地址是不同的,不能使用“==”关键字做大小比较。而使用“<”和“>”等运算符时,包装类型会调用valueOf方法,将运算符两边的对象都转换为基本类型后再做比较。这就是为何“==”不能使用而“<”、“>”、“<=”、“>=”这几个符号可以使用的原因。
第二,使用valueOf方法创建的Integer对象,使用“==”符号时,运行结果有时候正确,有时候不正确。查看valueOf方法的源码,如下:
public static Integer valueOf(int i) { if(i >= -128 && i <= IntegerCache.high) return IntegerCache.cache[i + 128]; else return new Integer(i); }
通过看源码能够知道,整数类型在-128~127之间时,会使用缓存,造成的效果就是,如果已经创建了一个相同的整数,使用valueOf创建第二次时,不会使用new关键字,而用已经缓存的对象。所以使用valueOf方法创建两次对象,若对应的数值相同,且数值在-128~127之间时,两个对象都指向同一个地址。
最后,使用Integer i = 400这样的方式来创建Integer对象,与valueOf方法的效果是一样的,不再赘述。
总之,包装类对象不可使用“==”符做比较运算,如果要进行比较运算时,最好使用java类库中的compareTo方法
相关推荐
在这个问题中,我们关注的是`Integer`类的创建,以及Java对象池机制对性能的影响。让我们深入探讨一下。 首先,`Integer`是Java中的一个包装类,用于封装基本类型`int`。Java提供了八种基本类型的包装类,包括`...
Java 中颜色的 String 和 Color 对象之间...Java 中颜色的 String 和 Color 对象之间的互相转换可以通过使用 `Integer.parseInt` 方法和 `Integer.toHexString` 方法实现,或者使用反射机制来实现更多的颜色表示形式。
在Java编程语言中,`int`和`Integer`都是用于表示整数值的数据类型,但它们之间存在着显著的差异。理解这些区别对于编写高效且优化的Java代码至关重要。 首先,`int`是Java中的原始数据类型之一,它直接存储在栈...
本文将深入探讨 Java 中的 Integer 比较,了解为什么使用 "==" 运算符可能会出错,并解释如何正确地使用 equals() 方法来比较 Integer 对象。 Java 中的 Integer 对象 在 Java 中,Integer 是一个不可变的类,它...
在Java编程语言中,`int`和`Integer`都是用于表示整数值的数据类型,但它们之间存在着显著的差异。理解这些区别对于编写高效且优化的Java代码至关重要。 首先,`int`是Java中的原始数据类型(Primitive Type),它...
Java 中 int 和 Integer 的区别 Java 中的数据类型可以分为基本数据类型和复杂数据类型,int 是基本类型,而 Integer 是一个类。下面是它们之间的主要区别: 1. 数据类型 int 是基本数据类型,直接存储数值,而 ...
在Java编程语言中,将`Integer`对象转换为基本数据类型`int`有两种常见的方法:`Integer.parseInt()`和`Integer.valueOf()`。理解这两种方法的区别和应用场景对于编写高效且正确的Java代码至关重要。 首先,我们来...
在 Java 中,类是一个蓝图,用于创建对象。类描述了对象的基本结构,包括属性、方法和事件等。在 Java 中,每个对象都有其自己的状态和行为。对象的状态指的是对象的一些属性的值,对象的行为指的是对象可以执行的...
在 Java 编程语言中,int 和 Integer 是两种不同的数据类型,虽然它们看起来很相似,但它们有着根本的区别。下面我们将详细探讨这两种数据类型的差异。 基本类型 vs 复杂数据类型 Java 中的数据类型可以分为基本...
这是因为Integer类内部有一个缓存池,即IntegerCache,它预先创建了-128到127之间的所有Integer对象。当我们调用valueOf()方法时,如果值在这个范围内,就会从缓存池中获取对象,而不是每次都new一个新的对象。例如...
// 创建一个值为1234的Integer对象 ``` #### 3. 方法概览 `Integer`类提供了一系列的方法来操作和转换整数值: - **转换方法**:如`parseInt(String s)`用于将字符串转换为整数,`toString(int i)`用于将整数...
在Java中,当我们把一个Integer对象作为参数传递给方法时,实际上是传递了对象的引用(地址值)。但是,这个引用本身是不可变的,也就是说,我们不能通过在方法内部改变这个引用来影响到方法外部的对象。例如,如果...
Java中的栈和堆分别承担着不同的角色:栈负责快速、高效的存储和管理基本类型和局部变量,而堆则提供了更加灵活的内存管理策略,适用于各种复杂对象和动态数据结构。理解这两种内存区域的工作机制,对于编写高效、...
8. 整数类型和整数类对象:在 Java 中,Integer.parseInt() 方法将字符串转换为整数类型变量,而 Integer.valueOf() 方法将字符串转换为整数类对象。因此,正确的答案是 A、a 是整数类型变量,b 是整数类对象。 9. ...
2. 创建`integerSet`对象`d`,并调用`bool`、`jiao`、`bing`和`delete`方法,实现集合的比较、交集、并集以及删除操作。 通过以上分析可以看出,`integerSet`类实现了基本的集合操作,包括比较、交集、并集及删除等...
这个方法内部有一个缓存机制,当传入的整数值在-128到127(包括两端)这个范围内时,它会从预先创建好的Integer对象缓存数组中返回一个对象,而不是每次都新建一个Integer实例。这样做是为了提高性能,因为频繁创建...
当我们在程序中创建Integer对象时,如果值在-128到127之间,Integer对象会直接从缓存池中获取或复用已存在的对象,避免了重复创建。这是因为Java的自动装箱拆箱机制,使得Integer和int之间的转换更加便捷,但同时也...
在本篇讨论的主题“JAVA利用泛型返回类型不同的对象方法”中,我们将深入探讨如何通过泛型来解决返回不同类型对象的问题。 首先,我们需要理解元组的概念。元组是一种可以容纳多个不同类型值的数据结构,这些值被...
在Java编程语言中,工具类(Utils)是包含各种实用方法的类,这些方法通常用于执行常见的任务,如类型转换、字符串操作、集合处理等。它们使得代码更加简洁且易于维护,因为它们提供了通用功能的封装,避免了重复...