java常用类 Object,String,Math,Date介绍

1. java.lang.Object 类

1.1、Object类是什么?

        Object 类是 Java 中所有类的超类(根类)。每个类都直接或间接地继承自 Object。因此,理解 Object 类的方法至关重要。

1.2、主要方法介绍
1.2.1 toString()
  • 作用:返回对象的字符串表示。默认实现是 类名@哈希码的无符号十六进制表示(例如 java.lang.Object@1b6d3586)。
  • 为什么重要:当使用 System.out.println(object) 打印对象,或进行字符串拼接时,会自动调用此方法。
  • 最佳实践:强烈建议在自定义类中重写此方法,以返回一个清晰、有意义的描述性字符串。
public class Person {
    private String name;
    private int age;

    // ... 构造方法和其他代码 ...

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

// 使用
Person person = new Person("Alice", 25);
System.out.println(person); // 输出: Person{name='Alice', age=25}
1.2.2 equals(Object obj)
  • 作用:判断两个对象是否“逻辑上相等”。默认实现是 == ,即比较两个对象的内存地址是否相同。
  • 为什么重要:我们通常关心的是对象的内容是否相等,而不是它们是否是同一个对象。
  • 最佳实践通常需要和 hashCode() 方法一起重写。重写 equals 时,必须遵循自反性、对称性、传递性、一致性等契约。
@Override
public boolean equals(Object obj) {
    // 1. 检查是否是同一个对象
    if (this == obj) return true;
    // 2. 检查是否为null或类是否不同
    if (obj == null || getClass() != obj.getClass()) return false;
    // 3. 类型转换
    Person person = (Person) obj;
    // 4. 比较关键字段
    return age == person.age && Objects.equals(name, person.name);
}
1.2.3 hashCode()
  • 作用:返回对象的 哈希码值,主要用于哈希表(如 HashMap, HashSet)中。
  • 重要规则:如果两个对象根据 equals() 方法是相等的,那么它们必须具有相同的哈希码。反之则不一定。
  • 最佳实践:重写 equals() 时,必须重写 hashCode(),使用相同的字段来计算哈希码。
@Override
public int hashCode() {
    return Objects.hash(name, age); // 使用Java自带的工具方法
}

1.2.4 getClass()
  • 作用:返回此对象的运行时类(Class 对象)。常用于反射机制。
1.2.5 clone()
  • 作用:创建并返回此对象的一个副本。要实现克隆,类必须实现 Cloneable 接口。

2. java.lang.String 类

2.1、String类是什么?

        String 类代表字符串。Java 程序中的所有字符串字面值(如 "abc")都是此类的实例。String 对象是不可变的(Immutable),一旦创建,其值就不能被改变。

2.2、主要特性介绍
2.2.1 不可变性
  • 任何对字符串的修改操作(如拼接、替换)都会 返回一个新的 String 对象,原对象不变。
  • 优点:线程安全,可以缓存哈希值,易于共享。
2.2.2 字符串常量池
  • JVM 为了减少重复字符串的创建,维护了一个特殊的内存区域—— 字符串常量池
  • 使用字面量(String s1 = "hello";)方式创建字符串时,会先检查池中是否存在,存在则直接返回引用。
  • 使用 new 关键字(String s2 = new String("hello");)会强制在 堆 中创建一个新对象。
2.3、常用方法
2.3.1 长度和判空
  • int length():返回长度。
  • boolean isEmpty():判断是否为空字符串。
2.3.2 查找和比较
  • boolean equals (Object anObject):比较内容是否相等。
  • boolean equalsIgnoreCase (String anotherString):忽略大小写比较。
  • boolean contains (CharSequence s):是否包含某个字符序列。
  • int indexOf (int ch) / lastIndexOf (int ch):查找字符或字符串的位置。
2.3.3 截取和分割
  • String substring(int beginIndex) / substring(int beginIndex, int endIndex):截取子串。
  • String[] split(String regex):根据正则表达式分割字符串。
2.3.4 替换和去除空格
  • String replace(char oldChar, char newChar):替换字符。
  • String replaceAll(String regex, String replacement):正则替换。
  • String trim():去除首尾空白符。 (JDK 11+ 推荐使用 strip())
2.3.5 大小写转换
  • String toLowerCase() / toUpperCase()

注意

        由于不可变性,在需要频繁修改字符串的场景(如循环拼接),使用 String 会导致大量临时对象,性能低下。此时应使用 StringBuilder(非线程安全)或 StringBuffer(线程安全)。

3. java.lang.Math 类

3.1 Math类是什么?

        Math 类包含用于执行基本数学运算的方法,如指数、对数、平方根和三角函数。它是一个工具类,构造器是 private 的,所有方法都是 static 的,可以直接通过类名调用。

3.2、常用方法
3.2.1 基本运算
  • Math.abs(int/long/float/double a):绝对值
  • Math.max(a, b) / Math.min(a, b):最大值/最小值
3.2.2 舍入运算
  • Math.ceil(double a):向上取整
  • Math.floor(double a):向下取整
  • Math.round(float/double a):四舍五入
3.2.3 指数和对数
  • Math.pow(double a, double b):返回 a 的 b 次幂
  • Math.sqrt(double a):平方根
  • Math.log(double a):自然对数
3.2.4 三角函数
  • Math.sin/cos/tan(double a):正弦/余弦/正切
3.2.5 随机数
  • Math.random():返回 [0.0, 1.0) 之间的随机 double 值。 (更灵活的随机数生成推荐使用 java.util.Random 类)

(1)生成0到n的随机数,即 [0.0, 1.0)

// 比如0到10  假如n=11 
// 0x10=0.0    10x1.0=10.0
// 左闭又开,所以取不到右边的数 即1x11=11(取不到)
int num=(int)(Math.random()*(n+1);

(2)生成a到b的随机数,即 [a, b]

// 设 a=10, b=20
//  Math.random() 属于 【0,1)
// (b-a+1) = 20-10+1=11  . 乘于【0,1) 即 11x 【0,1)= 【0,11)
// a + 【0,11) = 10。  10 + 【0,11) = [10,21)  ->取整数 = [10,20】
int num= a+ (int)(Math.random()*(b-a+1)); 

4. java.util.Date 类与新的日期时间 API

4.1. 传统的 java.util.Date (已过时,不推荐在新代码中使用)
  • Date 类表示特定的瞬间,精确到毫秒。

  • 问题

    • 设计缺陷:年份从1900年开始算起,月份从0开始。

    • 可变性Date 对象是可变的,不利于并发安全。

    • 格式化DateFormat 和 SimpleDateFormat 是非线程安全的。

4.2. Java 8 引入的新日期时间 API (java.time 包) (强烈推荐)

        Java 8 引入了全新的日期时间 API,位于 java.time 包下,核心类有:

  • LocalDate:只包含日期,例如 2023-10-27

  • LocalTime:只包含时间,例如 15:30:00

  • LocalDateTime:包含日期和时间,例如 2023-10-27T15:30:00

  • Instant:时间戳,用于机器时间。

  • DateTimeFormatter:用于日期时间的格式化和解析,是线程安全的。

public class DateDemo {
    public static void test() {
        // 获取当前日期和时间
        LocalDate today = LocalDate.now();
        LocalTime now = LocalTime.now();
        LocalDateTime currentDateTime = LocalDateTime.now();
        System.out.println(today);
        System.out.println(now);
        System.out.println(currentDateTime);

        // 创建特定日期
        LocalDate birthday = LocalDate.of(1990, Month.OCTOBER, 27);
        System.out.println(birthday);

        // 日期运算(非常方便!)
        LocalDate nextWeek = today.plusWeeks(1);
        LocalDate firstDayOfMonth = today.withDayOfMonth(1);
        System.out.println(nextWeek);
        System.out.println(firstDayOfMonth);

        // 日期比较
        boolean isAfter = birthday.isAfter(today);
        System.out.println(isAfter);

        // 格式化
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
        String formatted = currentDateTime.format(formatter); // "2023-10-27 14:30:00"
        System.out.println(formatted);

        // 解析
        LocalDateTime parsedDateTime = LocalDateTime.parse("2023-10-27 14:30:00", formatter);
        System.out.println(parsedDateTime);
    }

    public static void main(String[] args) {
        DateDemo.test();
    }
}

5、总结

类/包核心用途关键点
Object所有类的根父类掌握 toStringequalshashCode 的用法和重写规则。
String表示不可变的字符序列理解不可变性、常量池;熟练掌握其丰富的 API。
Math提供静态数学工具方法直接通过类名调用,用于常规数学计算和随机数。
java.time处理日期和时间 (Java 8+)替代老旧的 Date/Calendar,API 清晰、强大且线程安全。

        对于新项目,请务必使用 java.time API 来代替 java.util.Date  java.util.Calendar

纯个人笔记,仅供参考,不保证内容完全准确性。如有疏漏,欢迎指正。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值