1.Integer a = n ;Integer b = new Integer(n),a一定不等于b
2.两个都是new出来的,肯定不等
3.int与以上两种Integer对象比,只要值一样就相等(自动拆装箱)
有意思的来了,如果两个都是非new方法新建的对象,那么值在-128至127之间,则是相等,否则不等
什么意思呢
Integer i1 = 127; Integer i2 = 127; System.out.println(i1==i2); //true Integer i3 = 128; Integer i4 = 128; System.out.println(i3==i4); //false
为什么会这样呢?
Java在编译Integer i1 = 127的时候会翻译成 Integer i1 = Integer.valueOf(127);
查看源码:Integer的valueOf方法
public static Integer valueOf(int i) { if (i >= IntegerCache.low && i <= IntegerCache.high) return IntegerCache.cache[i + (-IntegerCache.low)]; return new Integer(i); }
这个IntegerCache是Integer的一个内部类如下:
private static class IntegerCache { static final int low = -128; static final int high; static final Integer cache[]; static { // high value may be configured by property int h = 127; String integerCacheHighPropValue = sun.misc.VM.getSavedProperty("java.lang.Integer.IntegerCache.high"); if (integerCacheHighPropValue != null) { try { int i = parseInt(integerCacheHighPropValue); i = Math.max(i, 127); // Maximum array size is Integer.MAX_VALUE h = Math.min(i, Integer.MAX_VALUE - (-low) -1); } catch( NumberFormatException nfe) { // If the property cannot be parsed into an int, ignore it. } } high = h; cache = new Integer[(high - low) + 1]; int j = low; for(int k = 0; k < cache.length; k++) cache[k] = new Integer(j++); // range [-128, 127] must be interned (JLS7 5.1.7) assert IntegerCache.high >= 127; } private IntegerCache() {} }
大致就是一个大小为127-(-128)+1的一个数组,数组中存的是值为-128到127的Integer对象。而valueOf方法就是判断当值在-128~127之间时返回数组中对应值的Integer对象,否则就新建对象并返回,所以当值在-128~127之间时新对象指向IntegerCache数组中的对象,两个值相同的新对象指向的也是同一个对象,当然相等
相关推荐
因此,当我们使用 "==" 运算符来比较两个 Integer 对象时,实际上是在比较这两个对象的引用是否相同,而不是比较它们的实际值。 例如,在下面的代码中: ```java Integer i1 = 100; Integer i2 = 100; if (i1 == i2...
在这种情况下,Java会进行拆箱操作,即将`Integer`对象转换为其对应的`int`值,然后进行数值比较。由于`i2`和`i3`(或者`i5`和`i6`)的值相加后结果仍然是40,且40在对象池范围内,所以这些表达式的结果为`true`。 ...
当我们在程序中创建Integer对象时,如果值在-128到127之间,Integer对象会直接从缓存池中获取或复用已存在的对象,避免了重复创建。这是因为Java的自动装箱拆箱机制,使得Integer和int之间的转换更加便捷,但同时也...
2. 创建`integerSet`对象`d`,并调用`bool`、`jiao`、`bing`和`delete`方法,实现集合的比较、交集、并集以及删除操作。 通过以上分析可以看出,`integerSet`类实现了基本的集合操作,包括比较、交集、并集及删除等...
这是因为Integer对象提供了更丰富的功能,比如比较操作、null安全的方法等。此外,Integer还兼容Java的自动装箱和拆箱机制,使得代码更加简洁。 例如,以下是一个使用Integer作为返回值类型的MyBatis示例: ```xml...
### 值引用与对象引用 #### 一、引言 在编程中,变量的引用方式分为两大类:值引用(Value Reference)和对象引用(Object Reference)。这两种引用方式决定了程序如何处理数据以及数据的存储方式。理解这些概念...
但超出这个范围,每个`Integer`对象都是独一无二的,即使值相同,`==`比较也会返回`false`,此时应使用`.equals()`方法进行值的比较。 此外,`Integer`类还提供了一些实用方法,比如`parseInt()`用于将字符串转换为...
// 创建一个值为1234的Integer对象 ``` #### 3. 方法概览 `Integer`类提供了一系列的方法来操作和转换整数值: - **转换方法**:如`parseInt(String s)`用于将字符串转换为整数,`toString(int i)`用于将整数...
而对于`Integer`,如果比较的是对象引用而不是值,需要使用`equals()`方法,例如`Integer a = 5; Integer b = 5; System.out.println(a.equals(b));`会输出`true`。如果比较的是数值,可以使用`compareTo()`方法,...
相比之下,如果创建的Integer对象值在-128到127范围之外,如`Integer i3 = 129; Integer i4 = 129;`,则不会复用缓存池中的对象,而是每次都会创建新的实例。因此,`i3 == i4`会返回false,因为它们引用的是两个不同...
这个比较器能够处理不同类型的对象:字符串(`String`)、整型(`Integer`)、布尔型(`Boolean`)以及一个名为`Person`的自定义类。 #### 2. `Comparator`接口 在Java中,`java.util.Comparator`是一个功能接口,...
在某些情况下,我们可能需要将 `BigDecimal` 对象转换为 `Integer` 对象。本文将详细介绍三种将 `BigDecimal` 转换为 `Integer` 的方法。 1. 使用 `intValue()` 方法 `intValue()` 方法是最直接的转换方式,它会...
这个方法用于将整数值转换为 `Integer` 对象。如果整数值在-128 到 127 之间,就会从缓存中取出对应的对象;否则,就创建一个新的 `Integer` 对象。 现在,让我们来看一看 `IntegerCache` 类: ```java private ...
这个方法接收一个对象参数,然后根据类的自然顺序返回一个整数值:如果当前对象小于传入的对象,返回负数;如果两者相等,返回0;如果当前对象大于传入的对象,返回正数。这样,通过调用`Collections.sort()`或`...
在Java编程语言中,`Integer`和`int`是两...总结来说,`Integer`和`int`在用途、默认值和内存管理上有显著区别,`==`和`equals()`则分别用于比较对象的引用和内容。理解这些基本概念对于编写高质量的Java代码至关重要。
这个方法通常在你需要使用`Integer`对象的特性(如缓存、比较操作或泛型方法参数)时使用。 在面试或笔试题中,如题目所示,`a = Integer.parseInt("123")`会将字符串"123"解析为`int`类型的值,并赋给变量a,所以a...
使用`equals`方法可以比较两个`Long`或`Integer`对象的实际值是否相等。 ```java boolean isEqual = a.equals(b); ``` 2. **调用基本类型的转换方法**: 如果希望使用`==`来进行比较,可以先将对象转换为基本...
查看`Integer`的源码可以帮助我们更深入地理解其内部机制,比如`Integer.valueOf()`方法如何实现值缓存,以及`Integer`对象的比较操作是如何进行的。 6. **扩展讨论**: - 自动装箱/拆箱发生的时间:这些操作发生...
16. **compareTo(Integer a)**: 实现`Comparable<Integer>`接口的`compareTo()`方法,用于比较当前`Integer`对象与另一个`Integer`对象`a`的值。如果当前值大于、等于或小于`a`,则返回正数、零或负数。 这些方法和...
这解释了为何在示例代码中,当我们将128或更大的整数值转换为 `Integer` 时,比较结果为 `false`,因为它们不会使用缓存,而是每次创建新对象。而对于-127到127之间的整数,由于使用了缓存,相同的值会返回同一个...