package lan;
public class Test {
public static void main(String[] args) {
Integer i1 = 4;
Integer i2 = 4;
System.out.println(i1 == i2);
}
}
当i1、i2的值在-128~127之间时,输出true,否则为false。
java language specification-3.0 写道
If p is a value of type int, then boxing conversion converts p into a reference r of class and type Integer, such that r.intValue() == p
If the value p being boxed is true, false, a byte, a char in the range \u0000 to \u007f, or an int or short number between -128 and 127, then let r1 and r2 be the results of any two boxing conversions of p. It is always the case that r1 == r2.
在命令行通过JDK自带的反汇编工具javap对.class文件进行反汇编:javap -c Test
Compiled from "Test.java"
public class lan.Test extends java.lang.Object{
public lan.Test();
Code:
0: aload_0
1: invokespecial #8; //Method java/lang/Object."<init>":()V
4: return
public static void main(java.lang.String[]);
Code:
0: iconst_4
1: invokestatic #16; //Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
4: astore_1
5: iconst_4
6: invokestatic #16; //Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
9: astore_2
10: getstatic #22; //Field java/lang/System.out:Ljava/io/PrintStream;
13: aload_1
14: aload_2
15: if_acmpne 22
18: iconst_1
19: goto 23
22: iconst_0
23: invokevirtual #28; //Method java/io/PrintStream.println:(Z)V
26: return
}
可以看出Integer i = 4实际上就是 Integer i = Integer.valueOf(4);于是查看JDK源代码:
public static Integer valueOf(int i) {
final int offset = 128;
if (i >= -128 && i <= 127) { // must cache
return IntegerCache.cache[i + offset];
}
return new Integer(i);
}
private static class IntegerCache {
private IntegerCache(){}
static final Integer cache[] = new Integer[-(-128) + 127 + 1];
static {
for(int i = 0; i < cache.length; i++)
cache[i] = new Integer(i - 128);
}
}
从上面两段代码可以看出Integer i = x(x为-128~127之间的数),返回的是同一个对象的引用,只有超出这个范围才会重新创建一个Intger对象。因此也就解释了前面的现象。
分享到:
相关推荐
JAVA 中的 Integer 比较 在 Java 中,我们经常需要比较两个 Integer 对象是否相等,但是在使用 "==" 运算符时,可能会出现一些意外的结果。本文将深入探讨 Java 中的 Integer 比较,了解为什么使用 "==" 运算符可能...
对象池在`Integer`类中以内部类`IntegerCache`的形式存在,它是一个预先创建的`Integer`对象数组,数组长度为256,范围从-128到127。 这个对象池的存在是因为对于小整数(-128到127之间),`Integer`对象通常会被...
constant h_data: integer:=640; constant h_front: integer:=16; constant h_back: integer:=48; constant h_sync: integer:=96; constant h_period: integer:= h_sync + h_data + h_front + h_back; -- ...
integer width = 1381 integer height = 620 boolean titlebar = true string title = "Untitled" boolean controlmenu = true windowtype windowtype = response! long backcolor = 67108864 string icon = "App...
Integer ii_barwidth = -1 // Default to negative value. long il_barcolor=78682240 long il_barmovecolor=8421504 integer ii_minobjectsize = 20 boolean ib_performredraw=True //-- Internal ...
Java 中 int 和 Integer 的区别 Java 中的数据类型可以分为基本数据类型和复杂数据类型,int 是基本类型,而 Integer 是一个类。下面是它们之间的主要区别: 1. 数据类型 int 是基本数据类型,直接存储数值,而 ...
在 Java 编程中,`BigDecimal` 和 `Integer` 是两个不同类型的数值表示。`BigDecimal` 用于处理精确的浮点数运算,适合财务或金融计算,因为它可以避免浮点数计算中的精度问题。而 `Integer` 是 Java 中的整数类型,...
Integer i = new Integer(xxx) 和 Integer i = xxx 的区别在于,前者创建了一个新的对象,而后者可能会从常量池中返回该对象的引用。如果 xxx 的值在 -128 到 127 之间,那么 Integer i = xxx;就可能会从常量池中...
首先,`int`是Java中的原始数据类型之一,它直接存储在栈(stack)中,无需额外的对象开销。`int`可以存储从-2^31到2^31-1(即-2,147,483,648到2,147,483,647)之间的整数值。由于它是原始类型,因此`int`变量的赋值...
Java 中 int 和 Integer 的区别 在 Java 编程语言中,int 和 Integer 是两种不同的数据类型,虽然它们看起来很相似,但它们有着根本的区别。下面我们将详细探讨这两种数据类型的差异。 基本类型 vs 复杂数据类型 ...
一个给定的正整数,循环的将每一位相加,只要得到的结果是大于10的数,就继续循环相加
在Java编程语言中,`int`和`Integer`都是用于表示整数值的数据类型,但它们之间存在着显著的差异。理解这些区别对于编写高效且优化的Java代码至关重要。 首先,`int`是Java中的原始数据类型(Primitive Type),它...
基于cyclone2 FPGA设计的VGA显示飞机小游戏Quartus工程源码+文档说明 library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL;...-- life_enemy:in integer
Integer x = new Integer(5); Integer y = new Integer(5); System.out.println(x == y); // 输出 false,因为x和y指向不同的对象实例 ``` #### `equals` 方法 `equals`方法是`Object`类的一个成员方法,用于比较...
JAVA 中 Integer 值的范围实例代码解析 在 Java 中,Integer 是一个非常重要的类,用于表示整数值。然而,Integer 的值范围是有限制的,这篇文章将会详细介绍 Java 中 Integer 值的范围实例代码。 首先,让我们来...
### Integer类的使用方法详解 在Java编程语言中,`Integer`类是一个非常重要的封装类,它用于将基本数据类型`int`封装成对象。这不仅增强了数据的灵活性,还提供了许多实用的方法来处理整数相关的操作。下面,我们...
VID_ADDR_WIDTH : integer := 32; VID_BURST_WIDTH : integer := 8; VID_BURST_LENGTH : integer := 8; NDI_ADDR_WIDTH : integer := 32; NDI_BURST_WIDTH : integer := 8; NDI_BURST_LENGTH : integer := 8 ...
相比之下,如果创建的Integer对象值在-128到127范围之外,如`Integer i3 = 129; Integer i4 = 129;`,则不会复用缓存池中的对象,而是每次都会创建新的实例。因此,`i3 == i4`会返回false,因为它们引用的是两个不同...
在使用MyBatis进行数据操作时,我们经常会遇到关于返回值类型的困扰,特别是涉及到基本类型int和对象类型Integer之间的转换。标题"mybatis返回Integer"指的是在MyBatis的映射文件或者Mapper接口中,使用Integer作为...
"Java基础之Integer使用的注意事项及面试题" Java 中的 Integer 对象是一种 wrapper class,它可以将基本类型 int 转换为对象。然而,在使用 Integer 对象时,需要注意一些细节,以避免出现意外的结果。 首先,...