你的Java功底很深?Integer源码解读让你怀疑人生

闲人闲谈PS之十二——WBS-BOM在装备制造项目中的实战解析 本文深入解析了WBS-BOM在装备制造项目中的核心应用。针对按订单设计/生产的行业痛点,WBS-BOM作为项目专属物料清单,完美连接SAP PS与PP模块,确保MRP能基于项目进行精准物料需求计算,实现从设计到生产的全链路项目化跟踪与管理。 阅读详情

点击上方“java患者” 可以订阅哦!

关于Integer的讲解

1

main方法中有a,b两个变量,且为Integer类型。通过调用本类的swap方法将二个值互换,并在main方法中输出结果。

——AA

实例代码如下方:

public static void main(String[] args) {
        Integer a = 1;
        Integer b = 2;
        System.out.println("before swap: a="+a+",b="+b);
        swap(a,b);//这是一个Integer交换值的方法
        System.out.println("after swap: a="+a+",b="+b);
    }

    private static void swap(Integer num1,Integer num2){
        Integer tmp = num1;
        num1 = num2;
        num2 = tmp;
    }

1

调用swap方法是传递是的a,b的引用给num1和num2,方法调用完毕时,a和b指向的地址并未发生改变。

那么我们该如何传递?

1. 我们先分析Integer a = 1;到底做了些什么?我们看一下他的字节码:

第一条可以看出,JVM采用iconst指令将常量1压入栈的栈顶,然后调用Integer.valueOf(1),进行装箱操作。

2. 我们来看Integer内部如何赋值的。

下面我们来看下Integer里面的源代码:

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

也就是说,实际上a=1;内部的最终操作说对Integer里面的value进行赋值。那我们在swap方法去改变这个value的值可解决我们的问题,显然,我们可以利用到反射来完成。

下面是进一步代码:

private static void swap(Integer num1,Integer num2){
        try {
            Field field = Integer.class.getDeclaredField("value");
            field.setAccessible(true);
            int tmp = num1;
            field.set(num1,num2);
            field.set(num2,tmp);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

运行后的结果为:

before swap: a=1,b=2
after swap: a=2,b=2

3. 为啥是这样这,a确实改过来了,b为啥改不了?

这牵扯到装箱和拆箱,我们再来看下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);
}

当i的值在[IntegerCache.low, IntegerCache.high]区间内,从cache数组缓存中取。low值是-128,hight值是127。也就是说,如果值是[-128,127]间是从缓存中取。而cache数组元是不同整数-128到127从小到大排列。如cache[129]=1;如果不在这范围内,就进行new Integer(i)。

我们重点来看这三行代码

int tmp = num1;
field.set(num1,num2);
field.set(num2,tmp);

在field.set(num1,num2)过程中,由于set的二个参数都为Object。第一步先取num2值进行装箱,num2是2,在[-128,127]间,从缓存中取,下标是2+128=130,即cache[130]为2。第二步是赋值,相当于cache[129]=2;

在field.set(num2,tmp);过程中,tmp是值为1,自动装箱从缓存中取,索引为129。cache[129]已是为2了,其赋值相当是cache[130]=2,

所以最终输出结果是a为2,b为2。

最后,我们有一个结论,当我们的值在[-128,127]间从cache缓存中取。所以有一下两种情况:

Integer a = 1;
Integer b = 1;
System.out.println(a==b);//true
Integer a = 128;
Integer b = 128;
System.out.println(a==b);//false,不在[-128,127]内,比较地址。

4. 最终解决方案

方案一:

try {
            Field field = Integer.class.getDeclaredField("value");
            field.setAccessible(true);
            int tmp = num1;
            field.set(num1,num2);
            field.set(num2,new Integer(tmp));
        } catch (Exception e) {
            e.printStackTrace();
        }

此时是以一个新的对象,不会从缓存中取。

方案二:

try {
            Field field = Integer.class.getDeclaredField("value");
            field.setAccessible(true);
            int tmp = num1;
            field.set(num1,num2);
            field.setInt(num2,tmp);
        } catch (Exception e) {
            e.printStackTrace();
        }

不产生装箱操作,直接set一个int类型。就不会从缓存中取。

历史文章

初识Spring Data 全家族(1)

限时下载|500G编程资料:springboot、vue、mybatis源码分析、vue、项目实战、数据结构与算法、C语言等

点击蓝字关注我们

UE4入门实例17(Unreal制作卡通Post Process材质球) 效果展示 #1 创建Post Porcess材质球 #2 编写Shader功能 #3 设置场景区域内风格化渲染 #1 创建Post Porcess材质球 #2 编写Shader功能 创建基础效果 移除现有通道渲染 设置视图渲染范围 #3 设置场景区域内风格化渲染 #4 加群下载Shader源码:284105567 ... 阅读详情

相关推荐

信息系统项目管理师(高项)重点!

学习高项自己做的笔记

PanJWei的博客 3299

Integer 类源码分析

Integer 类在对象中包装了一个基本类型 int 的值。Integer 类对象包含一个 int 类型的字段。此外,该类提供了多个方法,能在 int 类型和 String 类型之间互相转换,还提供了处理 int 类型时非常有用的其他一些常量和方法。

m0_55993923的博客 705

UEC++ 虚幻5笔记(数字孪生示例) day13

文件读取与写入,数字孪生入门制作

qq_44924388的博客 3842

Java 8 中Integer 包装类源码实现与分析

虽然基本数据类型 byte、short、int、long、float、double 经常使用,但是我们平时可能并不会过多关注其相应的包装类 Byte、Short、Int、Long、Float 、Double,这里以 Integer 类为例,分析其具体源码的实现

ranxiaotop的博客 340

Win10/Win11系统下,用VSCode编译Betaflight固件最全避坑指南(从GCC安装到HEX生成)

本文详细介绍了在Win10/Win11系统下使用VSCode编译Betaflight固件的完整流程,包括GCC安装、环境变量配置、终端选择、Make工具安装等关键步骤,帮助开发者避开常见陷阱,高效生成HEX文件。特别针对VSCode环境优化和编译错误排查提供了实用解决方案。

weixin_42557803的博客 415

OpenCode:开源代码智能代理平台的全面解析

OpenCode是一个开源代码智能代理平台,采用模块化微服务架构,支持多种AI模型集成。该系统包含前端交互层、代理服务层和模型集成层,提供Build、Plan和General三种代理模式,分别负责代码编写、分析和复杂任务处理。OpenCode支持跨平台安装,具备权限验证、上下文感知等安全机制,并集成LSP协议实现深度代码理解。相比竞品,其开源特性、终端优先设计和提供商无关架构具有明显优势,适用于个人开发、团队协作等多种场景,为开发者提供强大的AI辅助编程能力。

Aaron_945的博客 1423

Integer 类源码解读

Integer 是 int 的包装类,包装了一个基本类型 int 的值。该类提供常用得多种方法,值得我们去探究一下。 定义 Integer 类的定义语句如下: public final class Integer extends Number implements Comparable<Integer> 从这里我们可以了解到以下几点: 被 final 关键字修饰过,所以该类不可以被继承。 该类继承了 Number 父类(可以看 Number 类解读),所以 Integer 类重写了对应方法,

weixin_43127268的博客 534

DCM4CHEE Archive Light 应用配置-存储配置

本文介绍了在DICOM归档系统中配置和管理存储的方法,包括通过用户界面和LDAP导入两种方式。主要内容包括: 存储配置概述:用户可根据需求配置单个或多个存储设备,支持在磁盘空间不足或多任务并行时使用。存储分为Archive设备级(序列元数据存储)和Application Entity级(对象存储/元数据存储)。 用户界面操作: 设备级存储配置:通过菜单导航添加/编辑存储描述符,设置Storage ID、URI等关键参数 应用级存储引用:在设备扩展和网络AE中分别配置元数据和对象存储引用 LDAP配置方法:

洪城叮当的博客 1416

Integer源码解析

一、前言     Integer类是我们经常用到的一个基础类,学习其底层结构有助于我们在项目中更加得心应手的使用他,并且能够有效避免Integer所遇到的坑。这篇博客主要是介绍Integer经常使用的几个方法其源码是怎么做的,而且针对Integer的一些变量进行解释,这会有助于我们读懂Integer的源码。 二、源码解析 继承了哪些类     由上图可知Integer继承了Number抽象类和实现了Comparable接口。

weixin_42146366的博客 707

树莓派3-改装wifi外置天线

声明:本文只是技术性探讨,改装引起的产品损坏等后果,由用户自负! 改装主要有两种方法 方法一:直接替换原来的天线 1、移除原有的小陶瓷天线,就在Made in PRC(或UK)那边的那个 清理一下阻焊剂方便天线接地(图中PRC左侧) 2、焊接天线 天线的屏蔽层焊接到清理完阻焊剂的地方,中间的信号线焊接到PRC右侧焊盘。 3、最终的样子

huayucong的博客 2万+

MATLAB离线附加功能包下载与安装教程

本文介绍如何下载与安装MATLAB离线附加功能包,便于大家更加高效的使用MATLAB。

加斯顿工程师的博客 1万+

包装类之Integer源码分析

源码分析Integer的缓存机制,自动拆箱和装箱原理,以及Integer中常见的数组有何作用

m0_60505735的博客 315

Xilinx DDR3 MIG IP核设计--汇总导航

快速上手Xilinx DDR3 IP核----汇总篇

孤独的单刀 2万+

【后端之旅】源码分析 Integer 篇

比较本包装(Integer)对象对应的值和给定的 anotherInteger 对象对应的值,如果前者小于后者返回 -1,如果前者大于后者返回 1,否则返回 0。- 根据给定的字符串 nm,返回一个包装(Integer)对象,如果 nm 解析的结果为 null,则返回 val 的包装(Integer)对象。- 返回整数 i 的符号值,如果 i 为 0 则返回 0,如果 i 为正数则返回 1,如果 i 为负数则返回 -1。

2401_89221445的博客 716

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

java基础-Integer源码全解

Integer源码1 字段2 方法2.1 parseInt2.2 bitCount2.2.1 bitCount源码解析2.2.2 汉明重量2.3 highestOneBit2.4 lowestOneBit2.5 equals2.6 hashCode2.7 compareUnsigned2.8 numberOfLeadingZeros2.9 numberOfTrailingZeros2.10 reverse2.11 toString2.12 toBinaryString、toOctalString、toHex

471

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

Integer源码详解

一、结构图 二、Integer类介绍 1、静态属性方法介绍 @Native public static final int MIN_VALUE = 0x80000000; @Native public static final int MAX_VALUE = 0x7fffffff; public static final Class<Integer> TYPE = (Class<Integer>) Class.getPrimitiveClass("int"); //

weixin_45841729的博客 1258

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

Java面向对象高级语法实验2

(一)请打印下列程序输出结果,并思考自动装箱和拆箱在java中的好处。 public class AutoPackingTest { public static void main(String[] args) { Integer A = 3; int a = A; System. out.println(a); Integer A1 = 3; System.out.println(A == A1); A = 129;A1 =129; .

半濠春水的博客 2434

synchronized配合Integer使用的问题

经典卖票案例,使用synchronized配合Integer保证线程安装,发现并不能达到效果,上代码。

程序员糖豆的博客 577

Integer源码解读

Java-Integer源码解读问题导入二级目录三级目录 问题导入 Integer a=9527; Integer b=9527; System.out.println(a==b); System.out.println(a.equals(b)); Integer c=97; Integer d=97; System.out.println(c==d); System.out.println(c

小小本科生 731

java的Integer类源码详解

java的Integer类源码详解 类的定义 public final class Integer extends Number implements Comparable<Integer> { @Native public static final int MIN_VALUE = 0x80000000; @Native public static fina...

悦分享 2751

Integer类的源码解读

1. 继承关系 Integer继承自抽象类Number,实现了Comparable<>接口. 2. IntegerCache内部类 他还有一个IntegerCache内部类,里面存了-128到127的Integer对象; 当我们用int数据给Integer型对象引用赋值时,采用自动装箱的办法,调用valueOf()方法; public static Integer valueOf(int i) { if (i >= IntegerCache.low && i &lt

weixin_43036882的博客 570

Integer相等问题,源码分析,一看就懂

Integer相等问题 先上代码说结论,-128到127之间的两个Integer用==比较是相等的。之外的不等。 Integer n1 = 1; Integer n2 = Integer.valueOf(1); System.out.println(n1.equals(n2));//true System.out.println(n1 == n2);//true Integer m1 = Integer.valueOf(1

喝泉水的泉 414
上一篇: 初识Spring Data 全家族(1)
下一篇: 初识Spring Data全家族(3)
新时代Java农民工
博客等级 码龄7年 16粉丝 116原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值