1. Object 类

Object 是类层次结构的根,每个类都默认继承 Object 作为超类,因此 Object 类的方法是所有类都具备的核心方法。

NO. 方法名称 类型 说明
1 public Object() 构造器 无参构造
2 public boolean equals(Object obj) 普通 对象比较
3 public int hashCode() 普通 取得哈希码
4 public String toString() 普通 对象打印时调用

1.1 == 与 equals () 方法

1.1.1 ==
  • 基本类型:比较值,只要变量值相等,结果为 true

java

运行

int a = 5;
int b = 6;
if (a == b) {
    // 逻辑处理
}
  • 引用类型:比较引用(内存地址),只有指向同一个对象时,结果才为 true

java

运行

Student s1 = new Student();
Student s2 = new Student();
if (s1 == s2) {
    // 逻辑处理(此处为false,因为是两个不同对象)
}
1.1.2 equals()
  • 默认行为:所有类继承 Object 的 equals () 方法,默认实现与==一致,比较对象地址

java

运行

public boolean equals(Object obj) {
    return (this == obj);
}
  • 特例:Integer、Long、Double、String、Date 及包装类重写了 equals (),比较类型 + 内容,不考虑地址
1.1.3 重写 equals () 方法

场景:需要根据对象属性而非地址进行比较时

java

运行

class Student {
    private String name;
    private int age;

    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Student student = (Student) o;
        if (age != student.age) return false;
        return name != null && name.equals(student.name);
    }
}

public class ObjectDemo {
    public static void main(String[] args) {
        Student s1 = new Student("林青霞", 30);
        Student s2 = new Student("林青霞", 30);
        System.out.println(s1.equals(s2)); // 输出true,属性相同
    }
}

1.2 hashCode () 方法

1.2.1 hashCode () 概述
  • 本地方法:定义在java.lang.Object中,返回对象哈希值(基于内存地址或属性计算的整型值)

java

运行

public native int hashCode();
  • 核心作用:在散列表(HashMap、HashSet 等)中快速查找和存储对象,提高效率
1.2.2 重写 hashCode 方法

重写 equals () 时必须重写 hashCode (),保证 equals 相等的对象 hashCode 一定相同

java

运行

class Teacher {
    private String name;
    private int age;

    public Teacher(String name, int age) {
        this.name = name;
        this.age = age;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Teacher teacher = (Teacher) o;
        if (age != teacher.age) return false;
        return name.equals(teacher.name);
    }

    @Override
    public int hashCode() {
        int result = 17;
        result = 31 * result + (name == null ? 0 : name.hashCode());
        result = 31 * result + age;
        return result;
    }
}

class Student {
    private String name;
    private int age;

    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Student student = (Student) o;
        if (age != student.age) return false;
        return name != null && name.equals(student.name);
    }

    // 简化写法
    @Override
    public int hashCode() {
        return Objects.hash(name, age);
    }
}
1.2.3 hashCode 和 equals 的关系
  • 核心结论:
    1. 两个对象 equals 相等 → hashCode 一定相同
    2. 两个对象 hashCode 相同 → 不一定 equals 相等(仅表示在散列表中存放在同一 "篮子")

1.3 toString () 方法

1.3.1 toString () 概述
  • Object 类默认实现:返回 "类名 @哈希码十六进制" 字符串

java

运行

public String toString() {
    return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
1.3.2 重写 toString () 方法

场景:需要自定义对象打印格式时

java

运行

class Student {
    private String name;
    private int age;

    public Student() {}

    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }

    // getter/setter省略

    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

public class ObjectDemo {
    public static void main(String[] args) {
        Student s1 = new Student("林青霞", 19);
        System.out.println(s1.toString()); // 输出Student{name='林青霞', age=19}
    }
}

2. 包装类

2.1 包装类概述

Java 为 8 种基本数据类型提供了对应的包装类,使其具备类的特性(可调用方法、参与面向对象编程)。

基本数据类型 包装类
byte Byte
short Short
int Integer
long Long
float Float
double Double
char Character
boolean Boolean

2.2 Integer 类

2.2.1 概述

Integer 封装了 int 类型属性,提供了操作 int 数据的常用方法。

2.2.2 Integer 构造方法(已过时,了解即可)

java

运行

// 1. 通过int值创建
Integer i1 = new Integer(100);
System.out.println(i1);

// 2. 通过String值创建(仅支持数字字符串)
Integer i2 = new Integer("100");
// Integer i2 = new Integer("abc"); // 抛出NumberFormatException
System.out.println(i2);
2.2.3 Integer 成员方法
方法 说明
public int intValue() 以 int 类型返回 Integer 的值
public static int parseInt(String s) 将字符串解析为十进制 int
public static String toString(int i) 将 int 转换为 String
public static Integer valueOf(int i) 返回表示指定 int 值的 Integer 实例
public static Integer valueOf(String s) 返回表示指定字符串值的 Integer 实例

2.3 int 和 String 类型的相互转换

2.3.1 int 转换为 String

java

运行

public static void main(String[] args) {
    int number = 100;

    // 方式1:直接拼接空字符串(简单直观)
    String s1 = number + "";
    System.out.println(s1);

    // 方式2:String.valueOf()(推荐,效率更高)
    String s2 = String.valueOf(number);
    System.out.println(s2);
}
2.3.2 String 转换为 int

java

运行

public static void main(String[] args) {
    String s = "100";

    // 方式1:String → Integer → int
    Integer i = Integer.valueOf(s);
    int x = i.intValue();
    System.out.println(x);

    // 方式2:Integer.parseInt()(推荐,直接转换)
    int y = Integer.parseInt(s);
    System.out.println(y);
}

2.4 自动拆箱和自动装箱

  • 自动装箱:基本数据类型 → 对应包装类
  • 自动拆箱:包装类 → 对应基本数据类型

java

运行

​
​
// 自动装箱:int → Integer
Integer i = 30;
Float f = 30.3f;

// 自动拆箱:Integer → int
int x = i;
float y = f;

​

(2)使用场景

① 适合的场景(解决基本类型默认值问题):

java

运行

// 问题:int类型有默认值0,无法返回null;改用Integer即可
public static Integer method(Integer a){
    return null;
}

② 不适合的场景(性能损耗):

java

Integer sum = 0;
for (int i = 0; i < 5000; i++) {
    sum = sum + i; // 问题:每次运算都会自动拆箱+装箱,创建5000个Integer对象,消耗内存
}

3. 字符串类

3.1 String 类

3.1.1 String 类的概述
  • 定义:String 类代表字符串,所有双引号字符串("abc")都是 String 类的对象
  • 核心特点:
    1. final 类,不能被继承
    2. 底层用final char[] value存储,创建后内容不可变
    3. 字符串常量存储在方法区常量池,可共享

java

运行

String s1 = "abc";// 字面量方式(常量池)
String s2 = "abc";
s1 = "hello";// 不是修改原字符串,而是创建新字符串"hello"

System.out.println(s1 == s2); // true(初始指向同一常量)
System.out.println(s1); // hello
System.out.println(s2); // abc
3.1.2 String 类的构造方法
方法名 说明
public String() 创建空字符串(value = new char [0])
public String(String original) 根据已有字符串创建
public String(char[] chs) 根据字符数组创建

java

运行

// 空字符串
String s1 = new String();
System.out.println("s1:" + s1);

// 基于字符串创建
String s2 = new String("abc");
System.out.println("s2:" + s2);

// 基于字符数组创建
char[] arr = {'a', 'b'};
String s3 = new String(arr);
System.out.println("s3:" + s3);
3.1.3 构造方法及内存差异

字面量方式:

1. 内存示意图(简易版)

2. 图示解释

  • 栈内存:s1 和 s2 是引用变量,存储的是 “堆中同一个 String 对象” 的地址(地址 A),因此 s1 和 s2 指向同一个对象;
  • 堆内存:只创建 1 个 String 对象,该对象的value属性存储 “常量池中 char 数组” 的地址(地址 B);
  • 常量池:存储实际的字符数组char[],是字符串的真实数据,被所有指向该字面量的 String 对象共享。

构造方法方式:

1. 内存示意图(简易版)

2. 图示解释

  • 栈内存:s3 和 s4 是不同的引用变量,分别存储 “堆中两个不同 String 对象” 的地址(地址 C、地址 D);
  • 堆内存new String()会强制创建新的 String 对象,因此堆中生成 2 个独立的 String 对象,但这两个对象的value属性都指向常量池中同一个 char 数组的地址(地址 B);
  • 常量池:char 数组依然只存储一份,是 JVM 的优化机制,避免重复创建相同字符数据。

内存示意图简化说明

  • 字面量方式:栈(s1/s2)→ 堆(同一个 String 对象)→ 常量池(char []);
  • 构造方法方式:栈(s3/s4)→ 堆(两个不同 String 对象)→ 常量池(同一个 char [])。
3.1.4 String 类的常用方法
方法 说明
char charAt(int index) 返回指定索引的字符
boolean equals(Object anObject) 比较字符串内容(区分大小写)
int indexOf(String str) 返回子字符串首次出现的索引
int length() 返回字符串长度
String replaceAll(String regex, String replacement) 正则替换所有匹配子串
char[] toCharArray() 转换为字符数组
String trim() 去除首尾空格
String substring(int beginIndex) 从 beginIndex 截取到末尾
String substring(int beginIndex, int endIndex) 截取 [beginIndex, endIndex) 区间
String[] split(String regex) 按正则拆分字符串
String toLowerCase() 转为小写
String toUpperCase() 转为大写

java

运行

// 示例1:equals和大小写转换
String s1 = "HelloWorld";
String s2 = "helloworld";
System.out.println(s1.equals(s2)); // false
System.out.println(s1.toLowerCase().equals(s2)); // true

// 示例2:截取字符串
String s7 = "北京是我国的首都";
String s8 = s7.substring(2); // 从索引2开始
System.out.println(s8); // 是我国的首都
String s9 = s7.substring(2, 5); // [2,5)
System.out.println(s9); // 是我国

// 示例3:拆分字符串
String str2 = "hello.world.java";
String[] strs2 = str2.split("\\."); // 注意转义
for (int i = 0; i < strs2.length; i++) {
    System.out.println(strs2[i]); // 依次输出hello、world、java
}
练习
  1. 模拟用户登录:给定用户名和密码,提供 3 次登录机会,登录成功 / 失败给出对应提示
  2. 字符串反转:将指定字符串或字符串指定部分反转(如 "abcdefg" 反转为 "abfedcg")

3.2 StringBuffer 类

3.2.1 StringBuffer 类的概述
  • 可变字符序列,可视为 "字符串容器",支持内容增删
  • 核心特点:
    1. 线程安全(方法加 synchronized),效率较低
    2. 底层用可变char[]存储
3.2.2 StringBuffer 类的构造方法
方法名 说明
StringBuffer() 初始容量 16 的空缓冲区
StringBuffer(int size) 指定容量的缓冲区
StringBuffer(String str) 以指定字符串初始化

java

运行

// 空缓冲区
StringBuffer sb = new StringBuffer();
System.out.println("sb:" + sb);
System.out.println("sb.length():" + sb.length()); // 0

// 基于字符串初始化
StringBuffer sb2 = new StringBuffer("hello");
System.out.println("sb2:" + sb2); // hello
System.out.println("sb2.length():" + sb2.length()); // 5
3.2.3 StringBuffer 类的常用方法
方法 说明
StringBuffer append(xxx) 添加数据,返回自身(支持链式调用)
StringBuffer reverse() 反转字符序列
String toString() 转换为 String 类型

java

运行

// 链式添加
StringBuffer sb = new StringBuffer();
sb.append("hello").append("world").append("java").append(100);
System.out.println("sb:" + sb); // helloworldjava100

// 反转
sb.reverse();
System.out.println("sb:" + sb); // 001avajdlrowolleh

// 拆分(需先转String)
StringBuffer sb3 = new StringBuffer("h,e,l,l,o");
String[] strArr = sb3.toString().split(",");
for (String str : strArr) {
    System.out.print(str + " "); // h e l l o
}
练习

定义方法实现字符串反转:键盘录入字符串,调用方法后输出反转结果(如输入 abc,输出 cba)

3.3 StringBuilder 类

3.3.1 StringBuilder 类的概述
  • 与 StringBuffer 功能完全一致,均为可变字符序列
  • 核心特点:
    1. 线程不安全,效率较高(无同步锁)
    2. 底层用可变char[]存储
    3. 单线程环境优先使用(推荐)
效率对比案例

java

运行

public class StringBuilderDemo {
    public static void main(String[] args) {
        long startTime = 0L;
        long endTime = 0L;
        String text = "";
        StringBuffer buffer = new StringBuffer("");
        StringBuilder builder = new StringBuilder("");

        // StringBuffer测试
        startTime = System.currentTimeMillis();
        for (int i = 0; i < 20000; i++) {
            buffer.append(String.valueOf(i));
        }
        endTime = System.currentTimeMillis();
        System.out.println("StringBuffer的执行时间:" + (endTime - startTime));

        // StringBuilder测试
        startTime = System.currentTimeMillis();
        for (int i = 0; i < 20000; i++) {
            builder.append(String.valueOf(i));
        }
        endTime = System.currentTimeMillis();
        System.out.println("StringBuilder的执行时间:" + (endTime - startTime));

        // String测试(效率最低)
        startTime = System.currentTimeMillis();
        for (int i = 0; i < 20000; i++) {
            text = text + i;
        }
        endTime = System.currentTimeMillis();
        System.out.println("String的执行时间:" + (endTime - startTime));
    }
}
练习
  1. 从路径中提取文件名(如 D:\myfile\hello.java → hello.java)
  2. 从路径中提取文件类型(如 D:\myfile\hello.java → .java)

4. 日期类

4.1 System 类

  • 核心方法:public static long currentTimeMillis()
  • 功能:返回当前时间与 1970 年 1 月 1 日 00:00:00 的毫秒差值(时间戳)
  • 用途:计算程序执行时间

java

运行

long startTime = System.currentTimeMillis();
for (int i = 0; i < 20000; i++) {
    if (i % 2 == 0) System.out.println(i);
}
long endTime = System.currentTimeMillis();
System.out.println("执行时间:" + (endTime - startTime) + "ms");

4.2 Date 类

4.2.1 Date 类概述

代表特定时间点,精确到毫秒。

4.2.2 Date 类构造方法
方法名 说明
public Date() 初始化当前时间
public Date(long date) 初始化指定时间戳(毫秒)对应的时间

java

运行

// 当前时间
Date d1 = new Date();
System.out.println(d1);

// 指定时间戳(1小时=3600000毫秒)
long date = 1000 * 60 * 60;
Date d2 = new Date(date);
System.out.println(d2);
4.2.3 Date 类常用方法
方法名 说明
public long getTime() 获取时间戳
public void setTime(long time) 设置时间戳

java

运行

Date date = new Date();
System.out.println(date);
System.out.println(date.getTime()); // 时间戳
System.out.println(System.currentTimeMillis()); // 与getTime()结果一致

// 设置时间
long time = System.currentTimeMillis();
date.setTime(time);
System.out.println(date);

4.3 Calendar 类

4.3.1 Calendar 类概述
  • 抽象类,提供日期字段操作(年、月、日、时、分、秒)
  • 获取实例:Calendar rightNow = Calendar.getInstance();(无需 new)
4.3.2 Calendar 类常用方法
方法名 说明
public final void set(int year,int month,int date) 设置年月日
public int get(int field) 获取指定字段值(field 为 Calendar 常量)
public abstract void add(int field, int amount) 增减指定字段值

java

运行

// 获取Calendar实例
Calendar c = Calendar.getInstance();

// 获取当前日期
int year = c.get(Calendar.YEAR);
int month = c.get(Calendar.MONTH) + 1; // 月份从0开始,需+1
int date = c.get(Calendar.DATE);
System.out.println(year + "年" + month + "月" + date + "日");

// 3年前的今天
c.add(Calendar.YEAR, -3);
year = c.get(Calendar.YEAR);
System.out.println(year + "年" + month + "月" + date + "日");

// 10年后的10天前
c.add(Calendar.YEAR, 10);
c.add(Calendar.DATE, -10);
year = c.get(Calendar.YEAR);
date = c.get(Calendar.DATE);
System.out.println(year + "年" + month + "月" + date + "日");

// 直接设置日期
c.set(2050, 10, 10); // 2050年11月10日(月份10对应11月)
year = c.get(Calendar.YEAR);
month = c.get(Calendar.MONTH) + 1;
date = c.get(Calendar.DATE);
System.out.println(year + "年" + month + "月" + date + "日");
练习

键盘输入任意年份,计算该年 2 月有多少天(提示:3 月 1 日往前推 1 天即为 2 月最后一天)

4.4 SimpleDateFormat 类

4.4.1 SimpleDateFormat 类概述
  • 功能:日期与字符串的格式化转换
  • 所在包:java.text.SimpleDateFormat
4.4.2 SimpleDateFormat 类构造方法
方法名 说明
public SimpleDateFormat() 默认格式(如:12-10-23 下午 2:30)
public SimpleDateFormat(String pattern) 自定义格式(如 "yyyy-MM-dd HH:mm:ss")
4.4.3 SimpleDateFormat 类常用方法
方法名 说明
public final String format(Date date) Date → String(格式化)
public Date parse(String source) String → Date(解析,需处理异常)

java

运行

import java.text.SimpleDateFormat;
import java.util.Date;

public class SimpleDateFormatDemo {
    public static void main(String[] args) throws Exception {
        // 1. Date → String(格式化)
        Date d = new Date();
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
        String s = sdf.format(d);
        System.out.println(s); // 如:2024年05月20日 14:30:00

        // 2. String → Date(解析)
        String ss = "2048-08-09 11:11:11";
        SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        Date dd = sdf2.parse(ss);
        System.out.println(dd);
    }
}
练习

定义日期工具类DateUtils,包含两个静态方法:

  1. public static String dateToString(Date date, String pattern):日期转指定格式字符串
  2. public static Date stringToDate(String str, String pattern):字符串转指定格式日期定义测试类DateTest验证工具类。

5. Arrays 工具类

5.1 Arrays 类概述

提供数组常用操作(排序、拷贝、转字符串等),所有方法均为静态方法,通过Arrays.调用。

5.2 Arrays 类构造方法

构造方法为私有,无法创建实例,直接使用静态方法。

5.3 Arrays 工具类常用方法

方法 说明
public static String toString(int[] a) 数组转字符串(便于打印)
public static void sort(int[] a) 数组排序(默认升序)
public static int[] copyOf(int[] original, int newLength) 数组拷贝(指定新长度)
public static int[] copyOfRange(int[] original, int from, int to) 区间拷贝([from, to))

java

运行

import java.util.Arrays;

public class ArraysDemo {
    public static void main(String[] args) {
        // 1. 数组排序与转字符串
        int[] arr = {24, 69, 80, 57, 13};
        System.out.println("排序前:" + Arrays.toString(arr));
        Arrays.sort(arr);
        System.out.println("排序后:" + Arrays.toString(arr));

        // 2. 数组拷贝
        int scores[] = {57, 81, 68, 75, 91};
        // 拷贝原数组,新数组长度8(多余位置补默认值0)
        int[] newScores1 = Arrays.copyOf(scores, 8);
        System.out.println("拷贝后(指定长度):" + Arrays.toString(newScores1));

        // 拷贝区间[0,5)(即原数组全部元素)
        int[] newScores2 = Arrays.copyOfRange(scores, 0, 5);
        System.out.println("区间拷贝后:" + Arrays.toString(newScores2));
    }
}

6. Random 类

6.1 概述

用于生成随机数,支持整数、浮点数、布尔值等多种类型。

6.2 Random 类的构造方法

方法名 说明
public Random() 无参构造(默认以系统时间为种子)
public Random(long seed) 有参构造(指定种子,种子相同则随机序列相同)

java

运行

// 无参(每次随机序列不同)
Random r1 = new Random();
// 有参(种子10,每次运行随机序列相同)
Random r2 = new Random(10);

6.3 Random 类中的常用方法

方法 说明
nextInt() 随机生成 int 范围内整数(-2³¹~2³¹-1)
nextInt(int bound) 随机生成 [0, bound) 区间整数
nextLong() 随机生成 long 范围内整数
nextFloat() 随机生成 [0.0, 1.0) 区间浮点数
nextDouble() 随机生成 [0.0, 1.0) 区间浮点数
nextBoolean() 随机生成 boolean 值(true/false)

java

运行

import java.util.Random;
import java.util.concurrent.ThreadLocalRandom;

public class RandomDemo {
    public static void main(String[] args) {
        Random random = new Random();

        // 随机boolean值
        for (int i = 0; i < 3; i++) {
            System.out.println("nextBoolean:" + random.nextBoolean());
        }

        // 随机[0.0,1.0)浮点数
        for (int i = 0; i < 3; i++) {
            System.out.println("nextDouble:" + random.nextDouble());
        }

        // 随机[0,10)整数
        for (int i = 0; i < 3; i++) {
            System.out.println("nextInt(10):" + random.nextInt(10));
        }

        // 多线程环境推荐使用ThreadLocalRandom(效率更高,无线程竞争)
        // 生成[1,100]区间整数(注意:上限不包含,需+1)
        int num = ThreadLocalRandom.current().nextInt(1, 101);
        System.out.println("ThreadLocalRandom:" + num);
    }
}
练习

随机生成 5 个 50~100 的随机数(包含 50 和 100)

总结

本文详细介绍了 Java 开发中最常用的 6 大类:Object 类(所有类的父类)、包装类(基本类型的面向对象封装)、字符串类(String/StringBuffer/StringBuilder)、日期类(Date/Calendar/SimpleDateFormat)、Arrays 工具类(数组操作)、Random 类(随机数生成)。

这些类是 Java 编程的基础,掌握其核心方法和使用场景,能大幅提高开发效率。建议结合文中案例动手实践,重点关注:

  • Object 类的 equals/hashCode/toString 重写规范
  • 字符串三类的区别与选型(String 不可变、StringBuffer 线程安全、StringBuilder 效率高)
  • 日期格式化与解析的异常处理
  • 工具类的静态方法调用方式

如果本文对你有帮助,欢迎点赞、收藏、关注!如有疑问,欢迎在评论区交流~

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐