0
点赞
收藏
分享

微信扫一扫

【面试】基本数据类型的包装类缓存

鱼板番茄 2024-06-24 阅读 28
面试jvm

目录

1. 说明
  • 1.在java中,基本数据类型的包装类(Integer、Byte、Character、Short、Long、Boolean)的某些值会被缓存。
  • 2.以提高性能并减少内存使用。
  • 3.这种缓存机制是自动的,并且对于开发者来说是透明的。
  • 4.对于Byte、Short、Integer、Long这些整数类型的包装类为-128到127之间的值提供了缓存。
  • 5.Character:字符类型的包装类Character为0到127之间的值提供了缓存
  • 6.对于Float和Double:这两个浮点类型的包装类并没有为任何值提供缓存。因为浮点数的精度问题使得缓存所有可能的值变得不实际。
  • 7.Boolean: Boolean类型的包装类为true和false两个值提供了缓存。因为Boolean只有两个可能的值,它的缓存机制非常直接和简单。使用Boolean.TRUE和Boolean.FALSE时,得到的是缓存中的对象实例。
  • 8.在进行对象比较时,通常推荐使用equals()方法而不是==操作符,因为equals方法提供了更健壮和一致的语义。当处理不同源(一个通过valueOf方法获得,一个通过new关键字创建)的对象,equals方法比==操作符更可靠。
2. Integer类分析
2.1 代码块
public void test(){
	Integer a = 10;
    Integer b = 10;
}
2.2 字节码
 0 bipush 10
 2 invokestatic #5 <java/lang/Integer.valueOf : (I)Ljava/lang/Integer;>
 5 astore_1
 6 bipush 10
 8 invokestatic #5 <java/lang/Integer.valueOf : (I)Ljava/lang/Integer;>
11 astore_2
12 return
2.3 分析
  • 1.bipush 10 bipush用于将一个字节(-128到127)的值推送到操作数栈上。即把10推送到操作数栈。
  • 2.invokestatic #5 <java/lang/Integer.valueOf : (I)Ljava/lang/Integer;> invokestatic 调用一个静态方法。#5 指向常量池中某个条目的索引,这里指向java/lang/Integer.valueOf方法的符号引用。(I)Ljava/lang/Integer 方法的描述符,该方法接受一个int类型的参数(由(I)表示)并返回一个java.lang.Integer类型的对象(由 (I)Ljava/lang/Integer;> 表示)。执行此指令时,JVM会从操作数栈顶部弹出一个int值(在这个例子中是10),将其作为参数调用java.lang.Integer.valueOf方法,并将返回的Integer对象推送到操作数栈的顶部。
  • 3.astore_1 将操作数栈顶部的值(在这个例子中是Integer对象)存储到局部变量数组的第二个位置(索引为1,因为局部变量数组的索引从0开始)。
2.4 valueOf方法
  • 1.代码块
@HotSpotIntrinsicCandidate
public static Integer valueOf(int i) {
    if (i >= IntegerCache.low && i <= IntegerCache.high)
        return IntegerCache.cache[i + (-IntegerCache.low)];
    return new Integer(i);
}
  • 2.当i大于等于-128且小于等于127,则返回缓存中的对象,否则创建一个新对象。
举报

相关推荐

0 条评论