Java基础精讲:基本数据类型、引用数据类型与二分查找

📅 2026/7/2 2:27:58
Java基础精讲:基本数据类型、引用数据类型与二分查找
本文深耕Java核心基础详细拆解Java两大数据类型的底层原理、内存区别、赋值特性搭配可运行代码案例同时手把手讲解经典算法二分查找的原理、手写实现、边界问题及适用场景。适合Java新手夯实基础、面试查漏补缺全文通俗易懂、干货无废话。一、Java数据类型整体概述Java是一门强类型语言所有变量必须先定义数据类型才能使用Java数据类型整体分为两大体系基本数据类型8种和引用数据类型无第三种数据类型。二者的核心本质区别基本类型直接存储数据值本身引用类型存储对象的内存地址这也是所有特性差异的根源。1.1 基本数据类型Primitive TypeJava规定了8种固定的基本数据类型涵盖整型、浮点型、字符型、布尔型占用内存固定、效率高直接存储在栈内存中。类型分类数据类型字节大小取值范围默认值备注整型byte1字节-128 ~ 1270字节类型常用于文件读写short2字节-32768 ~ 327670短整型使用较少int4字节-2³¹ ~ 2³¹-10默认整型类型最常用long8字节-2⁶³ ~ 2⁶³-10L长整型数值后需加L/l浮点型float4字节正负3.4E-38 ~ 3.4E380.0f单精度浮点数值后加F/fdouble8字节正负1.7E-308 ~ 1.7E3080.0d双精度浮点默认浮点类型字符型char2字节0 ~ 65535\u0000存储单个字符布尔型boolean1字节true/falsefalse无取值范围仅两个状态1.2 引用数据类型Reference Type除8种基本类型外Java中所有类型均为引用类型核心特点是变量不存储真实数据仅存储堆内存的对象地址真实的对象数据存放在堆内存中。常见引用类型分类类Class自定义类、String、包装类Integer、Double等接口Interface如List、Map、Serializable数组Array所有数组都是引用类型int[]、String[]等枚举、注解特殊的引用类型引用类型默认值统一为null代表不指向任何堆内存对象。二、基本类型 vs 引用类型 核心区别面试高频很多新手只会死记硬背真正的核心差异集中在内存存储、赋值机制、参数传递、生命周期四个维度下面通过表格代码案例彻底吃透。2.1 核心差异对照表对比维度基本数据类型引用数据类型存储内容数据值本身堆内存对象的地址引用内存位置直接存储在栈内存栈存地址堆存真实对象赋值机制值拷贝变量相互独立地址拷贝多个变量指向同一对象参数传递值传递方法内修改不影响原变量引用拷贝方法内修改会影响原对象默认值各类型固定默认值0、false等null内存大小固定不可变对象大小不固定2.2 代码案例赋值差异演示① 基本类型赋值相互独立public class DataTypeDemo { public static void main(String[] args) { int a 10; // 拷贝a的值给ba、b完全独立 int b a; // 修改b不影响a b 20; System.out.println(a a); // 输出10 System.out.println(b b); // 输出20 } }② 引用类型赋值共享对象public class DataTypeDemo { public static void main(String[] args) { int[] arr1 {1,2,3}; // 拷贝arr1的内存地址arr1、arr2指向同一个数组对象 int[] arr2 arr1; // 修改arr2arr1同步变化 arr2[0] 99; System.out.println(arr1[0] arr1[0]); // 输出99 System.out.println(arr2[0] arr2[0]); // 输出99 } }2.3 关键面试坑点String是引用类型但因不可变性赋值表现类似基本类型属于特殊引用类型包装类是引用类型Integer、Long等是引用类型存在缓存机制Integer缓存-128~127Java中只有值传递引用类型传递的是「引用地址的副本」并非引用传递三、二分查找算法详解讲完数据类型基础我们结合数组引用类型讲解二分查找这是Java入门最经典的高效查找算法也是笔试面试必考算法。3.1 算法原理与适用条件核心原理二分查找又称折半查找核心思想每次取中间元素和目标值对比排除一半无效数据大幅缩小查找范围循环往复直到找到目标或查找结束。必备条件缺一不可查找的数据集必须有序升序/降序数据集支持随机访问数组适配链表不适用算法复杂度时间复杂度O(log₂n)远优于顺序查找O(n)数据量越大优势越明显空间复杂度O(1)迭代实现原地查找3.2 手写二分查找迭代版推荐迭代版无递归栈溢出风险工程开发、面试优先使用适配升序数组。public class BinarySearch { /** * 二分查找迭代实现 * param arr 有序升序数组 * param target 目标查找值 * return 找到返回索引未找到返回-1 */ public static int binarySearch(int[] arr, int target) { // 定义左右边界 int left 0; int right arr.length - 1; // 循环查找左边界右边界时持续查找 while (left right) { // 计算中间索引避免leftright溢出经典写法 int mid left (right - left) / 2; if (arr[mid] target) { // 找到目标值返回索引 return mid; } else if (arr[mid] target) { // 中间值小于目标目标在右区间左边界右移 left mid 1; } else { // 中间值大于目标目标在左区间右边界左移 right mid - 1; } } // 遍历结束未找到 return -1; } // 测试 public static void main(String[] args) { int[] sortArr {2,5,8,12,16,23,38,56,72,91}; int index binarySearch(sortArr, 23); System.out.println(目标值索引 index); // 输出5 } }3.3 递归版实现了解即可public static int binarySearchRecursion(int[] arr, int left, int right, int target) { // 递归终止条件 if (left right) { return -1; } int mid left (right - left) / 2; if (arr[mid] target) { return mid; } else if (arr[mid] target) { // 递归查找右区间 return binarySearchRecursion(arr, mid 1, right, target); } else { // 递归查找左区间 return binarySearchRecursion(arr, left, mid - 1, target); } }3.4 核心细节与避坑指南① 中间值计算防溢出错误写法int mid (left right) / 2left和right数值过大时会超出int最大值导致溢出。正确写法int mid left (right - left) / 2等价且绝对安全。② 边界条件判断left right不能写成left right否则会漏掉最后一个边界元素的查找。③ 重复元素处理基础二分查找仅返回任意一个匹配索引若需查找第一个/最后一个重复元素需微调边界逻辑。3.5 JDK自带二分查找工具开发中无需手写可直接使用Arrays.binarySearch()底层为优化后的二分查找。import java.util.Arrays; public class JdkBinarySearch { public static void main(String[] args) { int[] arr {2,5,8,12,16}; int index Arrays.binarySearch(arr, 12); System.out.println(index); // 输出3 } }四、知识总结Java数据类型分两类8种基本类型存值、栈存储、独立赋值、引用类型存地址、堆存对象、共享赋值核心差异根源内存分配机制不同所有赋值、传参特性均由此衍生二分查找是有序数组的高效查找算法核心是折半缩区间时间复杂度O(logn)工程中优先使用迭代版二分查找注意防溢出、边界判断两大核心坑点。五、拓展练习新手必练手写代码验证基本类型和引用类型的参数传递差异改造二分查找代码实现查找有序数组中第一个目标值的索引思考无序数组为什么不能使用二分查找