【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方法样例代码

技术:

  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 )

Scanner类

nextInt()

nextInt() 方法之后在其后输入的空格键、Tab键或Enter键等视为分隔符或结束符,其仍在缓冲区内,没有被变量接受

next()

next()对输入有效字符之前遇到的空格键、Tab键或回车Enter键等结束符,next()方法会自动将其去掉,只有在输入有效字符之后,next()方法才将其后输入的空格键、Tab键或回车Enter键等视为分隔符或结束符。所以next()不能得到带空格的字符串。

nextLine()

nextLine()是只有遇到回车Enter时才结束(只认回车Enter为其输入结束符),所以可以得到带空格的字符串

posted @   沙汀鱼  阅读(18)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示