Java 基础 (一)
1.数据类型
数据类型分为两类:
- 基本数据类型(boolean, byte, short, int, long, float, double, char )
- 引用数据类型(数组, 类, 接口)——>后面详细介绍
1.1 基本数据类型
基本数据类型:boolean, byte, short, int, long, float, double, char 八类
基本数据类型 包装类 默认值 大小 范围
boolean Boolean false / /
byte Byte 0 1B -2^7~2^7-1
short Short 0 2B -2^15~2^15-1
int Integer 0 4B -2^31~2^31-1
long Long 0l 8B -2^63~2^63-1
float Float 0.0f 4B -2^31~2^31-1
double Double 0.00 8B -2^63~2^63-1
char Character '\u0000' 2B 0~2^31-1
// 虽然字符 char 只有一个字符,但却占两个字节是因为 Java 使用的是 Unicode 字符集而不是 ASCII 字符集
1.2 与其包装类区别
了解区别之前,先来了解一下Java中的内存分配,以及Java方法区
1.3 自动拆装箱
/*
自动装箱
自动调用valueOf()方法,将其装箱-->转化为Integer实例对象
*/
Integer i = 10;
Integer j = new Integer(10);
/*
自动拆箱
自动调用intValue()方法,将其拆箱-->转化为基本数据类型
*/
int k = j;
valueOf()方法源码
// IntegerCache.low 其值为-128,相对应的 IntegerCache.high 其值为127
public static Integer valueOf(int i) {
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
}
注意: 所有的包装类对象之间值的比较,全部使用equals方法,对于Integer var = ? 在-128到127之间的赋值,Integer对象是在IntegerCache.cahche产生,会复用已有对象,这个区间内的Integer值可以直接使用==进行判断,但是这个区间之外的所有数据,都会在堆上产生,并不会复用已有对象,推荐使用equals方法进行判断
IntegerCache是一个私有的内部类,源码如下:
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() {}
}
/**
* 注意:
* 该缓存池实体类的上界是可以调整大小的,在启动JVM时,通过
* -XX:AutoBoxCacheMax=<size>
* 来调整缓存池实体类的上界大小,该选项在JVM初始化时会设定一个名为
* java.lang.IntegerCache.high
* 系统属性,然后 IntegerCache 初始化的时候就会读取该系统属性来决定上界
*/
-
当new的数值大于-128小于127时,返回的实际上是缓存的值,实际上是同一个对象,而不在这一个范围内的,返回的是构造方法新建的 Integer对象
-
基本数据类型作为成员变量与静态变量时,其拥有默认值;作为局部变量则没有默认值
有任何错误请指正,谢谢您的阅读,希望对您有所帮助。