欢迎光临
我们一直在努力

JavaSE 核心常用类全解析(Object/包装类/String/StringBuilder/BigDecimal)

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、框架底层都会频繁依赖这些类,建议结合代码动手实操,吃透底层原理后可规避大量线上空指针、精度、字符串性能问题。

赞(0)
未经允许不得转载:171主机测评 » JavaSE 核心常用类全解析(Object/包装类/String/StringBuilder/BigDecimal)
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址