Java核心 -- int和Integer

栏目: Java · 发布时间: 5年前

  1. Integer是int对应的 包装类 ,里面有一个int类型的字段存储数据,并提供了基本的操作
  2. Java 5,引入了 自动装箱自动拆箱 (boxing/unboxing),Java可以根据上下文,自动进行转换
  3. 在Java 5,还引入了 值缓存 (静态工厂方法valueOf),默认缓存范围为 -128 ~ 127
    • Boolean,缓存 Boolean.TRUE/Boolean.FALSE
    • Short,缓存 -128 ~ 127
    • Byte,数值有限, 全部缓存
    • Character,缓存 \u0000 ~ \u007F

自动装箱 + 自动拆箱

Integer integer = 1;
int unboxing = integer++;
1: invokestatic     // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
8: invokevirtual    // Method java/lang/Integer.intValue:()I
11: iconst_1
12: iadd
13: invokestatic    // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
21: invokevirtual   // Method java/lang/Integer.intValue:()I
  1. 自动装箱和自动拆箱是一种 语法糖 ,发生在 编译阶段 (生成 一致的字节码
  2. javac自动把 装箱 转换为 Integer.valueOf (可以利用 值缓存 机制),把 拆箱 转换为 Integer.intValue
  3. 性能敏感 的场合,要尽量避免无意中的自动装箱和自动拆箱;但在大多数产品代码里,还是以 开发效率 优先

线程安全的计数器

原子类实现

// 简单明了
public class Counter {
    private final AtomicLong counter = new AtomicLong();

    public void increase() {
        counter.incrementAndGet();
    }
}

原始类型实现

// 复杂
public class CompactCounter {
    private volatile long counter;
    private static final AtomicLongFieldUpdater<CompactCounter> UPDATER =
            AtomicLongFieldUpdater.newUpdater(CompactCounter.class, "counter");

    public void increase() {
        UPDATER.incrementAndGet(this);
    }
}

不变类

private final int value;

BYTES

// Integer
@Native public static final int SIZE = 32;
public static final int BYTES = SIZE / Byte.SIZE;

// Byte
public static final int SIZE = 8;

原始类型的线程安全

  1. 原始类型的变量,需要使用并发相关手段,才能保证线程安全
  2. 如果有线程安全的计算需要,优先考虑 AtomicInteger、AtomicLong 等线程安全类
  3. 部分比较宽的数据类型,如 float、double ,都 不能保证更新操作的原子性 (可能读到只更新了一半数据位的数值)

局限性

  1. 原始类型与Java泛型不能配合使用
    • Java的泛型是 伪泛型 ,属于 编译期的技巧 类型擦除+强制转换
    • 原始类型无法转换为Object,因此无法与泛型配合使用
  2. 无法高效表达数据
    • 原始类型数组 ,在内存里是一段 连续的内存
    • 引用类型数组 ,存储的是引用,实际的对象分散在堆里,导致 低效的数据操作 ,也 无法充分利用CPU缓存

转载请注明出处:http://zhongmingmao.me/2019/05/04/java-core-int-Integer/

访问原文「 Java核心 -- int和Integer 」获取最佳阅读体验并参与讨论


以上所述就是小编给大家介绍的《Java核心 -- int和Integer》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

O2O进化论

O2O进化论

板砖大余、姜亚东 / 中信出版社 / 2014-5 / 49

在互联网的1.0时代,Online的商业和Offline的商业就像是两条平行线,没有交汇点,在移动浪潮下,他们正在交汇,这就是O2O(Online to Offline)。于是,人们认为:O2O就是线下将线上作为销售前台。结论是对的,但并非简单相加就可以达到。人们已经进入数据革命时期,O2O是线上和线下全流通的数据化工具,电子商务就是非数据商品的数据化。其次,O2O还是一种竞争格局。这决定了以O2......一起来看看 《O2O进化论》 这本书的介绍吧!

URL 编码/解码
URL 编码/解码

URL 编码/解码

XML 在线格式化
XML 在线格式化

在线 XML 格式化压缩工具

RGB CMYK 转换工具
RGB CMYK 转换工具

RGB CMYK 互转工具