Loading

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. 什么时候用包装类,什么时候基本类型

优先基本类型:

单纯数值计算、循环、局部变量

只能包装类:

  1. 泛型:List<int>不合法,只能List<Integer>(泛型只支持引用类型)
  2. 需要null表达“无值”:数据库字段可能为空,用Integer,不能用int
  3. 调用工具类方法,需要传对象
posted @ 2026-09-21 14:12  wsttask  阅读(11)  评论(0)    收藏  举报