数据类型
基本数据类型
基本数据类型是CPU可以直接进行运算的类型,是指不可再分割的原子数据类型,内存中直接存储此类型的值,通过内存地址就可以访问到数据,并且内存中只能存放这种类型的值。
Java定义了以下几种基本数据类型:
整数类型:byte、short、int、long
浮点数类型:float、double
字符类型:char
布尔类型:boolean
在理解基本数据类型区别前,先了解一下计算机内存基本结构:
计算机内存最小存储单元是字节(byte),一个字节就是8位二进制数,即8bit。它的表示范围从00000000~11111111,换算成十进制为0~255,换成十六进制为00~ff。
内存单元是从0开始编号,称之为内存地址。每个内存单元可以看作一间房间,内存地址就是房间号。
一个字节是1byte,1K=1024byte,1M=1024K,1G=1024M,1T=1024G。
不同的数据类型占用的字节数不一样。请看下图:
byte正好一个字节,而long和double是8个字节
整型
对于整型,Java中只定义了带符号的整型,因此,最高位的bit表示符号位(0表示整数,1表示负数)
byte: -128~127
short: -32768 ~ 32767
int: -2147483648 ~ 2147483647
long: -9223372036854775808 ~ 9223372036854775807
浮点类型
浮点类型的数就是小数,因为小数用科学计算法表示的时候,小数点是可以“浮动”,例如:1234.5表示成
浮点数事例如下:
float f1 = 3.14f;
float f2 = 3.14e38f; // 科学计数法表示的3.14x10^38
double d = 1.79e308;
double d2 = -1.79e308;
double d3 = 4.9e-324; // 科学计数法表示的4.9x10^-324
复制代码
对于float 类型,需要在后面添加f
浮点类型表示范围非常大,float 最大表示3.4x10^38 ,而double最大可表示 1.79x10^308
布尔类型
布尔类型boolean只有true和false两个值,布尔类型总是关系运算的计算结果:
Java语言对布尔类型的存储并没有做规定,因为理论上存储布尔类型只需要1 bit,但是通常JVM内部会把boolean表示为4字节整数。
字符类型
字符类型char表示一个字符。Java的char类型除了可表示标准的ASCII外,还可以表示一个Unicode字符。
注意char类型使用单引号',且仅有一个字符,要和双引号"的字符串类型区分开。
引用类型
除了以上8种基本类型外,都是引用类型。例如,引用类型最常用的就是String字符串:
String s = "hello";
复制代码
引用类型的变量类似于C语言的指针,它内部存储一个“地址”,指向某个对象在内存的位置。
引用类型分为两种数据类型:引用变量本身和引用指向的对象。为描述简单起见,把引用变量(Reference Variable)称为refvar,而指向的实际对象(Referred Object)称为refobj。
refvar是基本数据类型,它的默认值是null,存储refobj的首地址。
refvar 占用4B空间
refobj 无论多么小的对象占用的存储空间是12B(用于存储基本信息,称为对象头),但是由于存储空间分配必须是8B的倍数,所以初始分配的空间至少是16B。
包装类型
包装类型的继承结构图:
自动装箱、拆箱
装箱、自动装箱
Integer i1 = new Integer(8);
Integer i2 = Integer.valueOf(8);
// 自动装箱
Integer i3 = 8;
复制代码
以上 3 种都可以进行转换,但在 Java 5 之前第 3 种方法是编译失败的,第 3 种方法也正是现在的自动装箱功能。另外,第一种构造器方法也不推荐使用了,已经标为废弃了。
自动拆箱
// 自动拆箱
int i4 = i3;
int i5 = i3.intValue();
复制代码
继续上面的例子,把 i3 赋值给 i4 就是实现的自动拆箱功能,自动装箱的原理就是调用包装类的 xxValue 方法,如 i5 中的 Integer 的 intValue 方法。
8种基本数据类型都有对应的包装类
包装类解决了基本数据类型无法做到的事情:泛型类型参数、序列化、类型转换、高频区间数据缓存。
所有包装类对象之间的比较,推荐全部使用equals()方法
在选择使用包装类还是基本数据类型时,推荐使用如下方式:
所有的POJO类属性必须使用包装类数据类型。
RPC方法的返回值和参数必须使用包装数据类型。
所有的局部变量推荐使用基本数据类型。
字符串
字符串是在堆上分配的
字符串相关类型主要有三种:String、StringBuilder、StringBuffer
String相关:
String是只读字符串,不可变(immutable)对象,对它的任何改动,其实都是创建一个新对象,再把引用指向新对象。
String对象赋值操作后,会在常量池中进行缓存,如果下次申请创建对象时,缓存中已经存在,则直接返回相应引用给创建者。
StringBuffer相关:
StringBuffer可以对原对象上进行修改,是线程安全的。
JDK5引入的StringBuilder和StringBuffer均继承自AbstractStringBuilder
StringBuilder相关:
StringBuilder是非线程安全的
继承自AbstractStringBuilder,该抽象类内部和String一样,也是以字符数组的形式存储字符串的。
String和StringBuffer:
基本字符串操作可以使用String相加,这样操作比较方便。
在循环语句中不推荐字符串直接相加操作,推荐使用StringBuilderd的append方法进行扩展。以下方式不推荐:
String str= "test";
for(int i=0;i<100;i++){
str = str + "hello";
}
复制代码
总结
Java的9种基本数据类型(8种基本类型+引用类型)
整型:byte、short、int、long
浮点型:float、double
布尔型:boolean
字符型:char
引用类型:面向对象世界中的引用变量(引用句柄),或者叫引用类型。
序号
类型名称
默认值
大小
最小值
最大值
包装类
缓存区间
1
boolean
false
1B
0(false)
1(true)
Boolean
无
2
byte
(byte)0
1B
-128
127
Byte
-128~127
3
char
'\u0000'
2B
'\u0000'
'\uFFFF'
Charactor
(char)0~(char)127
4
short
(short)0
2B
-2^15
2^15-1(32767)
Short
-128~127
5
int
0
4B
-2^31
2^31-1
Integer
-128~127
6
long
0L
8B
-2^63
2^63-1
Long
-128~127
7
float
0.0f
4B
1.4e-45
3.4e+38
Float
无
8
double
0.0d
8B
4.9e-324
1.798e+308
Double
无