IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> Java int & Integer 区别 -> 正文阅读

[Java知识库]Java int & Integer 区别

Java int & Integer 区别

int

int是Java的8个原始数据类型(boolean、byte、short、char、int、float、double、long)之一。Java虽然号称是面向对象语言,但原始数据类型是例外。

Integer

Integerint对应的包装类型,它有一个int类型的字段存储数据,并提供了基本操作,如数学运算、int和字符串之间转换等。在Java 5中,引入自动装箱和自动拆箱功能,Java可以根据上下文环境,自动进行转换,简化了代码。

Integer值缓存

在创建一个Integer对象传统方式是直接new一个对象,但还可以使用静态方法valueOf()创建,使用该方法会利用一个缓存机制,值默认缓存是-128~127之间,有一定的性能优化。

这种缓存机制不只出现在Integer类,其他的包装类也存在,如:

  • Boolean,缓存了true/false。
  • Short,同样缓存了-128~127之间的数值。
  • Byte,同样缓存-128~127之间。
  • Character,缓存\u0000\u007F.

自动装箱、拆箱

自动装箱实际上算是一种语法糖,可以简单理解为Java平台为我们自动进行了一些转换,保证不通的写法在运行时等价,它们发生在编译阶段,生成的字节码是一致的。

  • 自动装箱:javac会自动转换为Integer.valueOf(),可能会使用缓存。
  • 自动拆箱:javac会自动转换为Integer.intValue()
Integer a = 1;
int b = a++;

反编译为

 0 iconst_1
 1 invokestatic #2 <java/lang/Integer.valueOf : (I)Ljava/lang/Integer;>
 4 astore_1
 5 aload_1
 6 astore_3
 7 aload_1
 8 invokevirtual #3 <java/lang/Integer.intValue : ()I>
11 iconst_1
12 iadd
13 invokestatic #2 <java/lang/Integer.valueOf : (I)Ljava/lang/Integer;>
16 dup
17 astore_1
18 astore 4
20 aload_3
21 invokevirtual #3 <java/lang/Integer.intValue : ()I>
24 istore_2
25 return

IntegerCache源码分析

Integer的默认缓存范围是-128~127,但是缓存上限值是可以调整JVM的。

private static class IntegerCache {
    static final int low = -128;
    static final int high;
    static final Integer[] cache;
    static Integer[] archivedCache;

    private IntegerCache() {
    }

    static {
        int h = 127;
        String integerCacheHighPropValue = VM.getSavedProperty("java.lang.Integer.IntegerCache.high");
        int size;
        if (integerCacheHighPropValue != null) {
            try {
                size = Integer.parseInt(integerCacheHighPropValue);
                size = Math.max(size, 127);
                h = Math.min(size, 2147483518);
            } catch (NumberFormatException var6) {
            }
        }

        high = h;
        VM.initializeFromArchive(Integer.IntegerCache.class);
        size = high - -128 + 1;
        if (archivedCache == null || size > archivedCache.length) {
            Integer[] c = new Integer[size];
            int j = -128;

            for(int k = 0; k < c.length; ++k) {
                c[k] = new Integer(j++);
            }

            archivedCache = c;
        }

        cache = archivedCache;

        assert high >= 127;

    }
}

ShortCache源码分析

private static class ShortCache {
    static final Short[] cache = new Short[256];

    private ShortCache() {
    }

    static {
        for(int i = 0; i < cache.length; ++i) {
            cache[i] = new Short((short)(i - 128));
        }
    }
}

原始类型不能保证线程安全

  • 原始数据类型的变量,不能保证线程安全,需要借助AtomicInteger、AtomicLong这样的线程安全类。
  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2022-02-06 13:41:29  更:2022-02-06 13:43:04 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 9:43:33-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码