Integer和int
1. Integer(int包装类)
1.1 介绍
Integer在java中,包装了基本类型int的值,此外还提供了许多的方法,使Integer与String相互转换。
1.2 Integer源码详解
/*
部分Integer源码,可以看出Integer继承自Comparable接口,由此看一看出Integer可以比较大小
*/
public final class Integer extends Number implements Comparable<Integer> {
// Integer类型
public static final Class<Integer> TYPE = (Class<Integer>) Class.getPrimitiveClass("int");
// Integer的值
private final int value;
// 转字符串方法
public static String toString(int i, int radix) {
//...
}
// 将字符串转化为Int类型
public static int parseInt(String s, int radix)
throws NumberFormatException
{
//...
}
// int转换为Integer类型,其中IntegerCache.low = -128, IntegerCache.high = 127
// IntegerCache.cache是个数组,容量为(256),里面保存-128至127这256个Integer对象
public static Integer valueOf(int i) {
// 由这里可以看出,如果int值小于127 且大于-128,那么就会从IntegerCache,cache中获取
// 而不是在new一个Integer对象
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
// 如果int值在这个范围之外,那么就会从内存中创建一个Integer对象
return new Integer(i);
}
}
1.3 Integer与int比较
1.Integer是int的包装类,而int是java的基本类型;
2.Integer必须实例化后才能使用,而int不需要;
3.Integer实际上是对象的引用即指针,实际上是指向new Integer这个对象,而int是直接存储数据;
4.Integer默认值是null,而int默认值为0;
扩展:
缓存机制:
上述IntegerCache是在jdk1.5版本后引入的,目的是节省内存和提升性能,实现对象重用(复用)。
而在其他基本类型中,也有此类的缓存机制,例如
ByteCache 用于缓存 Byte 对象
ShortCache 用于缓存 Short 对象
LongCache 用于缓存 Long 对象
CharacterCache 用于缓存 Character
对象Byte,Short,Long 有固定范围: -128 到 127。对于 Character, 范围是 0 到 127。除了 Integer 可以通过参数改变范围外,其它的都不行。
线程安全:AtomicInteger
java中自带线程安全的基本类型有:AtomicInteger, AtomicLong, AtomicBoolean, AtomicIntegerArray, AtomicLongArray
1.AtomicInteger类中有有一个变量valueOffset,用来描述AtomicInteger类中value的内存位置 。
2.当需要变量的值改变的时候,先通过get()得到valueOffset位置的值,也即当前value的值.给该值进行增加,并赋给next
3.compareAndSet()比较之前取到的value的值当前有没有改变,若没有改变的话,就将next的值赋给value,倘若和之前的值相比的话发生变化的话,则重新一次循环,直到存取成功,通过这样的方式能够保证该变量是线程安全的
4.value使用了volatile关键字,使得多个线程可以共享变量,使用volatile将使得VM优化失去作用,在线程数特别大时,效率会较低。