Integer类有一个缓存,他会缓存介于-128-127之间的整数。
首先看一段代码(使用JDK 5),如下:
public class Test {
public static void main(String[] args) {
Integer i1 = 127;
Integer i2 = 127;
if (i1 == i2)
System.out.println("Equal!");
else
System.out.println("Not equal!");
}
}
输出结果想必大家也知道,是“Equal!”。现在把i1和i2的值由127改为128看看会发生什么?结果输出“Not equal!”。
这个问题的答案看了下面的就会清楚了。
为了更容易理解问题,用Jad将上面代码反编译,如下:
Java代码 复制代码
import java.io.PrintStream;
public class Test
{
public Test()
{
}
public static void main(String args[])
{
Integer i1 = Integer.valueOf(128);
Integer i2 = Integer.valueOf(128);
Integer i3 = Integer.valueOf(128);
if(i1 == i2)
System.out.println("i1 == i2 is true!");
else
System.out.println("i1 == i2 is false!");
if(i1.intValue() >= i2.intValue())
System.out.println("i1 >= i2 is true!");
else
System.out.println("i1 >= i2 is false!");
if(i1 == i3)
System.out.println("i1 == i3 is true!");
else
System.out.println("i1 == i3 is false!");
}
}
Java代码 收藏代码
import java.io.PrintStream;
public class Test
{
public Test()
{
}
public static void main(String args[])
{
Integer i1 = Integer.valueOf(128);
Integer i2 = Integer.valueOf(128);
Integer i3 = Integer.valueOf(128);
if(i1 == i2)
System.out.println("i1 == i2 is true!");
else
System.out.println("i1 == i2 is false!");
if(i1.intValue() >= i2.intValue())
System.out.println("i1 >= i2 is true!");
else
System.out.println("i1 >= i2 is false!");
if(i1 == i3)
System.out.println("i1 == i3 is true!");
else
System.out.println("i1 == i3 is false!");
}
}
import java.io.PrintStream;
public class Test
{
public Test()
{
}
public static void main(String args[])
{
Integer i1 = Integer.valueOf(128);
Integer i2 = Integer.valueOf(128);
Integer i3 = Integer.valueOf(128);
if(i1 == i2)
System.out.println("i1 == i2 is true!");
else
System.out.println("i1 == i2 is false!");
if(i1.intValue() >= i2.intValue())
System.out.println("i1 >= i2 is true!");
else
System.out.println("i1 >= i2 is false!");
if(i1 == i3)
System.out.println("i1 == i3 is true!");
else
System.out.println("i1 == i3 is false!");
}
}
从这可以看出,“Integer i1 = 127;”在JDK1.5下应该编译成了“Integer i1 = Integer.valueOf(127);”。
再看看java.lang.Integer中关于valueOf的源代码是怎样的:
Java代码
public static Integer valueOf(int i) {
final int offset = 128;
if (i >= -128 && i <= 127) { // must cache
return IntegerCache.cache[i + offset]; //这个主意下,Cache 缓存了-128~127的值
}
return new Integer(i);
}
Java代码 收藏代码
public static Integer valueOf(int i) {
final int offset = 128;
if (i >= -128 && i <= 127) { // must cache
return IntegerCache.cache[i + offset]; //这个主意下,Cache 缓存了-128~127的值
}
return new Integer(i);
}
public static Integer valueOf(int i) {
final int offset = 128;
if (i >= -128 && i <= 127) { // must cache
return IntegerCache.cache[i + offset]; //这个主意下,Cache 缓存了-128~127的值
}
return new Integer(i);
}
可以看出,这个值在-128到127之间,会将其cached(缓存)起来,如果多次使用的话,会节省内存和改善性能;如果不在这个范围之内,则生成一个新的Integer Object instance,这样如果进行“==”时,由于是比较两个不同的Object references,故结果是false。事实上,这个特性从JDK 1.3就存在了(以前的我不清楚) 。
确切的说,上面出现的问题实质并不是Autoboxing和Auto-Unboxing,应该是Integer类的valueOf(int i)方法,只是Autoboxing和Auto-Unboxing将这个问题掩盖了。
分享到:
相关推荐
在JavaSE的学习中,了解Java中常用类的使用对于构建一个健壮的应用程序是至关重要的。...这样的实践不仅可以帮助我们掌握如何使用Java提供的常用类,而且还能提升我们对Java面向对象编程范式的认识。
设计决策到目前为止的情况由于对边界的要求不严格,C ...大多数实现都认识到这一事实,但是尝试通过以检查整数的形式增加较少的开销来解决此问题。它们照常执行算术运算,但是如果结果超出范围,则典型的实现将引发异常
通过以上知识点,我们可以对Java类库有一个较为全面的了解,特别是对JavaSE6版本提供的类和接口有一个基础的认识。同时,对于使用手册的用户而言,掌握PDF格式的使用技巧和对扫描文字错误的理解和处理也同样重要。
- **int**:32位(4字节),封装类为`Integer` - **long**:64位(8字节),封装类为`Long` - **float**:32位(4字节),封装类为`Float` - **double**:64位(8字节),封装类为`Double` - **char**:16位(2字节...
零基础认识 Spring Boot Spring Boot 是一个基于 Spring 框架的开源框架,旨在简化 Spring 应用的开发过程。它提供了一种快速、灵活和高效的方式来构建生产级应用程序。 新建 Spring Boot 项目 使用 Spring ...
10. **包装类**:JAVA提供了八种基本数据类型的包装类,如Integer、Double等。这部分会讲解如何将基本类型与对象之间相互转换。 通过学习这些内容,初学者不仅能了解JAVA的常用类,还能建立起对JAVA标准库的初步...
C++面向对象程序设计课程设计报告银行卡管理系统毕设论文 本文总结了设计一个文字界面的银行卡管理系统,功能...通过本次课程设计,我们提高了自己的编程能力,并更加认识到 C++ 的学习离不开自己平时的练习和实践。
### ASP.NET中的STREAMREADER对象总结 #### 一、引言 ...通过本文的详细介绍,相信读者已经对`StreamReader`有了全面的认识。在实际开发中灵活运用这些方法,将有助于提高文件读取操作的效率和稳定性。
在编程语言中,处理大数时,有些语言如Python有内置的Big Integer类型,可以无限制地存储和运算大数。而其他一些语言如C++,在默认情况下,整数类型(如int)有大小限制,超过这个限制的数值就会发生溢出,这时需要...
1. Java标准库包含许多系统类,如`Object`是所有类的基类,`Integer.parseInt()`用于将字符串转换为整数。 本书通过判断题、填空题和选择题的形式帮助学习者巩固对Java基础知识的理解,涵盖从基本语法到面向对象...
这意味着在运行时,`List<String>` 和 `List<Integer>` 实际上是同一个类的实例。 - **构造泛型对象的挑战**:当尝试创建泛型对象的副本时,由于类型信息的缺失,通常无法直接使用构造函数或 clone 方法。例如,在...
- 认识并掌握如何在Visual Basic (VB) 中创建类的方法。 - 学会对象的声明及实例化的过程。 - 了解在VB环境下进行面向对象程序设计的一般流程。 2. **过程与方法** - 在VB中实际操作创建与使用类的过程。 - ...
**Java实验报告(2)-多态和继承** ...通过这个实验,学习者不仅理解了Java中的继承和多态,还通过实践加深了对这两个概念的认识。这样的实践有助于培养解决问题的能力,为今后的软件开发打下坚实的基础。
db.execSQL("create table " + TABLE_NAME + " (ID INTEGER PRIMARY KEY AUTOINCREMENT,NAME TEXT, MARKS INTEGER)"); } } ``` **例子2:查询与Cursor使用** ```java public List<Student> getAllStudents() { ...
- 常用包装类:Integer、Double等。 - **匿名内部类** - 匿名内部类的定义:没有名称的内部类。 - 匿名内部类的应用场景:实现接口或继承抽象类。 #### 第七章:异常的基本概念 - **异常的基本概念** - 异常的...
本实践主要涉及对XML Schema文档结构的认识以及如何使用XML Schema进行XML文档的验证。 XML Schema是W3C推荐的一种XML文档的语法规则定义方式,与早期的DTD(Document Type Definition)相比,XML Schema提供了更...
理解泛型的关键在于认识到类型参数(通常用`T`表示,当然也可以是任何合法的标识符)的作用。类型参数充当了一个占位符的角色,用于在具体使用泛型类或接口时指定实际的类型。这一点与方法的形式参数类似——形式...
用Integer.parseInt()转换字符串 习题 6 使用Java函数库 7 对象村的优质生活 8 深入多态 9 对象的前世今生 10 数字很重要 11 有风险的行为 12 看图说故事 13 使用Swing 14 保存对象 15 网络联机 16 数据结构 17 ...
- **包装类**:Integer、Double等包装类的使用。 - **日期时间API**:Date、Calendar、LocalDate等类的使用。 - **数学类Math**:常用数学函数如sqrt、random等的使用。 - **数组与ArrayList**:数组的定义、初始化...
在深入了解Java泛型的具体用法之前,我们需要先对泛型的基本概念有一个清晰的认识。泛型的引入主要是为了解决早期Java编程中遇到的一些问题。例如,在没有泛型的情况下,如果想要创建一个能够处理不同类型数据的集合...