integer和long源代码解析

2023-11-10

一.简介

1.Integer和Long的联系与区别

2.源代码中的享元模式

3.常用的方法

二.Integer和Long的联系与区别

相同点: Ingeter和Long都是包装类,初值为null;

通过equals比较变量是否相同,==在一定的范围内可以使用(在以下享元模式中解释);

区别:Integer是int的封装类型是整数范围-2^31到2^31-1,long 的整数范围:-2^63 ~ 2^63 -1 long是长整型;

三.源代码中的享元模式

例子

Integer i=10;

Integer j=10;

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

//这里输出是true

Integer a=200;

Integer b=200;

System.out.println(a==b);

//这里输出是false

 

答案很简单==判断的是两个变量引用的地址,Integer/Long源代码在设计中缓存了-128到127之间的值,所以在这个范围内的数值都是指向同一个地址;

 

源代码:

缓存的实现:

     //是Integer内部的私有静态内部类,里面的cache[]就是jdk事先缓存的Integer。
    private static class IntegerCache {
        static final int low = -128;//区间的最低值
        static final int high;//区间的最高值,后面默认赋值为127,也可以用户手动设置虚拟机参数
        static final Integer cache[]; //缓存数组
        static {
            // high value may be configured by property
            int h = 127;
            //这里可以在运行时设置虚拟机参数来确定h  :-Djava.lang.Integer.IntegerCache.high=250
            String integerCacheHighPropValue =
                sun.misc.VM.getSavedProperty("java.lang.Integer.IntegerCache.high");
            if (integerCacheHighPropValue != null) {//用户设置了
                int i = parseInt(integerCacheHighPropValue);
                i = Math.max(i, 127);//虽然设置了但是还是不能小于127
                // 也不能超过最大值
                h = Math.min(i, Integer.MAX_VALUE - (-low) -1);
            }
            high = h;
            cache = new Integer[(high - low) + 1];
            int j = low;
            //循环将区间的数赋值给cache[]数组
            for(int k = 0; k < cache.length; k++)
                cache[k] = new Integer(j++);
        }
        private IntegerCache() {}
    }

这就是就是用一个Integer数组先缓存了-128到127区间值,后面如果是是在区间内的数直接从缓存数组中取,否则才构造新的Integer。

 

Integer赋值时:

public static Integer valueOf(int i) {

if (i >= IntegerCache.low && i <= IntegerCache.high)

return IntegerCache.cache[i + (-IntegerCache.low)];//在缓存数组区间内返回缓存中的数据

return new Integer(i);//不再区间内new一个对象

}

 

四.常用的方法

1.类声明和变量

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

final类不能被继承,继承了abstract类Number,实现了抽象方法有

intValue()、longValue()、floatValue()、doubleValue()、byteValue() 、shortValue()

 

实现Comparable接口用于比较两个变量大小,实现方法 compareTo(T o);

 

private final int value;//final证明不可变性 private static final long serialVersionUID = 1360826667806852920L;

从对象不可变知道以下i生成了两个对象

public static void main(String[] args) { Integer i = new Integer(6); i = 7; }

编译后的代码是

public static void main(String args[]) { Integer i = new Integer(6); i = Integer.valueOf(7);//生成对象或者从缓存中取数据 }

 

2.compareTo

public int compareTo(Integer anotherInteger) {

return compare(this.value, anotherInteger.value);

}

public static int compare(int x, int y) {

return (x < y) ? -1 : ((x == y) ? 0 : 1);//小于返回-1,大于返回1等于返回0

}

3. 类型Value以shortValue为例子,都是通过强转

public short shortValue() {

return (short)value;

}

4. equals

private final int value;//成员变量,Integer 的值

public boolean equals(Object obj) {

if (obj instanceof Integer) {

return value == ((Integer)obj).intValue();//转化成int基础类型再做比较,所以包装类采用//equals方法进行比较大小

}

return false;

}

 

就先写到这里了,以下是在资料整理时看到的一篇很详细的源代码解析:

https://www.cnblogs.com/vinozly/p/5173477.html

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

integer和long源代码解析 的相关文章

  • 在 libgdx 中批处理多维数据集时出现问题

    我正在尝试开发一款游戏 在屏幕上渲染多达 300 个立方体 为每个多维数据集创建新的 modelInstance 时 modelBatch 的性能非常糟糕 据我所知 没有 3d 批处理可以将所有立方体批处理到一次绘制调用 所以我拼命地尝试以
  • 浏览时 Java Applet 不会被终止

    当用户离开加载小程序的页面时 如何停止 Java 小程序的进程 我正在使用 Chrome 现在要杀死小程序 我必须使用窗口的任务栏并杀死进程 java exe Java applet 具有生命周期方法 那些是init start stop
  • Netbeans 雷达插件配置

    我使用的是 Netbeans 8 0 1 在提交到 SVN 之前 我需要从 IDE 运行并检查 SonarQube 分析 我已经安装了 Netbeans Radar 插件 用于启动本地分析并检查结果 这个插件有一个名为 Get Issues
  • Maven 部署:deploy-file 发布所有文件而不是一个

    我正在使用 Maven 构建我的 Java 应用程序Maven 组装插件 https maven apache org plugins maven assembly plugin 创建一个可执行的 jar 因此 目标文件夹包含多个 jar
  • 控制启动时的竞争条件

    我有一些代码想要执行一些一次性初始化 但这段代码没有明确的生命周期 因此在初始化完成之前 我的逻辑可能会被多个线程调用 所以 我想基本上确保我的逻辑代码 等待 直到初始化完成 这是我的第一次剪辑 public class MyClass p
  • 无法从 PDFA1-a 格式文档中提取图像

    我正在使用以下代码从 PDFA1 a 格式的 pdf 中提取图像 但我无法获取图像 List
  • 具有多个字符串的列表视图

    我正在尝试创建一个包含多个字符串的列表视图 现在我有一个可以实现的功能 while i lt 10 GETS DATA FROM WEBPAGE ETC a DATAFROMWEBPAGE1 b DATAFROMWEBPAGE2 c DAT
  • 为什么在大多数开源java项目中局部变量没有被声明为final?

    如果我查看 OpenJDK Hibernate 或 Apache 中的 java 源代码 我还没有看到任何声明为 Final 的局部变量 这表明一些最广泛使用的 java 软件库的开发人员 不要相信final关键字可以提高可读性 不相信它会
  • 如何在 WebSphere Liberty Batch 中配置事务超时?

    的作用是什么javax transaction global timeout 我是否需要实施检查点 超时 中的方法检查点算法 服务器配置级别有什么东西吗 它如何与应用程序级别的设置进行交互 2016年12月2日编辑 重新设计并解释了为应用程
  • 使用 JPA 标准的“不在”约束

    我正在尝试写一个NOT IN约束使用JPA Criteria 我尝试过这样的事情 builder not builder in root get property1 虽然我知道这行不通 在上面的语法中 如何添加集合 列表property1会
  • 何时对字符串文字使用 intern()

    我看到很多这样的遗留代码 class A public static final String CONSTANT value intern 我看不出使用 intern 的任何原因 因为在 Javadoc 中可以读到 所有文字字符串和字符串值
  • 使用会话空闲超时进行轮询

    我对 Tomcat 中的所有应用程序使用单点登录 我的要求是 我必须轮询应从后端获取的事务状态 但它也不应该影响会话的空闲超时 有人可以建议是否可以做点什么吗 Thanx 我不知道是否有标准方法可以做到这一点 如果没有 你可以写一个过滤器
  • 谷歌的Json解析Gson库:JsonElement和JsonObject有什么区别?

    public abstract class JsonElement extends Object 表示 Json 元素的类 它可以是 JsonObject JsonArray JsonPrimitive 或 JsonNull public
  • 不支持使用 JDK 版本“11.0.1”进行构建。请安装 JDK 版本 `1.8.0`

    我已经下载了 Visual Studio for Mac 并尝试开始学习 Xamarin iOS 和 Android 问题是当我尝试运行 android 项目时出现以下错误 Building with JDK Version 11 0 1
  • 将 JPanel 添加到 JFrame

    我有一个程序 其中将 JPanel 添加到 JFrame public class Test Test2 test new Test2 JFrame frame new JFrame Test frame setLayout new Bor
  • 在服务器上创建 Zip 文件并使用 java 下载该 zip

    我从 mkyong 获得了以下代码 用于在本地压缩文件 但是 我的要求是在服务器上压缩文件并需要下载它 任何人都可以帮忙吗 代码写入zip文件 public void zipFiles File contentFile File navFi
  • 枚举

    我试图拥有一组扩展通用接口的枚举 例如 interface Fooable void someCommonMethod enum E1 implements Fooable some enumuerations and a definiti
  • 不幸的是 Project_Name 已停止

    我有一个简单的应用程序 您可以在文本视图中输入文本并按提交 它会在另一个活动中显示文本 然而 当我按下提交时 给我消息 不幸的是 发送已停止 我查看了SO上的其他线程 但是不幸的是 myfirstproject 在 java 中停止工作错误
  • 确保 MAVEN_HOME 设置正确

    这里是 Java 和 Maven 菜鸟 使用 OSX 10 8 并使用 HomeBrew 安装 Maven 1 如果我说which mvn我会得到这个 usr local bin mvn 2 如果我说echo MAVEN HOME我不会得到
  • 请解释为什么Java和C对此代码给出不同的答案

    public class Test public static void main String args int i 10 i i System out println value of i is i 输出是 10 当我在中执行类似的代码

随机推荐

  • 浏览器渲染原理

    浏览器渲染原理 渲染时间点 渲染流水线 解析 HTML Parse HTML 解析 HTML Parse HTML Document Object Model 1 解析 HTML Parse HTML CSS Object Model 解析
  • Eigen 使用碎碎记_norm、normalize、normalized的区别

    本文转载自Eigen中norm normalize normalized的区别 norm normalize normalized的区别 include
  • 小程序实时监听搜索数据并将关键字高亮显示

  • Win10下VS2019双机调试之调试驱动

    转载于 https blog csdn net m0 48995611 article details 112211268 有现成的写的非常详细就不重复造轮子了 ps 1 注意文章字体加深部分 非常重要 2 原文bcdefit dbgset
  • Springboot当中通过引入依赖的形式使用前端框架

    在现在很多大型公司很多都前后端分离开发 而前端也是独立启动的 但是也有很多公司直接是独立的一个项目 前端页面直接在java程序当中 应对与这种独立项目我们可以采用springboot给我们提供的依赖形式来引入前端包 也挺方便的 需要的朋友们
  • Android Studio中重写onClick()方法时,出现Method does not override method from its supperclass问题

    用实现接口的方式来重写监听器中的onClick 方法 改正方法 应在让该类继承implements View OnClickListener
  • UNIX网络编程卷一 学习笔记 第十二章 IPv4与IPv6的互操作性

    未来数年内 因特网也许会逐渐从IPv4过渡到IPv6 在过渡阶段 基于IPv4的现有应用能与基于IPv6的全新应用协同工作非常重要 例如 厂商不应只提供仅能与IPv6 telnet服务器程序协同工作的telnet客户程序 而既应该提供能与I
  • 北京大学肖臻老师《区块链技术与应用》公开课笔记3——BTC数据结构篇

    北京大学肖臻老师 区块链技术与应用 公开课笔记 比特币数据结构篇 对应肖老师视频 click here 全系列笔记请见 click here About Me 点击进入我的Personal Page Hash pointer 哈希指针 指针
  • 入门PCB设计AD9学习笔记8-PCB布板规则

    写作前面 最近在学PCB设计 发现杜洋工作室的入门PCB设计讲的非常详细 适合初学者 由于是视频讲解形式 不利于后期再索引搜索各个知识点细节 所以这里做上笔记方便自己消化和之后内容的索引 惊喜发现已经有前辈写过前几集的内容整理 写的很详细
  • Rigidbody2D ( Simulated )

    bool类型 设为false后则不会模拟刚体
  • 一个TCP长连接设备管理后台工程(一)---概述

    一个TCP长连接设备管理后台工程 一 概述 这个项目最初只是用来进行一个简单的协议测试用的 而且是一个纯粹的后端命令行工程 只是后面想着只有命令行 操作也不太方便 于是便有了添加一个ui的想法 golang项目要配ui 最佳的还是配一个前端
  • 微信小程序之生成图片分享 二维码分享 canvas绘制

    如果本文对你有用 请爱心点个赞 提高排名 帮助更多的人 谢谢大家 如果解决不了 可以在文末进群交流 添加画布 首先 在小程序里进行绘图操作需要用到
  • css3动画 提交成功圆圈画对勾

    这里写目录标题 提交成功圆圈画对勾 遇到的问题 问题一 对号的动画要在圆圈执行完动画后执行 解决 问题二 css不能在display none和display block之间进行动画 解决 代码 提交成功圆圈画对勾 这是一个动画效果 可以直
  • Java多线程进阶(JUC)

    1 什么是JUC JUC实际上是Java包的缩写 java util concurrent包 2 回顾线程和进程 1 进程 一个程序 例如QQ exe 进程是程序的集合 进程是CPU调度的基本单位 一个进程可以有多个线程 至少包含一个 Ja
  • python3.7的版本号安装tensorflow

    步骤 1 下载tensorflow的whl包 由于tensorflow还没有官方支持python3 7 所以pip直接是搜索不到合适的tensorflow的 所以需要下载whl文件包手动安装 有人说google的网址上不去没法下载 解决办法
  • STM32驱动MPU6050基于IIC协议

    一 简介 MPU6050是一款六轴陀螺仪 可以通过IIC协议输出三个方向上的加速度和角速度 在平衡车和飞控中较为常见 一般情况下 模块有用的引脚只有四个 其它的不常用 即VCC GND SDA和SCL 操作它的第一步 即编写IIC协议 二
  • Echarts给折线图给横竖坐标轴添加箭头与标签文字过长显示不全处理

    本人在做监控数据大屏时曾踩过不少坑 现将踩坑经验总结如下 数据大屏demo请点击这里 一 饼图处理标签文字过长而显示不全的解决方案 在使用echarts的过程中 有时会遇到标签文字过长导致显示不全的问题 如下图 例如图中检查结果和处罚种类都
  • 设计模式(1) - UML类图

    1 前言 从这一节开始 我们将一起学习设计模式 我们的学习目标是什么呢 了解常用设计模式以及它们的使用场景 分析实际工程中设计模式的使用 揣摩实际意图 了解作者设计思路 尝试运用设计模式迭代 重构自己的代码 提升软件架构设计思路 最近在阅读
  • react绝对定位导致onClick点击事件不生效,设置了z-index也无效

    这是我最近在开发中遇到的问题 网上也查看了资料 有说 因为点击的 不是当前元素 给元素 设onClike事件的元素 设置z index 就可以解决 有基础的都知道 数值越大层级越高 可是 我设置了没有效果 看了很多示例 也没有我这样的情况
  • integer和long源代码解析

    一 简介 1 Integer和Long的联系与区别 2 源代码中的享元模式 3 常用的方法 二 Integer和Long的联系与区别 相同点 Ingeter和Long都是包装类 初值为null 通过equals比较变量是否相同 在一定的范围