【JavaSE】一些常见API(Object、Objects、Math、System、BigDecimal、包装类、Arrays、Scanner)
Object类
Object类介绍
toString方法
- 直接println(对象名),默认会自动调用(对象名.toString),而.toString默认是返回地址信息 -> 全类名(包名+类名)@地址的十六进制哈希值,因此如果println(对象名)控制台没有输出地址值,说明该类一定重写了Object类的toString方法,比如String类和ArrayList类。
equals方法
- Object类默认的equals方法和两个引用数据类型对象直接用"=="判断是相同的效果,都是比较对象的地址。因此通常需要重写这个方法。
重写equals方法样例代码重写equals方法样例代码
技术:
- 对象类型判断
- 多态的转型
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 )
Scanner类
nextInt()
nextInt() 方法之后在其后输入的空格键、Tab键或Enter键等视为分隔符或结束符,其仍在缓冲区内,没有被变量接受
next()
next()对输入有效字符之前遇到的空格键、Tab键或回车Enter键等结束符,next()方法会自动将其去掉,只有在输入有效字符之后,next()方法才将其后输入的空格键、Tab键或回车Enter键等视为分隔符或结束符。所以next()不能得到带空格的字符串。
nextLine()
nextLine()是只有遇到回车Enter时才结束(只认回车Enter为其输入结束符),所以可以得到带空格的字符串