热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Integer对象和==、equals分析

《Java》:Integer对象和、equals分析今天看到Integer的一个小知识点,比较有意思。我们都知道Integeri3;等价于Integeri

《Java》:Integer对象和 ==、equals分析

今天看到Integer的一个小知识点,比较有意思。

我们都知道

 Integer i = 3;

等价于

Integer  i = Integer.valueOf(3);

问题:下面这段代码应该输出什么呢?

    Integer i =3;
Integer j =3;
System.out.println(i==j);

答案是: true。

在解释之前,再看如下的程序

    public class Test {
public static void main(String[] args){
Integer c = 3;
Integer d = 3;
Integer c2 = new Integer(3);
Integer d2 = new Integer(3);

System.out.println(c == d);//true
System.out.println(c2 == d2);//false
System.out.println(c == c2);//false

}
}

我们都知道 用 ==来比较两个对象是否相同,比较是引用,即 == 两边是否指向同一个对象,如果是同一个对象的引用,则返回true,否则返回false。因此,上面的结果也就比较好理解。

从上面的程序结果可以看出:

    Integer c = 3;
Integer d = 3;

中的 c、d是指向同一个对象。这是为什么呢?在进行解释之前,先看下面这个例子。

    public class Test1 {
public static void main(String[] args){
Integer e = 127;
Integer f = 127;
Integer g = 128;
Integer h = 128;

System.out.println(e == f);//true
System.out.println(g == h);//false

}
}

从结果可以看出,程序中的e、f也是指向同一个对象,而g、h不是指向同一个对象。

    Integer i = XXX;
Integer j = XXX;

i、j是否指向同一对象和值XXX有密切关系。

产生上面这种现象的原因是什么呢??

这是由于在Integer的源码实现中,Integer 把-128-127 之间的每个值都建立了一个对应的Integer 对象放入了一个数组中,这里的数组类似于缓存,提前给你准备好这个范围内的对象。由于Integer 是不可变类,因此这些缓存的Integer 对象可以安全的重复使用。

Integer i = XXX ,就是Integer i = Interger.valueOf(XXX), 首先判断XXX 是否在-128-127 之间,如果是直接return 已经存在的对象,否则就只能new 一个了。

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就是一个缓冲类,其代码如下:

    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[k] = new Integer(j++);

// range [-128, 127] must be interned (JLS7 5.1.7)
assert IntegerCache.high >= 127;
}

private IntegerCache() {}
}

看了这个类的代码,相信你也就明白为什么当出现Integer i = XXX;
Integer j = XXX;代码且XXX的值在-128~127范围内时,i、j就是指向的是同一个对象了。

而equals方法就比较简单,是比较两个对象的值是否相等,如果相等,则返回true,否则返回false.

Integer类中的equals方法的代码如下:

   public boolean equals(Object obj) {
if (obj instanceof Integer) {
return value == ((Integer)obj).intValue();
}
return false;
}

Integer/int类型的 ==

上面是两个Integer类型变量的==研究。下面是关于两个变量中一个是Integer类型,一个是int类型的==的研究。

package com.wrh.test;

public class Test2 {
public static void main(String[] args){
Integer a = 1;
int a2 = 1;
Integer a3 = new Integer(1);
//a自动拆箱
System.out.println(a==a2);//true
//a3自动拆箱
System.out.println(a3==a2);//true
//a2自动装箱
System.out.println(a.equals(a2));//true

}
}

结论:Integer对象和int变量是可以比较的,只是Integer对象先完成拆箱工作。


推荐阅读
  • 本文介绍了Web学习历程记录中关于Tomcat的基本概念和配置。首先解释了Web静态Web资源和动态Web资源的概念,以及C/S架构和B/S架构的区别。然后介绍了常见的Web服务器,包括Weblogic、WebSphere和Tomcat。接着详细讲解了Tomcat的虚拟主机、web应用和虚拟路径映射的概念和配置过程。最后简要介绍了http协议的作用。本文内容详实,适合初学者了解Tomcat的基础知识。 ... [详细]
  • Java中包装类的设计原因以及操作方法
    本文主要介绍了Java中设计包装类的原因以及操作方法。在Java中,除了对象类型,还有八大基本类型,为了将基本类型转换成对象,Java引入了包装类。文章通过介绍包装类的定义和实现,解答了为什么需要包装类的问题,并提供了简单易用的操作方法。通过本文的学习,读者可以更好地理解和应用Java中的包装类。 ... [详细]
  • 先看官方文档TheJavaTutorialshavebeenwrittenforJDK8.Examplesandpracticesdescribedinthispagedontta ... [详细]
  • 一、MyEclipse中的一些常用的快捷键:ctrl+shift+x大写ctrl+shift+y小写alt+内容提示写住方法的时候可以先写main然后按alt+就可以了ctrl+1 ... [详细]
  • 目录实现效果:实现环境实现方法一:基本思路主要代码JavaScript代码总结方法二主要代码总结方法三基本思路主要代码JavaScriptHTML总结实 ... [详细]
  • 本文介绍了OC学习笔记中的@property和@synthesize,包括属性的定义和合成的使用方法。通过示例代码详细讲解了@property和@synthesize的作用和用法。 ... [详细]
  • JavaSE笔试题-接口、抽象类、多态等问题解答
    本文解答了JavaSE笔试题中关于接口、抽象类、多态等问题。包括Math类的取整数方法、接口是否可继承、抽象类是否可实现接口、抽象类是否可继承具体类、抽象类中是否可以有静态main方法等问题。同时介绍了面向对象的特征,以及Java中实现多态的机制。 ... [详细]
  • 本文讨论了在Spring 3.1中,数据源未能自动连接到@Configuration类的错误原因,并提供了解决方法。作者发现了错误的原因,并在代码中手动定义了PersistenceAnnotationBeanPostProcessor。作者删除了该定义后,问题得到解决。此外,作者还指出了默认的PersistenceAnnotationBeanPostProcessor的注册方式,并提供了自定义该bean定义的方法。 ... [详细]
  • 本文介绍了Java高并发程序设计中线程安全的概念与synchronized关键字的使用。通过一个计数器的例子,演示了多线程同时对变量进行累加操作时可能出现的问题。最终值会小于预期的原因是因为两个线程同时对变量进行写入时,其中一个线程的结果会覆盖另一个线程的结果。为了解决这个问题,可以使用synchronized关键字来保证线程安全。 ... [详细]
  • 在重复造轮子的情况下用ProxyServlet反向代理来减少工作量
    像不少公司内部不同团队都会自己研发自己工具产品,当各个产品逐渐成熟,到达了一定的发展瓶颈,同时每个产品都有着自己的入口,用户 ... [详细]
  • Linux环境变量函数getenv、putenv、setenv和unsetenv详解
    本文详细解释了Linux中的环境变量函数getenv、putenv、setenv和unsetenv的用法和功能。通过使用这些函数,可以获取、设置和删除环境变量的值。同时给出了相应的函数原型、参数说明和返回值。通过示例代码演示了如何使用getenv函数获取环境变量的值,并打印出来。 ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • Java学习笔记之面向对象编程(OOP)
    本文介绍了Java学习笔记中的面向对象编程(OOP)内容,包括OOP的三大特性(封装、继承、多态)和五大原则(单一职责原则、开放封闭原则、里式替换原则、依赖倒置原则)。通过学习OOP,可以提高代码复用性、拓展性和安全性。 ... [详细]
  • 本文介绍了如何使用C#制作Java+Mysql+Tomcat环境安装程序,实现一键式安装。通过将JDK、Mysql、Tomcat三者制作成一个安装包,解决了客户在安装软件时的复杂配置和繁琐问题,便于管理软件版本和系统集成。具体步骤包括配置JDK环境变量和安装Mysql服务,其中使用了MySQL Server 5.5社区版和my.ini文件。安装方法为通过命令行将目录转到mysql的bin目录下,执行mysqld --install MySQL5命令。 ... [详细]
  • Java中处理大数据问题(BigInteger、BigDecimal)
    原文转自:https:blog.csdn.netzhongkeleearticledetails52289163;http:www.cnblogs.c ... [详细]
author-avatar
_郭士铭
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有