JavaSE 核心常用类全解析(Object/包装类/String/StringBuilder/BigDecimal)
前言
JavaSE API阶段高频基础类是面试与开发必备核心,本文整合 Object 、基本类型包装类、 String 、可变字符串、 BigDecimal 五大模块,覆盖底层原理、代码案例、面试高频题,一次性梳理完整知识点,适合入门复习与面试突击。
一、Object 类:所有类的根父类
1. 基础介绍
1. 包路径: java.lang.Object ,Java中所有类直接/间接继承Object,是继承树顶层根类。
2. 多态特性: Object 引用可以接收任意类型对象。
3. 通用能力:所有Java对象都能直接调用Object中定义的方法。
2. 五大核心方法详解
(1)getClass():获取对象真实运行类型
– 返回值: Class 对象,代表引用实际存储的对象类型
– 开发用途:判断两个对象是否为同一类型,相等返回 true
java
class Animal{}
class Dog extends Animal{}
class Cat extends Animal{}
public class Test {
public static void main(String[] args) {
Animal a1 = new Cat();
Animal a2 = new Dog();
System.out.println(a1.getClass() == a2.getClass()); // false
}
}
(2)hashCode():对象哈希码
– 返回int整数,由对象内存十六进制地址转换而来;
– 规则:不同对象堆地址不同,默认哈希值一定不同。
(3)toString():对象字符串描述【开发重点】
1. 作用:打印对象属性信息,子类必须重写;
2. 重写规范:拼接对象所有属性,返回字符串;
java
class Student {
String name;
int age;
@Override
public String toString() {
return "name="+name+",age="+age;
}
}
3. 和getter区别:- getter:仅返回单个属性,不改变数据类型;
– toString:一次性返回全部属性,统一封装为String。
(4)equals(Object obj):对象内容比较【面试核心】
① == 与 equals 底层区分
– == :- 基本数据类型:直接比较数值;
– 引用数据类型:比较堆内存地址,判断是否为同一个对象。
– Object原生equals:底层直接 return this == obj ,本质也是比较地址;
– 业务需求:开发需要对比对象属性内容,因此子类必须重写equals。
② equals标准重写模板
java
@Override
public boolean equals(Object obj) {
// 1. 自反性:自身和自己比较直接true
if (this == obj) return true;
// 2. 空值判断:传入null直接false
if (obj == null) return false;
// 3. 类型校验:两个对象类型必须一致
if (this.getClass() != obj.getClass()) return false;
// 4. 向下转型,访问子类独有属性
Student s = (Student) obj;
// 5. 属性对比:基本类型用==,引用类型用equals
return this.age == s.age && this.name.equals(s.name);
}
(5)finalize():垃圾回收回调方法【面试】
1. 垃圾对象:无任何引用指向的对象;
2. GC(垃圾回收器):自动清理垃圾对象、释放堆内存;
3. 回收时机:- 自动回收:JVM内存不足时一次性清理所有垃圾对象,回收前自动执行 finalize() ;
– 手动触发: System.gc() 通知GC,不保证立刻执行;
4. 开发注意: finalize() 执行时机不可控,禁止写入核心业务代码。
二、包装类:基本数据类型 ↔ 引用类型桥梁
1. 概念
8种基本数据类型,一一对应 java.lang 包下的引用类型,称为包装类。
基本类型 包装类
byte Byte
short Short
int Integer
long Long
float Float
double Double
char Character
boolean Boolean
2. 类型互相转换(以int/Integer为例)
(1)int → Integer(手动装箱)
java
// 方式1:构造方法
Integer i1 = new Integer(12);
// 方式2:静态valueOf方法(推荐)
Integer i2 = Integer.valueOf(12);
(2)Integer → int(手动拆箱)
java
int a = i1.intValue();
(3)String 与 Integer 互转
java
// String → Integer
Integer i3 = Integer.valueOf("123");
// Integer → String
String s = i3.toString();
(4)String ↔ int(业务高频)
java
// String转int(核心)
int num = Integer.parseInt("123");
// 注意:字符串必须纯数字,否则抛出 NumberFormatException
// int转String
String str = 123 + "";
3. 自动装箱/自动拆箱(JDK5新特性)
1. 定义:基本类型与包装类之间自动转换,无需手动调用方法;
java
Integer i = 12; // 自动装箱,底层 Integer.valueOf(12)
int a = i; // 自动拆箱,底层 i.intValue()
2. 底层缓存池(Integer面试难点)
Integer.valueOf() 内置缓存数组 IntegerCache.cache ,缓存 -128 ~ 127 所有数字:
– 数值在区间内:直接复用缓存对象,地址相同;
– 超出区间:new全新Integer对象,地址不同。
java
Integer i1 = 12;
Integer i2 = 12;
System.out.println(i1 == i2); // true,命中缓存
Integer i3 = 150;
Integer i4 = 150;
System.out.println(i3 == i4); // false,超出缓存区间
4. 实际开发用途
区分有效数据与空数据:
– 基本类型 int 默认值0,无法区分「数值0」和「无数据」;
– 包装类 Integer 默认值 null ,可用于数据库实体、接口参数标识空值。
三、String 不可变字符串【开发重点】
1. 两种创建方式(面试必问)
1. 字面量创建 String s1 = "hello";
仅在字符串常量池创建1个对象,复用已有常量,不重复创建。
2. new对象创建 String s2 = new String("world");
创建2个对象:堆内存new String实例 + 常量池字面量。
2. 常用核心方法
方法 作用 注意事项
charAt(int index) 根据下标获取字符 下标越界抛出 StringIndexOutOfBoundsException
length() 获取字符串长度 数组长度是 数组名.length (无括号)
equals(String str) 对比字符串内容 字符串对比必须用equals,禁止==
trim() 去除首尾空格 转换数字前清理空格常用
split(String regex) 按分隔符拆分字符串,返回String数组 支持正则分隔符
字符串遍历示例:
java
String s = "hello";
for(int i=0; i<s.length(); i++){
char c = s.charAt(i);
System.out.println(c);
}
3. String不可变性原理
1. String底层封装 final char[] 数组,字符数组不可修改;
2. 字符串拼接不会修改原对象,只会复制副本操作,频繁拼接效率极低;
3. 特殊优化: String s = "a"+"b" 编译期直接优化为 "ab" ,仅生成1个对象(编译器常量优化)。
四、可变字符串:StringBuilder / StringBuffer
1. 两者版本与特性对比
1. StringBuffer:JDK1.0,加 synchronized 锁,线程安全,运行速度慢;
2. StringBuilder:JDK5.0,无锁,线程不安全,运行速度快(单线程开发首选)。
2. 基础用法
构造方法
java
// 空参构造
StringBuilder sb1 = new StringBuilder();
// 带初始字符串
StringBuilder sb2 = new StringBuilder("test");
核心拼接方法
java
sb1.append("内容"); // 直接在原字符数组追加,不产生新对象
3. 面试题:String、StringBuilder、StringBuffer区别
1. String:不可变,频繁拼接效率低,线程安全;
2. StringBuilder:可变字符数组,拼接效率极高,单线程使用,线程不安全;
3. StringBuffer:可变字符数组,加同步锁,多线程并发安全,性能略低。
五、BigDecimal:浮点数精确运算类【业务高频】
1. 基础信息
包路径: java.math.BigDecimal ;
作用:解决 float/double 浮点运算丢失精度问题(金额计算必备)。
2. 推荐构造方法
java
// 传入字符串,保证精度(禁止直接传double)
BigDecimal num1 = new BigDecimal("0.1");
BigDecimal num2 = new BigDecimal("0.2");
3. 四则运算方法
java
BigDecimal r1 = num1.add(num2); // 加法
BigDecimal r2 = num1.subtract(num2); // 减法
BigDecimal r3 = num1.multiply(num2); // 乘法
// 除法:参数(除数,保留小数位数,舍入模式) 四舍五入ROUND_HALF_UP
BigDecimal r4 = num1.divide(num2, 2, BigDecimal.ROUND_HALF_UP);
六、全文面试考点总结
1. Object类equals重写规范、 == 与equals核心区别;
2. Integer缓存池-128~127底层原理;
3. String两种创建方式内存差异、不可变性;
4. String、StringBuilder、StringBuffer性能与线程安全对比;
5. BigDecimal为什么不用double构造,金额计算规范;
6. 包装类与基本类型的业务场景区分(null空值处理)。
结尾
以上五类是JavaSE API阶段地基,集合、IO、框架底层都会频繁依赖这些类,建议结合代码动手实操,吃透底层原理后可规避大量线上空指针、精度、字符串性能问题。

