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()。

相关推荐
weixin199701080162 小时前
闲鱼 item_get - 商品详情接口对接全攻略:从入门到精通
java·后端·spring
cike_y2 小时前
Spring-Bean的作用域&Bean的自动装配
java·开发语言·数据库·spring
qq_12498707533 小时前
基于深度学习的蘑菇种类识别系统的设计与实现(源码+论文+部署+安装)
java·大数据·人工智能·深度学习·cnn·cnn算法
十八度的天空3 小时前
第01节 Python的基础语法
开发语言·python
谈笑也风生3 小时前
经典算法题型之排序算法(三)
java·算法·排序算法
yue0083 小时前
C# 字符串倒序
开发语言·c#
自己的九又四分之三站台3 小时前
导入数据到OG GraphQL以及创建graph
java·后端·graphql
强子感冒了3 小时前
Java学习笔记:String、StringBuilder与StringBuffer
java·开发语言·笔记·学习
低保和光头哪个先来3 小时前
场景6:对浏览器内核的理解
开发语言·前端·javascript·vue.js·前端框架