Java基本类型、包装类型及缓存池(常量池)

1 8种基本类型

四类八种位数数据表示范围
整型byte8-2 ^ 7 ~2 ^ 7 -1
整型short16-2 ^ 15 ~2 ^ 15 -1
整型int32-2 ^ 31 ~2 ^ 31 -1
整型long64-2 ^ 63 ~2 ^ 63 -1
浮点型float321.401298e-45 ~ 3.402823e+38(绝对值)
浮点型double644.9000000e-324 ~ 1.797693e+308(绝对值)
字符型char16‘\u0000’~’\uFFFF’
布尔型boolean1false和true

2 包装类型

  1. Java提供了两个类型系统,基本类型与引用类型;
  2. 使用基本类型在于效率,然而很多情况,会创建对象使用,因为对象可以做更多的功能;
  3. 如果想要我们的基本类型像对象一样操作,就可以使用基本类型对应的包装类,如下:
基本类型对应的包装类(位于java.lang包中)
byteByte
shortShort
intInteger
longLong
floatFloat
doubleDouble
charCharacter
booleanBoolean
  1. 基本类型与其对应的包装类型之间的赋值使用自动装箱与自动拆箱完成;
//自动装箱和自动拆箱
//1、自动装箱
Integer x=4; //实际上就是 Integer x=Integer.valueOf(4);
//2、自动拆箱->自动装箱
x=x+5;//实际上就是x=Integer.valueOf(x.intValue()+5);

3 缓存池(常量池)

  1. new Integer(123) 与 Integer.valueOf(123) 的区别
    • new Integer(123) 每次都会新建一个对象;
    • Integer.valueOf(123) 会使用缓存池中的对象,多次调用会取得同一个对象的引用;
Integer x = new Integer(123);
Integer y = new Integer(123);
System.out.println(x == y);    // false
Integer z = Integer.valueOf(123);
Integer k = Integer.valueOf(123);
System.out.println(z == k);   // true
  1. valueOf() 方法的实现比较简单,就是先判断值是否在缓存池中,如果在的话就直接返回缓存池的内容,如果不在就new一个新对象返回:
public static Integer valueOf(int i) {
    if (i >= IntegerCache.low && i <= IntegerCache.high)
        return IntegerCache.cache[i + (-IntegerCache.low)];
    return new Integer(i);
}
  1. 在 Java 8 中,Integer 缓存池的大小默认为 -128~127:
private static class IntegerCache {
	static final int low = -128;
	static final int high;
	static final Integer cache[];
	
	static {
	    // high value may be configured by property
	    int h = 127;
	    String integerCacheHighPropValue =
	        sun.misc.VM.getSavedProperty("java.lang.Integer.IntegerCache.high");
	    if (integerCacheHighPropValue != null) {
	        try {
	            int i = parseInt(integerCacheHighPropValue);
	            i = Math.max(i, 127);
	            // Maximum array size is Integer.MAX_VALUE
	            h = Math.min(i, Integer.MAX_VALUE - (-low) -1);
	        } catch( NumberFormatException nfe) {
	            // If the property cannot be parsed into an int, ignore it.
	        }
	    }
	    high = h;
	
	    cache = new Integer[(high - low) + 1];
	    int j = low;
	    for(int k = 0; k < cache.length; k++)
	        cache[k] = new Integer(j++);
	
	    // range [-128, 127] must be interned (JLS7 5.1.7)
	    assert IntegerCache.high >= 127;
	}
	private IntegerCache() {}
}
  1. 编译器会在自动装箱过程调用 valueOf() 方法,因此多个 Integer 实例使用自动装箱来创建并且值相同,那么就会引用相同的对象:
Integer m = 123;
Integer n = 123;
System.out.println(m == n); // true
  1. Byte,Short,Integer,Long,Character,Boolean这 6 种包装类都实现了缓存池技术,原理及使用与上面介绍的Integer类类似;
  2. 两种浮点数类型的包装类 Float、Double 并没有实现缓存池技术;
  3. 各类型缓存池范围:
包装类缓存池范围
Byte-128 ~ 127(所有)
Short-128 ~ 127
Integer-128 ~ 127
Long-128 ~ 127
Character‘\u0000’ ~ ‘\u007F’
Booleantrue和 false

要点:

  • 以上提到的几种实现了缓存池技术的基本类型包装类,它们维护的常量仅仅是各自缓存池范围内的常量,如果常量值超过这个范围,就会从堆中创建对象,而不再从缓存池中取。
  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
Java数据类型缓存Java中一种用于提高性能和节省内存的机制。它通过缓存一些常用的数据类型对象,避免频繁地创建和销毁对象,从而减少了内存的开销和垃圾回收的压力。 Java中的数据类型缓存主要包括以下几种: 1. 整数缓存Java中的整数类型(byte、short、int、long)都有一个固定的范围,对于某个范围内的整数值,会被缓存起来以供重复使用。这样可以避免频繁地创建新的整数对象,提高性能和节省内存。 2. 字符串常量池Java中的字符串是不可变的,为了提高字符串的重用性,Java使用了字符串常量池。字符串常量池是一块特殊的内存区域,用于存储字符串字面量。当创建一个字符串对象时,首先会在常量池中查找是否已经存在相同内容的字符串,如果存在则直接返回引用,否则创建新的字符串对象并放入常量池中。 3. 布尔值缓存Java中的布尔类型(boolean)只有两个取值:true和false。为了提高性能,Java将这两个值缓存起来,使得每次使用时都可以直接引用缓存中的对象。 4. 字符缓存Java中的字符类型(char)也有一个缓存,用于存储常用的字符对象。对于某些常用的字符,比如空格、换行符等,会被缓存起来以供重复使用。 通过使用数据类型缓存,可以减少对象的创建和销毁,提高程序的性能和内存的利用率。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

hellosc01

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值