Comparable接口——实现对象排序
Arrays工具类提供了sort()方法对数组进行排序,但只能针对可以进行大小比较的数据类型,对对象则无法直接进行比较。
如果想对对象作比较,对象就需要实现Comparable接口,这个接口中只有一个方法compareTo(),这个方法中定义了对象比较的规则,我们可以重写这个方法来按照我们希望的顺序对对象进行排序,然后再调用sort()方法就是按照新规则排序了。
compareTo()方法的核心思想:
public int compareTo(Object obj)
在CompareTo方法中,将当前对象和obj对象进行比较,如果大于返回1,等于返回0,小于返回-1。
CompareTo方法的写法比较固定
@Override
public int compareTo(Person o) {
//将传入对象强转为当前对象
Person person = (Person)o;
//按照希望的属性进行比较
//如果需要降序排列将正负1对调即可
if(this.age < person.age) {
return -1;
}
if(this.age > person.age) {
return 1;
}
return 0;
}
放在整体例子中理解
Person类有id,name,age,birth属性,希望按照age为Person数组排序
import java.util.Arrays;
public class Test3{
public static void main(String[] args) {
Person person1 = new Person(2002,"李四",30,"1990-5-20");
Person person2 = new Person(2001,"张三",26,"1994-8-1");
Person person3 = new Person(2003,"王麻子",36,"1984-1-13");
Person[] persons = {person1,person2,person3};
//原始顺序输出
for(Person person:persons) {
System.out.println(person.toString());
}
System.out.println();
//排序后输出
Arrays.sort(persons);
for(Person person:persons) {
System.out.println(person.toString());
}
}
}
class Person implements Comparable<Person>{
private int id;
private String name;
private int age;
private String birth;
public Person() {}
public Person(int id, String name, int age, String birth) {
super();
this.id = id;
this.name = name;
this.age = age;
this.birth = birth;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getBirth() {
return birth;
}
public void setBirth(String birth) {
this.birth = birth;
}
@Override
public String toString() {
return getId() + "\t" + getName() + "\t" + getAge() + "\t" + getBirth();
}
@Override
public int compareTo(Person o) {
Person person = (Person)o;
if(this.age < person.age) {
return -1;
}
if(this.age > person.age) {
return 1;
}
return 0;
}
}
Math类(java.lang.Math)
java.lang.Math类提供了一系列静态方法用于科学计算,其参数和返回值一般为double型。如果需要更加强大的数学运算能力,计算高等数学中相关内容,可以使用apache commons下的Math类库。
Math类常用方法
方法 | 作用 |
---|---|
abs | 绝对值 |
acos、asin、atan、cos、sin、tan | 三角函数 |
sqrt | 平方根 |
pow(double a, double b) | a的b次幂 |
max(double a, double b) | 取大值 |
min(double a, double b) | 取小值 |
ceil(double a) | 大于a的最小整数 |
floor(double a) | 小于a的最大整数 |
random() | 返回0.0-1.0的随机数 |
long round(double a) | 四舍五入 |
toDegrees(double angrad) | 弧度–>角度 |
toRadians(double angdeg) | 角度–>弧度 |
Math.PI | 常量π |
Math.E | 常量e |
//取整相关
System.out.println(Math.ceil(3.2)); //4.0
System.out.println(Math.floor(3.2)); //3.0
System.out.println(Math.round(3.2)); //3
System.out.println(Math.round(3.8)); //4
System.out.println(Math.ceil(-3.2)); //-3.0
System.out.println(Math.floor(-3.2)); //-4.0
System.out.println(Math.round(-3.2)); //-3
System.out.println(Math.round(-3.8)); //-4
//绝对值、开方
System.out.println(Math.abs(-3.2)); //3.2
System.out.println(Math.sqrt(25)); //5.0
System.out.println(Math.pow(5, 2)); //25.0
//常用常量
System.out.println(Math.PI); //3.141592653589793
System.out.println(Math.E); //2.718281828459045
//随机数
System.out.println(Math.random());
Random类(java.util.Random)
Math.random()只能提供0-1之间的double类型数据,如果我们需要的随机数用Math.random()获取太过复杂,就可以使用Random类。Random类是专门用来生成随机数的,且Math.random()底层调用的就是Random类的nextDouble()方法。
Random random = new Random();
//随机生成[0,1)之间的double类型数据
System.out.println(random.nextDouble());
//随机生成int类型允许范围之内的整型数据
System.out.println(random.nextInt());
//随机生成[0,1)之间的float类型数据
System.out.println(random.nextFloat());
//随机生成true或false
System.out.println(random.nextBoolean());
//随机生成[0,10)之间的int类型数据
System.out.println(random.nextInt(10));
//随机生成[20,30)之间的int类型数据
System.out.println(20+random.nextInt(10));
//随机生成[20,30)之间的int类型数据(这就是使用Math.random的方法)
System.out.println(20+(int)(random.nextDouble()*10));
字符串相关类
String类、StringBuilder类、StringBuffer类是三个字符串相关类,String类对象是不可变字符序列,后两者是可变字符序列,StringBuilder效率高但线程不安全,StringBuffer效率低但线程安全。
【知晓的丧day拯救计划】java基础学习笔记补充 String相关类
时间处理相关类
计算机世界,把1970年1月1日00:00:00定位基准时间,以毫秒为单位进行度量,1970年之后用正数表示,1970年之前用负数表示,用long类型的值来表示。
可以用下面的代码获取当前操作系统时间的毫秒数
long now = System.currentTimeMillis();
这个毫秒数是所有时间类的核心值,年月日都是按照这个数值计算出来的。