JAVA基础:基本数据类型和引用数据类型

大家好,我是夏幻灵 ,本篇文章我为大家讲解JAVA中非常重要的基础知识:基本数据类型和引用数据类型。 这是新人很容易混淆记忆 理解不清的地方 。鉴此,我会详详细细的把它讲明白,并附上易错点的讲解。

在 Java 中,数据类型体系非常严谨,分为两大阵营:基本数据类型 和 引用数据类型

理解它们的区别,是掌握 Java 内存管理、避免 NullPointerException 以及正确比较对象(== vs .equals)的前提。

一、 基本数据类型

这是 Java 语言内置的、最基础的数据单元。它们不是对象,不包含方法,仅仅用来存储简单的数值。

Java 定义了 8 种基本数据类型:

|-----|---------|---------|-----------|---------------|
| 分类 | 类型 | 字节大小 | 说明 | 取值范围(大概) |
| 整数型 | byte | 1 byte | 节省空间的整数 | -128~127 |
| | short | 2 bytes | 短整数 | -30000~30000 |
| | int | 4 bytes | 默认整数类型 | -21亿~21亿 |
| | long | 8 bytes | 长整数 (需加L) | 非常大 |
| 浮点型 | float | 4 bytes | 单精度(需加F) | 小数点后约七位 |
| | double | 8 bytes | 默认浮点类型 | 精度是float的两倍 |
| 字符型 | char | 2bytes | 单个字符 | Unicode字符 |
| 布尔型 | boolean | 1 bit* | 真/假 | true ,false |

内存特点

*存储位置:直接存储在栈 (Stack) 中(如果是局部变量)。

* 存储内容:变量空间里存的就是真实的数据值。

* 效率:因为不需要在堆中开辟空间,读写速度极快。

二、 引用数据类型

除了上述 8 种基本类型外,其他所有类型都是引用数据类型。它们通常用来描述复杂的对象。

主要包括三大类:

* 类 :如 String, Scanner, System, 以及你自己写的 User, Student 类。

* 接口 :如 List, Map。

* 数组 :如 int[], String[]。

内存特点

* 存储位置:分为两部分。

* 引用变量:存在栈 (Stack) 中。

* 实际对象:存在堆 (Heap) 中。

* 存储内容:栈里的变量存的是堆内存的地址(类似于门牌号 0x1122),而不是数据本身。

* 比喻:引用变量就像一个遥控器,它指向堆里的电视机(对象)。

三、 核心区别对比 (面试重点)

这是最容易混淆的地方,请看对比表:

|---------|----------|--------------------|
| 比较维度 | 基本数据类型 | 引用数据类型 |
| 变量存的是什么 | 值 | 地址 |
| 内存分配 | 栈上分配 | 堆上分配对象 栈上存引用 |
| 赋值行为 | 复制数值 | 复制地址 |
| 比较行为 | 比较数值是否相等 | 比较地址是否相等(是不是同一个对象) |

  1. 赋值行为的区别
java 复制代码
// --- 基本类型 ---
int a = 10;
int b = a;  // 把 10 复制给 b
b = 20;     // b 变了
System.out.println(a); // a 还是 10,互不影响

// --- 引用类型 ---
int[] arr1 = {1, 2};
int[] arr2 = arr1;    // 把地址复制给 arr2 (arr1 和 arr2 指向同一个数组)
arr2[0] = 99;         // 通过 arr2 修改数组
System.out.println(arr1[0]); // arr1 看到的也变成了 99,一变都变
  1. 比较行为的区别 (==)

这是新手最大的坑:

* 基本类型用 == 比较,是看"数值一样吗?"

* 引用类型用 == 比较,是看"地址一样吗?"(即"是同一个对象吗?")

java 复制代码
<!-- end list -->
int x = 10;
int y = 10;
System.out.println(x == y); // true (数值相等)

String s1 = new String("abc"); // 堆里开辟了一块空间,地址 A
String s2 = new String("abc"); // 堆里开辟了另一块空间,地址 B
System.out.println(s1 == s2);  // false (虽然内容一样,但地址不同!)

// 正确的引用类型内容比较方法:

java 复制代码
System.out.println(s1.equals(s2)); // true (比较内容)

四、 两个特殊概念

  1. String 的特殊性

String 是引用类型,但它太常用了,所以 Java 对它做了特殊优化(字符串常量池)。

java 复制代码
* String s = "hello"; (字面量创建):如果池子里有 "hello",直接指向它;没有则创建。
 * String s = new String("hello"); (强制创建):不管池子里有没有,都在堆里创建一个新对象。
  1. 包装类 (Wrapper Classes)

Java 为了让基本数据类型也能拥有面向对象的特性(比如作为对象存入集合 ArrayList),为这 8 种类型提供了对应的包装类。

* int -> Integer

* char -> Character

* double -> Double

* ... (其他首字母大写)

注意:Integer 是引用类型!

Integer a = 100; // 自动装箱 (Auto-boxing),系统自动把 int 变成 Integer 对象

int b = a; // 自动拆箱 (Auto-unboxing)

五、 总结

* 想存数字、字符、布尔值 -> 用 基本数据类型 (int, double, boolean...),效率高,存在栈里。

* 想存对象、字符串、数组 -> 用 引用数据类型,变量是遥控器,对象在堆里。

* 比较基本类型 -> 用 ==。

* 比较引用类型的内容 -> 用 .equals()。

相关推荐
冰_河1 分钟前
QPS从300到3100:我靠一行代码让接口性能暴涨10倍,系统性能原地起飞!!
java·后端·性能优化
桦说编程3 小时前
从 ForkJoinPool 的 Compensate 看并发框架的线程补偿思想
java·后端·源码阅读
躺平大鹅5 小时前
Java面向对象入门(类与对象,新手秒懂)
java
初次攀爬者5 小时前
RocketMQ在Spring Boot上的基础使用
java·spring boot·rocketmq
花花无缺5 小时前
搞懂@Autowired 与@Resuorce
java·spring boot·后端
Derek_Smart7 小时前
从一次 OOM 事故说起:打造生产级的 JVM 健康检查组件
java·jvm·spring boot
NE_STOP8 小时前
MyBatis-mybatis入门与增删改查
java
孟陬11 小时前
国外技术周刊 #1:Paul Graham 重新分享最受欢迎的文章《创作者的品味》、本周被划线最多 YouTube《如何在 19 分钟内学会 AI》、为何我不
java·前端·后端
想用offer打牌11 小时前
一站式了解四种限流算法
java·后端·go