【JavaSE】一些常见API(Object、Objects、Math、System、BigDecimal、包装类、Arrays)

发布时间 2023-12-02 10:28:02作者: 沙汀鱼

Object类

Object类介绍

toString方法

  • 直接println(对象名),默认会自动调用(对象名.toString),而.toString默认是返回地址信息 -> 全类名(包名+类名)@地址的十六进制哈希值,因此如果println(对象名)控制台没有输出地址值,说明该类一定重写了Object类的toString方法,比如String类和ArrayList类。

equals方法

  • Object类默认的的equals方法和两个引用数据类型对象直接用"=="判断是相同的效果,都是比较对象的地址。因此通常需要重写这个方法。

重写equals方法样例代码重写equals方法样例代码

技术:

  1. 对象类型判断
  2. 多态的转型
Student.java
package com.EveX.domain;

import java.util.Objects;

public class Student {
    String name;
    int age;

    /*自动生成的equals重写方法
    @Override
    public boolean equals(Object o) {
        // 比较两个对象的地址,如果地址相同肯定内容相同
        if (this == o) return true;
        // 比较两个对象的字节码,如果字节码不同->类型不同
        if (o == null || getClass() != o.getClass()) return false;
        // 多态向下转型
        Student student = (Student) o;
        // 比较成员变量
        return age == student.age && Objects.equals(name, student.name);
    }
    */

    // 自己手写的equals重写方法
    @Override
    public boolean equals(Object obj) {
        // 使用instanceof关键字先判断传入的对象是不是Student类型
        if(obj instanceof Student) {
            // 因为父类不能调用子类的特有成员,因此需要利用多态的转型将Object转为Student类
            Student stu = (Student) obj;
            return name.equals(stu.name) && age == stu.age;
        } else {
            return false;
        }
    }

    public Student() {
    }

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

    /**
     * 获取
     * @return name
     */
    public String getName() {
        return name;
    }

    /**
     * 设置
     * @param name
     */
    public void setName(String name) {
        this.name = name;
    }

    /**
     * 获取
     * @return age
     */
    public int getAge() {
        return age;
    }

    /**
     * 设置
     * @param age
     */
    public void setAge(int age) {
        this.age = age;
    }

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

EqualsDemo.java
package com.EveX.object;

import com.EveX.domain.Student;

public class EqualsDemo {
    public static void main(String[] args) {
        Student stu1 = new Student("张三", 23);
        Student stu2 = new Student("张三", 23);
        System.out.println(stu1.equals(stu2));
    }
}

Objects类

  • Objects.equals(obj1, obj2)方法内部依赖于比较的对象中的equals方法,如果没有重写equals,那么Objects.equals(obj1, obj2)默认比较的还是对象地址
  • Objects.equals()优点在于内部实现存在空指针判断,可以避免空指针异常的问题

Math类

Math是个工具类——构造方法私有,所有的成员方法都是静态static方法,可以通过类名直接调用

System类

System也是一个工具类

  • System.currentTimeMillis()一般用于计算程序运行时间

    1970年1月1日 0时0分0秒是计算机中的时间原点,C语言的生日
package com.EveX.system;

public class SystemDemo {
    public static void main(String[] args) {

        long st = System.currentTimeMillis();

        long a = 0;
        for(int i = 1; i <= 1000000000; ++ i ) {
            a += i;
        }
        System.out.println(a);

        long ed = System.currentTimeMillis();

        System.out.println(ed - st);

    }
}

BigDecimal类

  • .doubleValue()可以将BigDecimal对象转为double变量

包装类


以Integer为例:


包装类面试题

Integer.java的valueOf方法源码
    public static Integer valueOf(int i) {
        if (i >= IntegerCache.low && i <= IntegerCache.high)
            return IntegerCache.cache[i + (-IntegerCache.low)];
        return new Integer(i);
    }

自动拆装箱的本质是底层自动调用了 Integer.valueOf()函数,而为了节省内存,将-128~127范围内的整数事先定义好存储在一个数组中,在这个范围内的自动拆装箱直接根据索引查找,不在该范围内的则new一个新的Integer对象。

Arrays类

Arrays又是一个工具类

binarySearch

复杂度O(logn),返回数值key在数组a中的索引,如果不存在返回[-(插入值)-1]

binarySearch
public static int binarySearch(int[] a, int key)

sort

复杂度O(nlogn),内部实现逻辑使用快排

sort
public static void sort( int[] a )