Java 基本数据类型与引用数据类型
·
Java 数据类型分为 基本数据类型(Primitive Types) 和 引用数据类型(Reference Types), 两者在内存存储方式、默认值、使用场景等方面都有明显区别。
1. 基本数据类型(Primitive Types)
(注意java关键字区分大小写! 所以任何大写字母开头是基本数据类型都不是基本数据类型,如Boolean)
| 分类 | 数据类型 | 占用内存 | 取值范围/内容 | 默认值 | 示例 |
|---|---|---|---|---|---|
| 整数型 | byte | 1 字节 | -128 ~ 127 | 0 | byte b = 10; |
| short | 2 字节 | -32,768 ~ 32,767 | 0 | short s = 20; | |
| int | 4 字节 | -2³¹ ~ 2³¹-1 | 0 | int i = 30; | |
| long | 8 字节 | -2⁶³ ~ 2⁶³-1 | 0L | long l = 40; | |
| 浮点型 | float | 4 字节 | 约 ±3.40282347E+38F(7 位有效数字) | 0.0f | float f = 3.14f; |
| double | 8 字节 | 约 ±1.79769313486231570E+308(15 位有效数字) | 0.0d | double d = 3.14; | |
| 字符型 | char | 2 字节 | 单个 Unicode 字符(0 ~ 65535) | ‘\u0000’ | char c = ‘A’; |
| 布尔型 | boolean | 1 位(逻辑上) | true 或 false | false | boolean b = true; |
2. 引用数据类型(Reference Types)
| 分类 | 示例 | 存储内容 | 默认值 | 特点 |
|---|---|---|---|---|
| 类(Class) | String, Scanner, Date | 堆内存中的对象地址(引用) | null | 需要 new 创建对象 |
| 接口 | Runnable, List | 实现类对象的引用 | null | 只能指向实现接口的对象 |
| 数组 | int[], String[] | 堆内存中数组对象的引用 | null | 长度固定,可存放多个元素 |
| 枚举 | Enum Type | 枚举常量的引用 | null | 常用于限定取值范围 |
3. 主要区别
| 对比点 | 基本数据类型 | 引用数据类型 |
|---|---|---|
| 存储位置 | 栈内存,直接存储值 | 栈中存储引用,指向堆中对象 |
| 默认值 | 数字型为 0,布尔型为 false,char 为 ‘\u0000’ | null |
| 使用方式 | 直接操作数值 | 通过引用操作对象 |
| 是否需要 new | 不需要 | 大多数需要(数组、对象等) |
| 是否可为 null | 否 | 是 |
| 封装类支持 | 有对应的包装类(Integer, Double 等) | 本身就是对象类型 |
| 赋值 | 把“值”本身复制一份给新变量,两个变量互不影响 | 把“引用地址”赋值给新变量,多个变量指向同一对象,修改内容会互相影响 |
4.补充:String类
4.1 创建String对象
在使用直接赋值方法创建String对象时(如下代码所示)
String s = "abc";
看起来和基本数据类型的直接赋值很像,但 String 实际上是一个定义在 java.lang 包中的类,属于引用数据类型。
且String 对象是不可变的,任何修改(如拼接)都会生成新的对象,而不会改变原有内容。因此,String有时候会被误认为是基本数据类型,但从严格意义上它依然是引用类型。
创建String对象的两种方式
-
直接赋值
String name = "Alice"; -
使用构造方法
- 默认构造方法创建空字符串(内容为空,打印不是null)
String s = new String();- 传入字符串初始化
String s = new String("abc");- 字符数组初始化:应对字符串不能改变的情况,可以改变字符数组的一个或多个字符形成新的字符串
char[] chars = {'a', 'b', 'c'}; String s = new String(chars);- 字节数组初始化:会根据 默认字符集(通常是 UTF-8 或平台设置)把字节数组解码成字符串。
byte[] bytes = {104, 101, 108, 108, 111}; // ASCII 对应 "hello" String s4 = new String(bytes);
4.2 String对象比较
基本数据类型的比较使用 ==即可,String对象是引用数据类型,即使两字符串内容相同,但是==在比较时是使用地址,所以要使用boolean equals方法 和 boolean equalsIgnoreCase方法(忽略大小写的比较)
boolean result = s1.equals(s2);
更多推荐
所有评论(0)