广告
返回顶部
首页 > 资讯 > 后端开发 > Python >Java Integer对象的比较方式
  • 137
分享到

Java Integer对象的比较方式

2024-04-02 19:04:59 137人浏览 独家记忆

Python 官方文档:入门教程 => 点击学习

摘要

目录Java Integer对象的比较自动装箱自动拆箱Integer初始化Integer对象之间的比较Integer类型变量比较问题代码1代码2代码3代码4关于这种现象,查了下资料,

Java Integer对象的比较

Integer对象之间的比较要考虑到对象初始化的不同情况,初始化又涉及到对象包装器类的自动装箱特性 。

自动装箱

Integer是一种对象包装器类。对象包装器类是不可变的,也就是说,一旦完成了构造,包装在其中的值就不可以再被更改了。包装器类有一种特性,自动装箱。当需要一个Integer类型的对象时,可以对int类型的元素进行自动打包的操作。如果添加3到list中,实际调用的是下面的代码。


ArrayList<Integer> list = new ArrayList(); 
list.add(3);
list.add(Integer.valueOf(3));

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 =
                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() {}
    }

JVM会维护一个Integer的数组,将值在某个范围内(默认-128~127)的对象缓存起来,在这个范围内的int会被包装到固定的对象中,valueOf会返回缓存中的对象。如果不在这个范围内,则会创建一个新的对象。注意,使用new创建的新对象是在堆中的,这一点会影响到Integer对象之间的比较结果。

自动拆箱

与自动装箱对应的,存在自动拆箱操作。当将一个Integer对象赋值给一个int值时,编译器就会插入对象拆箱指令。


int n = list.get(i);
int n = list.get(i).intValue();

intvalue()源代码就很简单了,返回对象的value属性


    public int intValue() {
        return value;
    }

Integer初始化

1.初始化Integer的时候,可以直接用一个int值赋值,实际上会自动装箱。


Integer n1 = 3;
Integer n1 = Integer.valueOf(3);

2.当然也可以使用new来创建Integer对象.


Integer n2 = new Integer(3);

Integer对象之间的比较

由于IntegerCache的存在,使用第一种方法初始化的对象,如果值的范围在-128~127之间,则相同的值会被包装的同一对象中。而用new产生的对象肯定不会在同一内存区域。

==运算符

如果使用==运算符进行比较的话,由于检测的是对象是否指向同一个内存区域,由于初始化时的不确定性,比较的结果也可能不是我们想要的。如下所示:


        Integer n1 = new Integer(47);
        Integer n2 = new Integer(47);
        Integer n3 = 47;
        Integer n4 = 47;
        Integer n5 = 200;
        Integer n6 = 200;
 
        System.out.println(n1 == n2);   //false,两个new的对象
        System.out.println(n1 == n3);   //false  n1在堆中,n3指向IntegerCache缓存(方法区中)
        System.out.println(n3 == n4);   //true   都指向缓存中同一个对象
        System.out.println(n5 == n6);   //false  超出缓存范围,分别是两个new出来的对象

equals

所以为了保持对象之间比较结果的一致性,同时我们进行比较的初衷应该也是比较它们之间的值,所以使用equals方法


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

Integer类重写了object的equals方法,调用时实际比较的是两个对象的值,和对象存储在哪里没有关系。

Integer类型变量比较问题

今天在做实验的时候,发现了一个比较奇怪的问题:两个Integer型变量用==进行比较时,有时候能成功有时候不能成功。举个例子:

代码1


Integer l1 = 122;
Integer l2 = 122;
if(l1 == l2)
    System.out.println("Right");
else
    System.out.println("Wrong");

  

运行这段代码时,程序会输出:Right。对于另一个例子:

代码2


Integer l1 = 233;
Integer l2 = 233;
if(l1 == l2)
    System.out.println("Right");
else
    System.out.println("Wrong");

  

运行这段代码时,程序会输出Wrong。但当对代码2进行修改时:

代码3


Integer l1 = 233;
int l2 = 233;
if(l1 == l2)
    System.out.println("Right");
else
    System.out.println("Wrong");

在运行这段代码时,程序会输出Right。如果换一种定义方式时:

代码4


Integer l1 = 233;
Integer l2 = new Integer(233);
if(l1 == l2)
    System.out.println("Right");
else
    System.out.println("Wrong");

运行这段代码时,程序会输出Wrong。

关于这种现象,查了下资料,总结如下

1.实际上Java中定义的Integer变量会通过Integer.valueOf()方法生成一个实例,即:

Integer l1 = 122 会被编译成 Integer l1 = Integer.valueOf(122),而关于valueOf()方法的源码


public static Integer valueOf(int i) {
         assert IntegerCache.high >= 127;
         if (i >= IntegerCache.low && i <= IntegerCache.high)
             return IntegerCache.cache[i + (-IntegerCache.low)];
         return new Integer(i);
     }

看一下源码就会明白,对于-128到127之间的数,会进行缓存,Integer l1 = 122时,会将122进行缓存,下次再写Integer l2 = 122时,就会直接从缓存中取,就不会new了,相当于生成的为同一个对象,。所以代码1的运行结果是Right。

而对于这个范围之外的数值,valueOf()相会重新new一个对象,所以就不相等了,所以代码2的裕兴结果就是Wrong。

2.对于代码3,Integer型变量与int型变量进行比较时,实质上是把Integer类型变量拆箱成int类型,然后进行比较,相等则返回true,否则返回false。此处的拆箱调用的是intValue()方法。所以代码3的运行结果是Right。

3.对于代码4,就比较好解释了,因为new相当于重新定义了一个新的对象,即l1的引用实质是指向在堆中了,而l2实质是指向在常量池中了,所以两者是不可能相等的,故输出结果就是Wrong。

4.总之,要想比较两个Intger型变量的值最好用Integer.intValue()方法生成int型后再比较。

5.Integer型变量与int型变量之间可以直接比较,此时自动进行拆箱操作。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程网。

--结束END--

本文标题: Java Integer对象的比较方式

本文链接: https://www.lsjlt.com/news/136106.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Java Integer对象的比较方式
    目录Java Integer对象的比较自动装箱自动拆箱Integer初始化Integer对象之间的比较Integer类型变量比较问题代码1代码2代码3代码4关于这种现象,查了下资料,...
    99+
    2022-11-12
  • Java各种比较对象的方式的对比总结
    一、==和!=操作符 让我们从==和!=开始可以分别判断两个Java对象是否相同的操作符。 1.1 原始类型(Primitives) 对于原始类型,相同意味着具有相等的值: as...
    99+
    2022-11-12
  • java对象的比较
    java对象的比较 🐱1. 问题提出🐱🐶2. 元素的比较🐶2.1 基本类型的比较2.2 对象的比较 🐭 3....
    99+
    2023-08-31
    java 算法 数据结构
  • 比较JavaScript对象的四种方式
    目录前言引用比较手动比较浅层比较深层比较总结前言 比较JavaScript中的原始值非常简单。只需使用任何一种可用的相等运算符即可,例如严格相等运算符: 'a' === 'c';...
    99+
    2022-11-12
  • java中各种对象的比较方法
    目录前言1. 问题提出2. 元素的比较2.1 基本类型的比较2.2 对象的比较3. 对象的比较3.1 覆写基类的equal3.2 基于Comparble接口类的比较3.3 基于比较器...
    99+
    2023-05-18
    java对象比较方法 js 对象比较 java对象的比较
  • 浅谈java对象的比较
    目录1、元素的比较2、类的比较3、比较方法3.1 重写equals方法3.2 基于Comparble接口类的比较3.3 基于比较器比较基于比较器比较:Comparator接口3.4 ...
    99+
    2022-11-12
  • JavaScript 对象的四种方式比较详解
    目录前言1. 引用比较2. 手动比较3. 浅层比较4. 深层比较5. 总结前言 比较 JavaScript 中的值非常简单,只需用相等运算符即可,例如严格相等运算符: 'a' ===...
    99+
    2022-11-13
  • 详解java关于对象的比较
    目录同类型对象的比较样例引入相等性判断总结同类型对象的比较 三个维度去比较 同一性 相等性 相似性 样例引入 想象一下这样的一个场景:小王去图书馆借了一本java核心技术卷1,如图 ...
    99+
    2022-11-12
  • redis存储对象方法的比较
    本篇内容主要讲解“redis存储对象方法的比较”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“redis存储对象方法的比较”吧!redis 存储对象的方法对比问题背景:原来项目里面全部是直接red...
    99+
    2023-06-20
  • Java数据结构之对象的比较
    目录元素比较基本类型的比较对象的比较对象如何进行比较覆写基类的equal基于Comparble接口类的比较基于比较器的比较集合框架中PriorityQueue(优先级队列)的比较方式...
    99+
    2022-11-13
  • Java中对象比较的示例分析
    这篇文章主要介绍了Java中对象比较的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。元素比较基本类型的比较在Java中,基本类型的对象可以直接比较大小public&n...
    99+
    2023-06-29
  • 【数据结构Java版】对象的比较之Comparable与Comparator比较器
    目录   一、基本类型的比较 二、对象类型的比较 (1)对象类型比较出现的问题 (2)重写基类equals方法 (3)基于Comparable接口的比较 1.实现Comparable接口,重写compareTo方法 (4)基于Compara...
    99+
    2023-09-06
    数据结构 比较 Comparable Comparator 算法
  • 比较JavaScript 对象的四种方式分别是怎样的
    比较JavaScript 对象的四种方式分别是怎样的,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。 比较 JavaS...
    99+
    2022-10-19
  • java怎么比较两个对象的内容
    在Java中比较两个对象的内容通常有以下几种方法: 使用equals()方法:重写equals()方法可以比较两个对象的内容。eq...
    99+
    2023-10-28
    java
  • java怎么比较对象是否相等
    在Java中,可以使用以下几种方法来比较对象是否相等: 使用`==`运算符:`==`运算符用于比较两个对象的引用是否相等,即是否...
    99+
    2023-10-28
    java
  • 在Java中怎么比较两个对象
    这篇文章主要为大家展示了“在Java中怎么比较两个对象”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“在Java中怎么比较两个对象”这篇文章吧。Common Lang 中的 Builder 包内提...
    99+
    2023-06-21
  • Java比较两个对象大小的三种方法详解
    目录一. 为什么需要比较对象二. 元素的比较1. 基本类型的比较 2. 引用类型的比较 三. 对象比较的方法1. equals方法比较2. 基于Comparabl...
    99+
    2022-11-13
  • java中对象的比较equal、Comparble、Comparator的区别
    目录关于对象值相等的比较三种比较风格覆写基类的equal关于对象值大于、等于、小于的比较–基于自然顺序(按照<小于号的形式)基于Comparble接口类的比较关于对象值大于、等...
    99+
    2022-11-12
  • java中关于对象的实例比较分析
    本篇内容主要讲解“java中关于对象的实例比较分析”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“java中关于对象的实例比较分析”吧!同类型对象的比较三个维度去比较同一性相等性相似性样例引入想象...
    99+
    2023-06-26
  • Java数据结构之对象比较详解
    目录1. PriorityQueue中插入对象2. 元素的比较2.1 基本类型的比较2.2 对象比较的问题3. 对象的比较3.1 覆写基类的equals3.2 基于Comparble...
    99+
    2022-11-13
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作