数据类型
基本数据类型
基本数据类型是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 | 无 |