[java] Integer类解析

Java源码学习之Integer类(一) 断断续续地,看完了Integer类,基本上了解了主要函数的原理之类的,下面是完整的源码和我的粗略翻译、注释以及一些吐槽。。有错请纠错QAQ。源码加注释之类的大概有1600多行,之后会挑几个重点难点的函数单独开博文讲,这里就当是个纪念~~学习的第一个Java类~ 以下源码来自jdk的src.zip。/* * Copyright (c) 1994, 2013, Oracle and/or its a 阅读详情

本篇文章基于jdk1.8

概述

Integer类定义如下:

public final class Integer extends Number implements Comparable<Integer> {

}

它是一个final修饰的类,意味着它不可被继承,也提供了相对比较完善的功能。

Integer类是原始类型int的包装类,一个Integer类的对象包含有一个单独的类型是int的字段。这个类提供了几种将int转换为String和String转换为int的方法,以及处理int时有用的其他常量和方法。

bit twiddling方法比如highestOneBit(int)方法和numberOfTrailingZeros(int)方法的实现都是基于 Henry S. Warren, Jr.'s提供的材料

Integer类的一个成员变量是:

  /**
     * The value of the {@code Integer}.
     *
     * @serial
     */
    private final int value;

这个成员变量value即是Integer类的int值的存储变量。

Integer类的最大最小值定义如下

/**
		 * 最小值:-2147483648
		 */
		@Native
		public static final int MIN_VALUE = 0x80000000;
 
		/**
		 * 最大值:2147483647
		 */
		@Native
		public static final int MAX_VALUE = 0x7fffffff;

parseInt方法

parseInt方法源代码当中最重要的实现逻辑如下:
        int result = 0;
        boolean negative = false;
        int i = 0, len = s.length();
        int limit = -Integer.MAX_VALUE;
        int multmin;
        int digit;

        if (len > 0) {
            char firstChar = s.charAt(0);
            if (firstChar < '0') { // Possible leading "+" or "-"
                if (firstChar == '-') {
                    negative = true;
                    limit = Integer.MIN_VALUE;
                } else if (firstChar != '+')
                    throw NumberFormatException.forInputString(s);

                if (len == 1) // Cannot have lone "+" or "-"
                    throw NumberFormatException.forInputString(s);
                i++;
            }
            multmin = limit / radix;
            while (i < len) {
                // Accumulating negatively avoids surprises near MAX_VALUE
                digit = Character.digit(s.charAt(i++),radix);
                if (digit < 0) {
                    throw NumberFormatException.forInputString(s);
                }
                if (result < multmin) {
                    throw NumberFormatException.forInputString(s);
                }
                result *= radix;
                if (result < limit + digit) {
                    throw NumberFormatException.forInputString(s);
                }
                result -= digit;
            }
        } else {
            throw NumberFormatException.forInputString(s);
        }
        return negative ? result : -result;

可以看到实现的方法是通过String类的charAt方法去获取字符,然后传入类Character的digit方法当中。

equals方法

Integer类重写了equals方法,实现如下:

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

即比较两个Integer对象的int值是否相等。

Integer类的缓存实现

在看Integer类的缓存之前不妨先来看一段代码


public class IntegerTest {
    public static void main(String[] args) {
        Integer int1 = Integer.valueOf("100");
        Integer int2 = Integer.valueOf("100");
        System.out.println(int1 == int2);

        Integer int3 = Integer.valueOf("1000");
        Integer int4 = Integer.valueOf("1000");
        System.out.println(int3 == int4);
    }
}

这段代码的打印结果为:

true

false

第二个打印结果为false可以理解,毕竟比较的是对象,那么为什么第一个比较的结果却是true呢,答案就在Integer类的缓存里面。在Integer类当中有一个内部类用于实现缓存。

 /**
     * Cache to support the object identity semantics of autoboxing for values between
     * -128 and 127 (inclusive) as required by JLS.
     *
     * The cache is initialized on first usage.  The size of the cache
     * may be controlled by the {@code -XX:AutoBoxCacheMax=<size>} option.
     * During VM initialization, java.lang.Integer.IntegerCache.high property
     * may be set and saved in the private system properties in the
     * sun.misc.VM class.
     */

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

以上代码的作用就是,使用了一个静态cache数组,初始化时数组将一定范围的整数放到cache数组中。因此在使用Integer类的时候,它已经把-128到127的整数都提前实例化了。 这就解释了上面的例子程序的结果,不管创建多少个这个范围内的Integer用ValueOf出来的都是同一个对象。

因为ValueOf方法的实现就用到了这个缓存,如下:

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

一目了然,若传入的参数i在cahce的最大值和最小值之间,那么就直接返回cache当中的值,省去了实例化的步骤。

bitCount方法

该方法的目的是就算一个十进制的数对应的二进制数当中1的个数,实现如下:

public static int bitCount(int i) {
    // HD, Figure 5-2
    i = i - ((i >>> 1) & 0x55555555);
    i = (i & 0x33333333) + ((i >>> 2) & 0x33333333);
    i = (i + (i >>> 4)) & 0x0f0f0f0f;
    i = i + (i >>> 8);
    i = i + (i >>> 16);
    return i & 0x3f;
}

关于它的解释可以参考:https://blog.youkuaiyun.com/qq_33516547/article/details/78156879?locationNum=9&fps=1

Java源码解析之Integer类详解 Integer类是一个非常基础的类,在我们的代码中随处可见,但是又有多少人真正理解它的实现,它又有哪些坑呢 阅读详情

相关推荐

LSCM最小二乘保角参数化

LSCM最小二乘保角参数化 最小二乘思想 已知一组点的数据(x,y) x x1x_1x1​ x2x_2x2​ x3x_3x3​ … xnx_nxn​ y y1y_1y1​ y2y_2y2​ y3y_3y3​ … yny_nyn​ 可以近似为线性关系 y=ax+by=ax+by=ax+b ,目标为确定常数 aaa , bbb ; 解法:找到 aaa , bbb ,使得所有 yiy_iyi​ 与 axi+bax_i+baxi​+b 偏差的平方和 Q=∑i=1n(yi−axi−b)2 Q=\s

weixin_49732532的博客 4252

java.lang.NumberFormatException For input string 错误及解决办法

这种问题我遇到过两次不同的,一种是 String 转换为 int 型报错,另一种是 String 转换为 double 报错,其实是同一类型的错误,只是我运用的不同场景,忽略了本质。 第一种、错误提示信息如下: Exception in thread "main" java.lang.NumberFormatException: For input string: "1 " at java.lang.NumberFormatException.forInputString(NumberFormatExce

web18484626332的博客 6528

「极简」扣子(coze)教程 | 细节决定成败!这个小功能让用户满意度飙升,讲的太细了

这一期大师兄通过向扣子(coze)应用添加提示语的方法向用户显示系统运行的状态。

u014527622的博客 2113

java.lang.NumberFormatException 错误及解决办法

总结几个java.lang.NumberFormatException 错误及解决办法方法转载https://blog.csdn.net/xiaodongvtion/article/details/8835668/转载https://blog.csdn.net/yxh6533/article/details/79376821第一种1. package com.geelou.test;2. 3. p...

just_do_it_one的博客 12万+

构建面向嵌入式Linux的ARM64交叉编译工具链:从sysroot配置到CMake实战

本文详细介绍了如何构建面向嵌入式Linux的ARM64交叉编译工具链,从sysroot配置到CMake实战。通过分步指导,帮助开发者解决架构不一致问题,提升编译效率,特别适用于树莓派等ARM64设备开发。文章涵盖sysroot机制、环境搭建、CMake配置及常见问题解决方案,是嵌入式开发的实用指南。

weixin_42537142的博客 199

从转发时钟到嵌入式时钟:CDR、CTLE与DFE在高速串行链路中的协同演进

本文深入探讨了高速串行链路中CDR、CTLE与DFE技术的协同演进。从转发时钟到嵌入式时钟的转变,详细分析了CDR的工作原理与实现架构,以及CTLE和DFE在信道损耗补偿和ISI干扰消除中的关键作用。通过实战案例展示了这些技术在28Gbps至112Gbps SerDes设计中的优化策略与性能提升。

weixin_42539414的博客 294

java.lang.NumberFormatException: For input string: 错误及解决办法

这种问题我遇到过两次不同的,一种是 String 转换为 int 型报错,另一种是 String 转换为 double 报错,其实是同一类型的错误,只是我运用的不同场景,忽略了本质。 第一种、错误提示信息如下: Exception in thread "main" java.lang.NumberFormatException: For input string: "1 " at java.lang.NumberFormatException.forInputString(NumberFormatExce

weixin_43800761的博客 20万+

Microapp 接入vite子应用

MicroApp接入vite版本,干货满满,手把手步骤说明,加上报错说明,赶紧上车!

outsider76557的博客 4660

深入解析Java Integer类

本文深入解析了Java中的Integer类,重点分析了其缓存机制、位操作方法和字符串转换功能。Integer通过IntegerCache实现-128到127的自动装箱缓存,提升性能但需注意==比较的陷阱。核心方法包括高效的位操作(如bitCount、numberOfLeadingZeros)、字符串转换(parseInt、toString)和循环移位(rotateLeft)等,许多方法采用《算法心得》中的经典算法并通过@IntrinsicCandidate优化为CPU指令。

lifallen的博客 1169

别再让 AI 瞎写 SAP 代码了!这套 Claude Code Skill 的验证机制才是关键

本文深入解析了专为SAP CAP开发设计的AI辅助工具sap-cap-capire的技术架构。该工具采用四层设计:协议层集成MCP和LSP实现实时模型访问与语法检查;智能层通过4个专业化Agent(数据建模、服务开发等)分工协作;验证层确保代码质量;知识层存储文档模板。这种工程化设计解决了通用AI在CAP开发中面临的上下文不足、专业性缺失和代码质量保证等核心问题,通过本地化服务和实时反馈机制显著提升了开发效率。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 882

全网最全-QCC51xx-QCC30xx(TWS)系列从入门到精通开发教程汇总(持续更新中)

QCC3040开发笔记之基本介绍(0) QCC3040开发笔记之开发环境搭建(1) QCC3040开发笔记之debug调试(trb调试,usbt调试,adb调试,WIFI调试)(2) QCC3040开发笔记之按键配置(3) QCC3040开发笔记之按键切换(4) QCC3040开发笔记之按键逻辑(5) QCC3040开发笔记之tone(6) QCC3040开发笔记之提示音(7) QCC3040开发笔记之bitserial接口(8) QCC3040开发笔记之双mic+AEC+ANC(9...

心跳包的博客 3万+

【Java】Integer包装类:深入解析与拓展

Java 作为一门强类型语言,对于数据类型的定义和管理有着严格的规范。在 Java 中,基本数据类型和对象类型的区别常常是初学者和开发者容易混淆的地方。尤其是 **包装类(Wrapper Class)**,它们不仅在日常编码中频繁出现,还涉及到许多底层的自动转换机制。今天我们将深入解析 Java 中的 `Integer` 类,它是 `int` 类型的包装类,类似于 `int` 的“增强版”,但更复杂且具备更多功能。我们将详细讲解 `Integer` 的基本概念、应用场景、自动装箱和拆箱机制以及其他常见操作。

禅宗里有一个词叫做“因缘和合”。 所谓因缘,是指事件要发生所必须的条件。因缘和合就是当你聚集了这件事的一切条件,它就会自然而然的发生。“它就会自然而然的发生”,这种朴素而坚定的价值观让我们感到无比安心,安心到可以不用有任何担心焦虑。 1555

Trae 保姆级使用指南,零基础小白也能实现编程。

Trae 使用指南 Trae AI 使用 零基础编程 满血版 DeepSeek-R1&V3 AI IDE 深度理解中文开发场景 傻瓜式编程 编程入门 开发入门

Mr.L-OAM的博客 5817

java integer类_JAVA Integer类常用方法解析

JAVA中Integer类下的常用方法有哪些?1.进制转换 n进制转10进制 字符串结果Integer.parseInt(String s, int radix);radix范围为2-36(包括0-9,a-z)string输入为二进制字符串System.out.println( Integer.parseInt("10000",2));//162.int转二进制字符串System.out.prin...

weixin_29732787的博客 544

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

Java包装类性能优化:深入解析Integer享元模式的源码实现

在中,每一个基本类型都有对应的包装类。其中,Integer作为最常用的包装类之一,其内部实现巧妙地运用了,通过显著提升了性能。本文将深入剖析Integer类的享元模式实现,重点解析valueOf()方法的底层源码。

2201_75490194的博客 832

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

java Integer类的==比较解析

1代码 Integer a= new Integer(200); Integer b= new Integer(200); Integer c= 200; Integer d= 200; int e= 200; System.out.println(a==b); System.out.println(a==c); System.out.println(d==c); System.out.println(e==c); System.out.println(e==a);

wuxiao3816的博客 622

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

java integer源码_Java源码解析之Integer类的使用详解和源码解析

一、Integer与int的区别和联系1.Integer是int的包装类,int则是java的一种基本数据类型2.Integer的默认值是null,int的默认值是03.Integer变量必须实例化后才能使用,而int变量不需要4.Integer实际上只是对象的引用,当new一个Integer时,实际上是在栈中有一个地址,指向堆中的具体值;而int则是直接存储数据值到栈中二、Integer类的定义...

weixin_31998661的博客 504

Java包装类深度解析:从Integer缓存机制到String与int的高效互转

本文深入解析Java包装类的核心机制,重点探讨Integer缓存机制、自动装箱与拆箱原理,以及String与int/Integer的高效互转方法。通过实战案例和性能优化建议,帮助开发者掌握包装类的使用技巧,提升代码效率与安全性。

weixin_30675247的博客 412

Java---详细解析包装类 让你彻底明白 Integer 类和 int 基本数据类型的区别

Integer类    对应的是基本数据类型 int 类型的包装类    任意的一个基本数据类型都有一个class属性    class使用来描述显示事物的, int这个基本数据类型也是一个事物 Number类中的常用方法    byte byteValue()      以 byte 形式返回指定的数值。    abstract double doubleValue()   ...

小猿的博客 413

Java中Integer类比较问题解析

开发过程中大家可能会遇到integer类比较的问题,虽然看上去值一样但是比较的结果就是不相同。 public static void main(String[] args) { Integer num1 = 1111; Integer num2 = 1111; System.out.println(num1 == num2); ...

代码的诱惑 309

深度解析Java中的Integer类原理及方法实现

在Java编程中,我们经常使用Integer类来处理整数值。接下来,让我们通过结合Integer类的源码、设计思想以及方法和接口的设计,详细探讨其底层原理。

jakelihua 512

java基础类解析(1)-Integer

Integer类解析

wthfeng的专栏 1073

Java源码阅读之Integer

Java源码阅读之Integer类定义类属性构造方法方法 类定义 public final class Integer extends Number implements Comparable<Integer> 1.类定义为final,不允许继承Integer类 2.类继承自Number类,需要提供Number定义的抽象方法,例如longValue() 3.类实现了Comparab...

qq_29464919的博客 162

Java基础疑点解析 1、基本数据类型,引用数据类型, 包装类 2、Int与Integer的关系

1、基本数据类型,引用数据类型, 包装类 1.1、计算机存储单元 计算机可以用来存储数据,但无论是内存还是硬盘,计算机存储设备的最小信息单元叫“位(bit)”,我们又称为“比特位”,通常用“b”表示。而计算机中最基本的存储单元叫“字节(byte)”,通常用“B”表示。字节是连续的8个位组成。 除了字节外还有一些常用的存储单位, 1B(字节) = 8bit 1KB = 1024B 1MB = 1024KB 1GB = 1024MB 1TB = 1024GB 1.2、数据类型 Java语言是强类型语言,对于每一

qq_44403157的博客 229
上一篇: [java] System类深度解析
下一篇: [java] ThreadLocal类解析
topEngineerr
博客等级 码龄11年 627粉丝 157原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值