Java 数据类型
变量本质上是在内存中申请存储空间来保存数据。
当我们创建一个变量时,内存管理系统会根据其数据类型分配相应的存储空间,该空间仅能用于存储特定类型的数据值。
Java 语言的数据类型主要分为两大类:
✅ 基本数据类型(Primitive Data Types)
- 包括 byte、short、int、long、float、double、char、boolean 等
- 直接存储数据值
- 存储在栈内存中
✅ 引用数据类型(Reference Data Types)
- 包括类、接口、数组等
- 存储的是对象的引用(内存地址)
- 实际对象存储在堆内存中
这两种数据类型的根本区别在于存储方式和内存分配机制的不同。基本数据类型直接存储值,而引用数据类型存储的是指向对象的引用。
基本数据类型
Java 有 8 种基本数据类型(primitive data types)分别为:整型(整数类型)、浮点型(小数类型)、字符型、布尔型。
byte:
- byte 数据类型是 8 位、有符号的、以二进制补码表示的整数;
- 最小值是
-128(-2^7)
; - 最大值是
127(2^7-1)
; - 默认值是
0
; - 内存占用
1
字节; - byte 类型用在大型数组中节约空间,主要代替整数,因为 byte 变量占用的空间只有
int
类型的四分之一; - 例子:byte a = 100,byte b = -50。
short:
- short 数据类型是 16 位、有符号的、以二进制补码表示的整数;
- 最小值是
-32768(-2^15)
; - 最大值是
32767(2^15 - 1)
; - 默认值是
0
; - 内存占用
2
字节; - Short 数据类型也可以像 byte 那样节省空间。因为 short 变量占用的空间只有
int
类型的二分之一; - 例子:short s = 1000,short r = -20000。
int:
- byte 数据类型是 32 位、有符号的、以二进制补码表示的整数;
- 最小值是
-2,147,483,648(-2^31)
; - 最大值是
2,147,483,647(2^31 - 1)
; - 默认值是
0
; - 内存占用
4
字节; - 一般地整型变量默认为 int 类型;
- 例子:例子: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
; - 内存占用
8
字节; - 这种类型主要使用在需要比较大整数的系统上;
- 例子:long a = 100000L,long b = -200000L。
float:
- float 数据类型是单精度、32 位、符合 IEEE 754 标准的浮点数;
- float 在储存大型浮点数组的时候可节省内存空间;
- 默认值是
0.0f
; - 内存占用
4
字节; - 浮点数不能用来表示精确的值,如货币;
- 例子:float f1 = 234.5f。
double:
- double 数据类型是双精度、64 位、符合 IEEE 754 标准的浮点数;
- 浮点数的默认类型为 double 类型;;
- double 类型同样不能表示精确的值,如货币;
- 默认值是
0.0d
; - 内存占用
8
字节; - 例子:double a = 7.,double b = 8.0。
boolean:
- boolean 数据类型表示一位的信息;
- 只有两个取值:true 和 false;
- 这种类型只作为一种标志来记录 true/false 情况;
- 默认值是
false
; - 内存占用字节未被严格定义;
- 例子:boolean one = true。
char:
- char 类型是一个单一的 16 位 Unicode 字符;
- 最小值是
\u0000
(十进制等效值为 0); - 最大值是
\uffff
(即为 65535); - char 数据类型可以储存任何字符;
- 内存占用
2
字节; - 例子:char letter = 'A';。
byte:
- byte 数据类型是8位、有符号的,以二进制补码表示的整数;
- 最小值是
-128(-2^7)
; - 最大值是
127(2^7-1)
; - 默认值是
0
; - 内存占用
1
字节; - byte 类型用在大型数组中节约空间,主要代替整数,因为 byte 变量占用的空间只有
int
类型的四分之一; - 例子:byte a = 100,byte b = -50。
取值范围实例
对于 Java 基本数据类型的取值范围,开发者无需刻意记忆具体的数值边界。
因为这些关键值已经作为预定义常量,内置于各个基本类型对应的包装类中,我们可以直接通过类常量来获取。
public class PrimitiveTypeTest {
public static void main(String[] args) {
// byte
System.out.println("基本类型:byte 二进制位数:" + Byte.SIZE);
System.out.println("包装类:java.lang.Byte");
System.out.println("最小值:Byte.MIN_VALUE=" + Byte.MIN_VALUE);
System.out.println("最大值:Byte.MAX_VALUE=" + Byte.MAX_VALUE);
System.out.println();
// short
System.out.println("基本类型:short 二进制位数:" + Short.SIZE);
System.out.println("包装类:java.lang.Short");
System.out.println("最小值:Short.MIN_VALUE=" + Short.MIN_VALUE);
System.out.println("最大值:Short.MAX_VALUE=" + Short.MAX_VALUE);
System.out.println();
// int
System.out.println("基本类型:int 二进制位数:" + Integer.SIZE);
System.out.println("包装类:java.lang.Integer");
System.out.println("最小值:Integer.MIN_VALUE=" + Integer.MIN_VALUE);
System.out.println("最大值:Integer.MAX_VALUE=" + Integer.MAX_VALUE);
System.out.println();
// long
System.out.println("基本类型:long 二进制位数:" + Long.SIZE);
System.out.println("包装类:java.lang.Long");
System.out.println("最小值:Long.MIN_VALUE=" + Long.MIN_VALUE);
System.out.println("最大值:Long.MAX_VALUE=" + Long.MAX_VALUE);
System.out.println();
// float
System.out.println("基本类型:float 二进制位数:" + Float.SIZE);
System.out.println("包装类:java.lang.Float");
System.out.println("最小值:Float.MIN_VALUE=" + Float.MIN_VALUE);
System.out.println("最大值:Float.MAX_VALUE=" + Float.MAX_VALUE);
System.out.println();
// double
System.out.println("基本类型:double 二进制位数:" + Double.SIZE);
System.out.println("包装类:java.lang.Double");
System.out.println("最小值:Double.MIN_VALUE=" + Double.MIN_VALUE);
System.out.println("最大值:Double.MAX_VALUE=" + Double.MAX_VALUE);
System.out.println();
// char
System.out.println("基本类型:char 二进制位数:" + Character.SIZE);
System.out.println("包装类:java.lang.Character");
// 以数值形式而不是字符形式将Character.MIN_VALUE输出到控制台
System.out.println("最小值:Character.MIN_VALUE="
+ (int) Character.MIN_VALUE);
// 以数值形式而不是字符形式将Character.MAX_VALUE输出到控制台
System.out.println("最大值:Character.MAX_VALUE="
+ (int) Character.MAX_VALUE);
}
}
执行上述代码后,控制台将输出如下运行结果:
基本类型:byte 二进制位数:8
包装类:java.lang.Byte
最小值:Byte.MIN_VALUE=-128
最大值:Byte.MAX_VALUE=127
基本类型:short 二进制位数:16
包装类:java.lang.Short
最小值:Short.MIN_VALUE=-32768
最大值:Short.MAX_VALUE=32767
基本类型:int 二进制位数:32
包装类:java.lang.Integer
最小值:Integer.MIN_VALUE=-2147483648
最大值:Integer.MAX_VALUE=2147483647
基本类型:long 二进制位数:64
包装类:java.lang.Long
最小值:Long.MIN_VALUE=-9223372036854775808
最大值:Long.MAX_VALUE=9223372036854775807
基本类型:float 二进制位数:32
包装类:java.lang.Float
最小值:Float.MIN_VALUE=1.4E-45
最大值:Float.MAX_VALUE=3.4028235E38
基本类型:double 二进制位数:64
包装类:java.lang.Double
最小值:Double.MIN_VALUE=4.9E-324
最大值:Double.MAX_VALUE=1.7976931348623157E308
基本类型:char 二进制位数:16
包装类:java.lang.Character
最小值:Character.MIN_VALUE=0
最大值:Character.MAX_VALUE=65535
引用数据类型(Reference Types)
引用数据类型是 Java 中用于存储对象(包括数组、类实例和接口实现)引用的数据类型。与基本数据类型直接存储值不同,引用数据类型存储的是对象在内存中的地址(引用)。
✅ 引用数据类型的主要特点
- 存储的是引用(内存地址),而不是实际数据本身
- 默认值为 null(未指向任何对象时)
- 大小不固定,取决于所引用的对象
- 位于堆内存(Heap Memory)中
- 需要通过 new 关键字创建(除了字符串字面量和数组初始化语法)
✅ 引用数据类型分类
1. 类(Class)类型
- 预定义类:如 String、System、Scanner 等
- 自定义类:开发者自己定义的类
String str = "Hello"; // String 类
Scanner sc = new Scanner(System.in); // Scanner 类
Person p = new Person(); // 自定义类
2. 接口(Interface)类型
- 可以引用实现了该接口的类的对象
List<String> list = new ArrayList<>(); // List 是接口,ArrayList 是实现类
Runnable r = new MyRunnable(); // Runnable 是接口
3. 数组(Array)类型
- 所有数组都是引用类型,即使元素是基本类型
int[] intArray = new int[10]; // 基本类型数组
String[] strArray = new String[5]; // 引用类型数组
✅ 引用数据类型的内存分配
栈内存(Stack) 堆内存(Heap)
+--------+ +----------------+
| 引用变量 | -------> | 对象实例 |
| (地址) | | (实际数据存储) |
+--------+ +----------------+
- 栈内存:存储引用变量(变量名和对象引用地址)
- 堆内存:存储实际对象数据
✅ 引用数据类型的重要概念
1. 对象创建与引用
Person p1 = new Person(); // 创建对象并将引用赋给p1
Person p2 = p1; // p2和p1现在引用同一个对象
2. 比较操作
- == 比较引用(内存地址)
- equals() 比较内容(需要正确重写)
String s1 = new String("Java");
String s2 = new String("Java");
System.out.println(s1 == s2); // false(不同对象)
System.out.println(s1.equals(s2)); // true(内容相同)
3. 垃圾回收
- 当对象没有任何引用指向时,会被垃圾回收器回收
Person p = new Person();
p = null; // 之前创建的Person对象现在可以被回收
基本数据类型 vs 引用数据类型
特性 | 基本数据类型 | 引用数据类型 |
---|---|---|
存储内容 | 实际值 | 对象引用(地址) |
内存位置 | 栈内存 | 引用在栈,对象在堆 |
默认值 | 各类型不同(如int为0) | null |
大小 | 固定 | 不固定 |
参数传递 | 值传递 | 引用传递(传递地址) |
示例 | int, char, double | String, 数组, 自定义类 |
评论区 0
发表评论
教程介绍
Java 通用高级编程语言,广泛应用在企业级应用开发、移动应用开发、大数据处理等领域。
12
章节
72
阅读
0
评论
反馈提交成功
感谢您的反馈,我们将尽快处理您的反馈