Java基础入门Day10 | Object类、包装类、大数/日期类、冒泡排序与Arrays工具类 超详细总结
前言
本文是Java基础第十天的核心知识点全总结,覆盖Object类、包装类、大数运算、JDK8新日期API、冒泡排序、Arrays工具类 六大核心内容,同时详解面试常考的==与equals、native关键字、自动装箱拆箱、编译看左边等考点,搭配完整代码示例,适合Java新手快速学习、巩固、复习!
一、Object类 核心方法详解
1.1 概述
Object是Java中所有类的父类 (权限定类名:java.lang.Object),Java中任何类都会默认隐式继承Object,无需手动写extends Object。
1.2 核心常用方法
(1)equals() 方法(重点)
核心区别:== VS equals()
==:基本数据类型比较值 ;引用数据类型比较内存地址值equals():Object类中默认和==功能一致(比较地址);String/Integer等包装类重写了该方法,用于比较对象内容
java
public class ObjectDemo {
public static void main(String[] args) {
// String类重写了equals,比较内容
String s1 = new String("java");
String s2 = new String("java");
System.out.println(s1 == s2); // false 比较地址
System.out.println(s1.equals(s2)); // true 比较内容
// 自定义类未重写equals,默认比较地址
Student stu1 = new Student();
Student stu2 = new Student();
System.out.println(stu1.equals(stu2)); // false
}
}
class Student{}
(2)native 关键字
native修饰的方法称为本地方法:
- 方法没有方法体,不由Java语言实现
- 底层调用C/C++编写的本地函数库,执行效率更高
- Object类中的
hashCode()、getClass()都是native方法
(3)其他常用方法
toString():返回对象的字符串表示(默认格式:全类名@哈希值,开发中建议重写)hashCode():返回对象的哈希码值getClass():返回对象的运行时字节码对象
二、包装类 常用方法
2.1 概述
Java为8种基本数据类型提供了对应的包装类(引用类型),解决基本类型无法面向对象、无法参与对象操作的问题。
| 基本数据类型 | 对应包装类 |
|---|---|
| byte | Byte |
| short | Short |
| int | Integer |
| long | Long |
| float | Float |
| double | Double |
| char | Character |
| boolean | Boolean |
2.2 自动装箱 & 自动拆箱(JDK1.5+)⭐⭐
- 自动装箱:基本数据类型 → 包装类对象
- 自动拆箱:包装类对象 → 基本数据类型
java
public class WrapperDemo {
public static void main(String[] args) {
// 自动装箱:int → Integer(底层:Integer.valueOf(10))
Integer num1 = 10;
// 自动拆箱:Integer → int(底层:num1.intValue())
int num2 = num1;
}
}
2.3 核心常用方法
parseXxx(String s):字符串 → 基本数据类型valueOf(Xxx x):基本类型/字符串 → 包装类toString():包装类 → 字符串
java
// 字符串转int
int a = Integer.parseInt("666");
// int转Integer
Integer b = Integer.valueOf(888);
// 包装类转字符串
String s = b.toString();
三、大数运算类(BigInteger/BigDecimal)
3.1 作用
解决基本数值类型范围不足、浮点数精度丢失问题(如超大整数运算、金融金额计算)。
3.2 BigInteger(大整数运算)
用于超过long范围的整数运算,所有运算通过方法调用实现。
java
import java.math.BigInteger;
public class BigIntegerDemo {
public static void main(String[] args) {
BigInteger b1 = new BigInteger("12345678901234567890");
BigInteger b2 = new BigInteger("98765432109876543210");
BigInteger add = b1.add(b2); // 加法
BigInteger sub = b1.subtract(b2); // 减法
BigInteger mul = b1.multiply(b2); // 乘法
BigInteger div = b2.divide(b1); // 除法
System.out.println(add);
}
}
3.3 BigDecimal(精确浮点数运算)
⚠️ 禁止使用double参数构造,必须用String避免精度丢失!
java
import java.math.BigDecimal;
public class BigDecimalDemo {
public static void main(String[] args) {
BigDecimal b1 = new BigDecimal("0.1");
BigDecimal b2 = new BigDecimal("0.2");
// 精确计算 0.1+0.2
BigDecimal sum = b1.add(b2);
System.out.println(sum); // 输出0.3,无精度丢失
}
}
四、JDK8 全新日期时间API(重点推荐)
4.1 为什么用新日期API?
旧的Date/SimpleDateFormat存在线程不安全、设计混乱、时区支持差 等问题;
JDK8 提供了全新的日期时间类:不可变对象、线程安全、API设计更清晰,是开发首选!
4.2 核心类(全在 java.time 包下)
- LocalDate :仅表示 日期(年月日),无时间、无时区
- LocalTime :仅表示 时间(时分秒纳秒),无日期、无时区
- LocalDateTime :表示 日期+时间(年月日时分秒),最常用
- DateTimeFormatter :日期格式化/解析类,替代旧的
SimpleDateFormat,线程安全
4.3 导包说明
IDEA快捷键:Alt + 回车,直接导入 java.time 包下的对应类即可,无包冲突!
4.4 常用方法(完整代码示例)
java
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.format.DateTimeFormatter;
public class JDK8DateDemo {
public static void main(String[] args) {
// 1. 获取当前时间
LocalDate nowDate = LocalDate.now(); // 当前日期:2026-05-06
LocalTime nowTime = LocalTime.now(); // 当前时间:15:30:25.123
LocalDateTime nowDateTime = LocalDateTime.now(); // 当前日期+时间
System.out.println("当前日期:" + nowDate);
System.out.println("当前时间:" + nowTime);
System.out.println("当前日期时间:" + nowDateTime);
// 2. 创建指定时间(of方法,无参构造,直接传值)
LocalDate myDate = LocalDate.of(2026, 5, 6);
LocalTime myTime = LocalTime.of(12, 0, 0);
LocalDateTime myDateTime = LocalDateTime.of(2026, 5, 6, 12, 0, 0);
// 3. DateTimeFormatter 格式化(核心!)
// 定义格式化规则
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
// LocalDateTime → 字符串
String formatStr = nowDateTime.format(formatter);
System.out.println("格式化后:" + formatStr);
// 4. 字符串 → LocalDateTime(解析)
String timeStr = "2026-05-06 12:00:00";
LocalDateTime parseDateTime = LocalDateTime.parse(timeStr, formatter);
System.out.println("解析后:" + parseDateTime);
// 5. 获取单独的年月日时分秒
int year = nowDateTime.getYear();
int month = nowDateTime.getMonthValue();
int day = nowDateTime.getDayOfMonth();
System.out.println("年:" + year + " 月:" + month + " 日:" + day);
// 6. 日期计算(加/减时间,不可变类,会返回新对象)
LocalDateTime after = nowDateTime.plusDays(1); // 加1天
LocalDateTime before = nowDateTime.minusHours(2); // 减2小时
}
}
五、冒泡排序(手动实现)
5.1 核心原理
相邻两个元素两两比较,逆序则交换位置;每一轮循环将最大值/最小值冒到数组末尾。
- 轮数:数组长度 - 1
- 每轮比较次数:数组长度 - 1 - 轮数
5.2 代码实现
java
public class BubbleSort {
public static void main(String[] args) {
int[] arr = {3, 1, 5, 2, 4};
// 外层循环:控制排序轮数
for (int i = 0; i < arr.length - 1; i++) {
// 内层循环:控制每轮比较次数
for (int j = 0; j < arr.length - 1 - i; j++) {
// 前一个元素 > 后一个,交换位置(升序)
if (arr[j] > arr[j + 1]) {
int temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
// 打印排序结果
for (int num : arr) {
System.out.print(num + " ");
}
}
}
// 输出结果:1 2 3 4 5
六、Arrays工具类 常用方法
java.util.Arrays是Java提供的数组工具类 ,所有方法都是静态方法,直接通过类名调用。
核心方法演示
java
import java.util.Arrays;
public class ArraysDemo {
public static void main(String[] args) {
int[] arr = {3, 1, 5, 2, 4};
// 1. 数组升序排序
Arrays.sort(arr);
// 2. 把数组转为字符串(直接打印数组)
System.out.println(Arrays.toString(arr));
// 3. 二分查找(必须先排序)
int index = Arrays.binarySearch(arr, 3);
System.out.println("元素3的索引:" + index);
// 4. 复制数组
int[] newArr = Arrays.copyOf(arr, 3);
System.out.println(Arrays.toString(newArr));
}
}
七、面试核心:编译看左边,运行看右边 ⭐⭐⭐
7.1 成员方法(多态核心)
- 编译看左边 :编译时检查引用类型(父类) 是否有该方法,无则编译报错
- 运行看右边 :运行时执行子类重写的方法
7.2 成员变量(高频坑点)
- 编译看左边,运行也看左边
- 变量没有重写 ,只有隐藏,多态下访问变量只看引用类型
7.3 终极口诀
变量:编译运行都看左;方法:编译看左,运行看右!
代码示例(一看就懂)
java
class Fu {
// 父类成员变量
int num = 10;
public void show() {
System.out.println("父类方法");
}
}
class Zi extends Fu {
// 子类同名成员变量(隐藏父类变量,不是重写)
int num = 20;
// 子类重写方法
@Override
public void show() {
System.out.println("子类方法");
}
}
public class Test {
public static void main(String[] args) {
// 多态:父类引用 指向 子类对象
Fu f = new Zi();
// 1. 访问成员变量:编译+运行 都看左边(父类)
System.out.println(f.num);
// 结果:10 (不会输出子类的20)
// 2. 调用成员方法:编译看左,运行看右
f.show();
// 结果:子类方法
}
}
终极记忆口诀(面试直接背)
变量:编译运行都看左,
方法:编译看左,运行看右!
总结
- Object类 :所有类的父类,
equals重写后比较内容,native是本地方法 - 包装类 :基本类型的引用形式,自动装箱拆箱简化代码,
parseXxx转换字符串 - 大数类 :
BigInteger处理超大整数,BigDecimal实现精确浮点数运算 - JDK8新日期 :
LocalDate/LocalTime/LocalDateTime+DateTimeFormatter,线程安全、易用 - 冒泡排序:相邻元素比较交换,排序轮数=数组长度-1
- Arrays工具类:静态方法快速实现数组排序、打印、查找、复制
- 编译看左边:多态编译检查引用类型,运行执行子类重写方法