1. Java数据类型分为两大块
基本数据类型(本章重点分析)。 引用数据类型。 在分析讲解数据类型之前先提前介绍一个工具(jol)。
2. 工具之jol
本工具是openJDK提供的。 目的为了可以看清对象的内存布局,本章使用这个工具的原因是为了可视化每个基本数据类型的所占空间的大小。初学者可以不适用本工具,直接跳过本次工具的介绍即可。 依赖
< dependency>
< groupId> org. openjdk. jol< / groupId>
< artifactId> jol- core< / artifactId>
< version> 0.16 < / version>
< / dependency>
3. 基本数据类型
数据类型 所属分类 字节大小 bit位 默认值 byte 整数型 1 8 0 short 整数型 2 16 0 int 整数型 4 32 0 long 整数型 8 64 0 float 浮点型 4 32 0.0 double 浮点型 8 64 0.0 char 字符型 2 16 ’ ’ boolean 布尔型 1 8 false
3.1 整数型
3.1.1 byte类型
byte类型属于基本类型中整数型其中的一种,占用1个字节,默认值为0。 取值范围为(-2的7次方 ~ 2的7次方减一)。
为什么会是2的7次方呢,不是一个字节等于8个bit吗?
因为最前面的那个bit是符号位 1为负数,0为正数。 代码
public static void main ( String [ ] args) {
byte bMemoryInfo = 97 ;
ClassLayout classLayout = ClassLayout . parseInstance ( bMemoryInfo) ;
System . out. println ( classLayout. toString ( ) ) ;
System . out. println ( "-------------------------" ) ;
System . out. println ( classLayout. toPrintable ( ) ) ;
}
java.lang.Byte.value @12 (byte, 1b)
size = 16
-------------------------
java.lang.Byte object internals:
OFF SZ TYPE DESCRIPTION VALUE
0 8 (object header: mark) 0x0000000000000001 (non-biasable; age: 0)
8 4 (object header: class) 0xf80021d9
12 1 byte Byte.value 97
13 3 (object alignment gap)
Instance size: 16 bytes
Space losses: 0 bytes internal + 3 bytes external = 3 bytes total
输出信息解释 OFF 是 offset的简写,偏移量的意思 SZ 是 size的简写,字节大小的意 TYPE DESCRIPTION 是类型描述的意思 TYPE DESCRIPTION为byte Byte.value 的SZ 为 1 说明byte类型占用一个字节的空间。 TYPE DESCRIPTION为object header 这个是对象头的信息(初学者不必关注)。 TYPE DESCRIPTION为object alignment gap 这个是对齐填充的信息(初学者不必关注)。
3.1.2 short类型
short类型也是属于基本类型中整数型其中的一种,占用2个字节,默认值为0。 取值范围为(-2的15次方 ~ 2的15次方减一)。 代码
public static void main ( String [ ] args) {
short sMemoryInfo = 97 ;
ClassLayout classLayout = ClassLayout . parseInstance ( sMemoryInfo) ;
System . out. println ( classLayout. toString ( ) ) ;
System . out. println ( "-------------------------" ) ;
System . out. println ( classLayout. toPrintable ( ) ) ;
}
java.lang.Short.value @12 (short, 2b)
size = 16
-------------------------
java.lang.Short object internals:
OFF SZ TYPE DESCRIPTION VALUE
0 8 (object header: mark) 0x0000000000000001 (non-biasable; age: 0)
8 4 (object header: class) 0xf8002220
12 2 short Short.value 97
14 2 (object alignment gap)
Instance size: 16 bytes
Space losses: 0 bytes internal + 2 bytes external = 2 bytes total
3.1.3 int类型
int类型也是属于基本类型中整数型其中的一种,占用4个字节,默认值为0。 取值范围为(-2的31次方 ~ 2的31次方减一)。 代码
public static void main ( String [ ] args) {
int iMemoryInfo = 97 ;
ClassLayout classLayout = ClassLayout . parseInstance ( iMemoryInfo) ;
System . out. println ( classLayout. toString ( ) ) ;
System . out. println ( "-------------------------" ) ;
System . out. println ( classLayout. toPrintable ( ) ) ;
}
java.lang.Integer.value @12 (int, 4b)
size = 16
-------------------------
java.lang.Integer object internals:
OFF SZ TYPE DESCRIPTION VALUE
0 8 (object header: mark) 0x0000000000000001 (non-biasable; age: 0)
8 4 (object header: class) 0xf8002267
12 4 int Integer.value 97
Instance size: 16 bytes
Space losses: 0 bytes internal + 0 bytes external = 0 bytes total
3.1.4 long类型
long类型也是属于基本类型中整数型其中的一种,占用8个字节,默认值为0。 取值范围为(-2的63次方 ~ 2的63次方减一)。 代码
public static void main ( String [ ] args) {
long lMemoryInfo = 97L ;
ClassLayout classLayout = ClassLayout . parseInstance ( lMemoryInfo) ;
System . out. println ( classLayout. toString ( ) ) ;
System . out. println ( "-------------------------" ) ;
System . out. println ( classLayout. toPrintable ( ) ) ;
}
java.lang.Long.value @16 (long, 8b)
size = 24
-------------------------
java.lang.Long object internals:
OFF SZ TYPE DESCRIPTION VALUE
0 8 (object header: mark) 0x0000000000000001 (non-biasable; age: 0)
8 4 (object header: class) 0xf80022ae
12 4 (alignment/padding gap)
16 8 long Long.value 97
Instance size: 24 bytes
Space losses: 4 bytes internal + 0 bytes external = 4 bytes total
3.2 浮点型
3.2.1 float类型
float类型也是属于基本类型中整数型其中的一种,占用4个字节,默认值为0.0。 代码
public static void main ( String [ ] args) {
float fMemoryInfo = 97F ;
ClassLayout classLayout = ClassLayout . parseInstance ( fMemoryInfo) ;
System . out. println ( classLayout. toString ( ) ) ;
System . out. println ( "-------------------------" ) ;
System . out. println ( classLayout. toPrintable ( ) ) ;
}
java.lang.Float.value @12 (float, 4b)
size = 16
-------------------------
java.lang.Float object internals:
OFF SZ TYPE DESCRIPTION VALUE
0 8 (object header: mark) 0x0000000000000001 (non-biasable; age: 0)
8 4 (object header: class) 0xf800214b
12 4 float Float.value 97.0
Instance size: 16 bytes
Space losses: 0 bytes internal + 0 bytes external = 0 bytes total
3.2.2 double类型
double类型也是属于基本类型中整数型其中的一种,占用8个字节,默认值为0.0。 代码
public static void main ( String [ ] args) {
double dMemoryInfo = 97 ;
ClassLayout classLayout = ClassLayout . parseInstance ( dMemoryInfo) ;
System . out. println ( classLayout. toString ( ) ) ;
System . out. println ( "-------------------------" ) ;
System . out. println ( classLayout. toPrintable ( ) ) ;
}
java.lang.Double.value @16 (double, 8b)
size = 24
-------------------------
java.lang.Double object internals:
OFF SZ TYPE DESCRIPTION VALUE
0 8 (object header: mark) 0x0000000000000001 (non-biasable; age: 0)
8 4 (object header: class) 0xf8002192
12 4 (alignment/padding gap)
16 8 double Double.value 97.0
Instance size: 24 bytes
Space losses: 4 bytes internal + 0 bytes external = 4 bytes total
3.3 字符型
3.3.1 char类型
char类型也是属于基本类型中整数型其中的一种,占用2个字节,默认值为’ '。 代码
public static void main ( String [ ] args) {
char cMemoryInfo = 'a' ;
ClassLayout classLayout = ClassLayout . parseInstance ( cMemoryInfo) ;
System . out. println ( classLayout. toString ( ) ) ;
System . out. println ( "-------------------------" ) ;
System . out. println ( classLayout. toPrintable ( ) ) ;
}
java.lang.Character.value @12 (char, 2b)
size = 16
-------------------------
java.lang.Character object internals:
OFF SZ TYPE DESCRIPTION VALUE
0 8 (object header: mark) 0x0000000000000001 (non-biasable; age: 0)
8 4 (object header: class) 0xf80020c6
12 2 char Character.value a
14 2 (object alignment gap)
Instance size: 16 bytes
Space losses: 0 bytes internal + 2 bytes external = 2 bytes total
3.4 布尔型
3.4.1 boolean类型
boolean类型也是属于基本类型中整数型其中的一种,占用1个字节,默认值为false。 代码
public static void main ( String [ ] args) {
boolean bMemoryInfo = false ;
ClassLayout classLayout = ClassLayout . parseInstance ( bMemoryInfo) ;
System . out. println ( classLayout. toString ( ) ) ;
System . out. println ( "-------------------------" ) ;
System . out. println ( classLayout. toPrintable ( ) ) ;
}
java.lang.Boolean.value @12 (boolean, 1b)
size = 16
-------------------------
java.lang.Boolean object internals:
OFF SZ TYPE DESCRIPTION VALUE
0 8 (object header: mark) 0x0000000000000001 (non-biasable; age: 0)
8 4 (object header: class) 0xf8002085
12 1 boolean Boolean.value false
13 3 (object alignment gap)
Instance size: 16 bytes
Space losses: 0 bytes internal + 3 bytes external = 3 bytes total
4. 引用数据类型
引用数据类型的不过多介绍大致有下面这么多种。 数组 枚举 字符串 集合 流 Object 反射 类 注解