java 基本数据类型
java 中的八种基本类型
Java语言提供了八种基本类型。六种数字类型(四个整数型,两个浮点型),一种字符类型,还有一种布尔型
byte:
- byte 数据类型是8位、有符号的,以二进制补码表示的整数;
- 最小值是 -128(-2^7);
- 最大值是 127(2^7-1);
- 默认值是 0;
- byte 类型用在大型数组中节约空间,主要代替整数,因为 byte 变量占用的空间只有 int 类型的四分之一;
- 例子:byte a = 100,byte b = -50。
short:
- short 数据类型是 16 位、有符号的以二进制补码表示的整数
- 最小值是 -32768(-2^15);
- 最大值是 32767(2^15 - 1);
- Short 数据类型也可以像 byte 那样节省空间。一个short变量是int型变量所占空间的二分之一;
- 默认值是 0;
- 例子:short s = 1000,short r = -20000。
int:
- int 数据类型是32位、有符号的以二进制补码表示的整数;
- 最小值是 -2,147,483,648(-2^31);
- 最大值是 2,147,483,647(2^31 - 1);
- 一般地整型变量默认为 int 类型;
- 默认值是 0 ;
- 例子:int a = 100000, int b = -200000。
long:
- long 数据类型是 64 位、有符号的以二进制补码表示的整数;
- 最小值是 -9,223,372,036,854,775,808(-2^63);
- 最大值是 9,223,372,036,854,775,807(2^63 -1);
- 这种类型主要使用在需要比较大整数的系统上;
- 默认值是 0L;
- 例子: long a = 100000L,long b = -200000L。
"L"理论上不分大小写,但是若写成"l"容易与数字"1"混淆,不容易分辩。所以最好大写。
float:
- float 数据类型是单精度、32位、符合IEEE 754标准的浮点数;
- float 在储存大型浮点数组的时候可节省内存空间;
- 默认值是 0.0f;
- 浮点数不能用来表示精确的值,如货币;
- 例子:float f1 = 234.5f。
double:
- double 数据类型是双精度、64 位、符合 IEEE 754 标准的浮点数;
- 浮点数的默认类型为 double 类型;
- double类型同样不能表示精确的值,如货币;
- 默认值是 0.0d;
boolean:
- boolean数据类型表示一位的信息;
- 只有两个取值:true 和 false;
- 这种类型只作为一种标志来记录 true/false 情况;
- 默认值是 false;
- 例子:boolean one = true。
char:
- char 类型是一个单一的 16 位 Unicode 字符;
- 最小值是 \u0000(十进制等效值为 0);
- 最大值是 \uffff(即为 65535);
- char 数据类型可以储存任何字符;
- 例子:char letter = 'A';。
两种数组类型
数组不属于基本类型,数组是引用类型。
char c; // c 是基本类型
char[] chars; // chars 是引用类型,指向一个数组对象
char[] 里面的每个元素是基本类型 char,但 char[] 这个数组本身是一个对象,是引用类型。
数组是对象
例如:
char[] chars = {'a', 'b', 'c'};
这里的 chars 是一个引用,指向一个数组对象。
数组对象也是 Object 的子类,所以你可以这样写:
Object obj = chars; // 合法
数组还有自己的属性,比如:
chars.length
说明它并不是基本类型。
为什么 char[] 不能强转成 Character[]
因为:
char // 基本类型
Character // 引用类型,是 char 的包装类
但是:
char[] // 引用类型,元素是基本类型 char
Character[] // 引用类型,元素是引用类型 Character
它们是两种完全不同的数组类型,没有继承关系,不能强转。
char[] chars = {'a', 'b', 'c'};
Character[] characters = (Character[]) chars; // 编译错误
自动装箱只发生在单个基本类型和它的包装类之间:
char c = 'a';
Character ch = c; // 自动装箱,合法
但不会自动把整个 char[] 装箱成 Character[]。
关于 Arrays.asList
Arrays.asList(p.toCharArray());
p.toCharArray() 返回 char[]。
因为 char[] 是引用类型,所以它会被当成一个对象传给 Arrays.asList。
于是得到:
List<char[]>
大小为 1,里面只有一个元素,就是那个 char[]。
如果换成引用类型数组:
Character[] chars = {'a', 'b', 'c'};
List<Character> list = Arrays.asList(chars);
这时才会把每个 Character 拆开,得到大小为 3 的 List<Character>。
为什么不能只用包装类
1. 内存开销对比
- 基本类型:
int,4字节,直接存数值在栈上 - 包装类:
Integer,是对象。对象头+成员变量,远大于4字节,堆内存分配,还有GC开销。
大量循环、数值计算,全用包装类会明显变慢、占用更多内存。
2. 空值风险
- 基本类型
int:默认值0,不可能为null - 包装类
Integer:默认null。
Integer a = null;
int b = a; // 自动拆箱,直接抛出 NullPointerException
3. 自动装箱/拆箱本质
Integer i = 10; // 装箱:Integer.valueOf(10)
int j = i; // 拆箱:i.intValue()
装箱会创建对象,频繁循环里写这种代码,会大量生成临时对象,加重GC压力。
4. 什么时候用包装类,什么时候基本类型
优先基本类型:
单纯数值计算、循环、局部变量
只能包装类:
- 泛型:
List<int>不合法,只能List<Integer>(泛型只支持引用类型) - 需要null表达“无值”:数据库字段可能为空,用
Integer,不能用int - 调用工具类方法,需要传对象

浙公网安备 33010602011771号