1.比较器
1.1 作用1.2 两种实现对象排序的方式1.2.1 两者区别1.3 Comparable接口
1.3.1 概述1.3.2 重写compareTo(T o)方法的规则1.3.3 缺点1.3.4 实例 1.4 Comparator接口
1.4.1 概述1.4.2 实例 2.System类、Math类、BigInteger与BigDecimal3.枚举类
3.1 概述
3.1.1 一些例子 3.2 jdk1.5之前的定义方式3.3 jdk1.5新增的定义方式--enum关键字
3.3.1 细节3.3.2 代码 3.4 Enum类的主要方法3.5 枚举类实现接口
3.5.1 细节3.5.2 统一实现方法3.5.3 每个枚举值分别来实现方法
1.比较器 1.1 作用java中定义的运算符,大多数只适用于基本数据类型。因为引用数据类型的对象不能直接使用运算符进行比较,所以java提供了比较器(内部还是对基本数据类型进行的比较)。
1.2 两种实现对象排序的方式java.lang.Comparable:自然排序
java.lang.Comparator:定制排序
Comparable接口的比较规则是在实现类中重写的,此类中所有的对象都可以使用;
Comparator接口的比较规则是在排序时临时定义的;
- Comparable接口中有一个抽象方法public int compareTo(T o);,像String,包装类都重写了compareTo方法,用于对象之间的比较。如果想要对自定义类的对象进行默认排序,必须实现Comparable接口,然后重写compareTo方法,在compareTo方法中进行属性的比较;实现Comparable接口的对象列表(和数组)可以通过 Collections.sort 或Arrays.sort进行自动排序。
如果当前对象大于形参对象o,返回正整数;
如果当前对象小于形参对象o,返回负整数;
如果两者相等,返回0;
只能在类中重写compareTo方法,不能在具体对象中重写,有局限性。
1.3.4 实例方式1:直接进行属性的比较
方式2:可以调用相应的包装类中的compare方法
@Override
public int compareTo(Object o) {
if (o instanceof Person) {
Person o1 = (Person) o;
return this.age > o1.age ? 1 : (this.age == o1.age) ? 0 : -1;
return Integer.compare(this.age, o1.age);
}
throw new RuntimeException("传入类型不正确");
}
1.4 Comparator接口
1.4.1 概述
- 如果类中没有实现Comparable接口,或者类中实现了Comparable接口但不适合当前操作且不想修改类中代码,可以考虑使用 Comparator 的对象来排序。一般使用(匿名)内部类,需要重写Comparator 接口中的compare(Object o1,Object o2)方法,重写规则与compareTo()一致。创建匿名内部类当作排序方法的形参传入,排序规则只可以使用一次。
p是一个Person类型的数组
Arrays.sort(p, new Comparator2.System类、Math类、BigInteger与BigDecimal() { @Override public int compare(Person o1, Person o2) { return o1.getAge() - o2.getAge(); } });
完整笔记
3.枚举类 3.1 概述- 如果一个类只有有限个确定的对象,那么可以使用枚举类。如果需要定义一组常量时,强烈建议使用枚举类。若枚举只有一个对象, 则可以作为一种单例模式的实现方式。
星期:Monday(星期一)、…、Sunday(星期天)
性别:Man(男)、Woman(女)
季节:Spring(春节)…Winter(冬天)
class Season{
// 1. 声明枚举类的属性:private final
private final String name;
private final int age;
// 2. 私有化构造器,并在构造器中初始化对象的属性
private Season(String name,int age){
this.name = name;
this.age = age;
}
// 3. 创建本类的对象:static final
public static final Season SPRING = new Season("春天",1);
public static final Season SUMMER = new Season("夏天",2);
public static final Season AUTUMN = new Season("秋天",3);
public static final Season WINTER = new Season("冬天",4);
// 4. 其余诉求:提供属性的getter方法
public String getName() {
return name;
}
public int getAge() {
return age;
}
// 5. 其余诉求: 重写同toString方法
@Override
public String toString() {
return "Season{" +
"name='" + name + ''' +
", age=" + age +
'}';
}
}
3.3 jdk1.5新增的定义方式–enum关键字
3.3.1 细节
- 枚举类中创建的常量对象放到类的最上边,仅由常量名和参数列表构成,其余相同修饰信息都可以省略;枚举类的常量对象之间用",“隔开,末尾对象”;"结束;属性、私有化构造器、getter方法和上面的定义方式一致;enum类继承于java.lang.Enum类,所以不能再继承于其他类;Enum类中重写了toString()方法,返回当前枚举对象的常量名;JDK 1.5 中可以在 switch 表达式中使用Enum定义的枚举类的对象作为表达式, case 子句可以直接使用枚举值的名字, 无需添加枚举类作为限定。
enum Season1{
// 1. 枚举类对象:放在类的最前边,仅由对象名和参数列表构成
SPRING("春天",1),
SUMMER("夏天",2),
AUTUMN("秋天",3),
WINTER("冬天",4);
// 2. 声明枚举类的属性:private final
private final String name;
private final int age;
// 3. 私有化构造器,并在构造器中初始化对象的属性
private Season1(String name,int age){
this.name = name;
this.age = age;
}
// 4. 其余诉求:提供属性的getter方法
public String getName() {
return name;
}
public int getAge() {
return age;
}
}
如果没有属性,那么空参构造器可以省略,直接写对象名即可。
enum Season1{
SPRING,
SUMMER,
AUTUMN,
WINTER;
}
3.4 Enum类的主要方法
- values()方法:返回枚举类型的对象数组。该方法可以很方便地遍历所有的枚举值。valueOf(String str):可以把一个字符串转为对应的枚举类对象。要求字符串必须是枚举类对象的“名字”。如不是,会有运行时异常:IllegalArgumentException。可以用来查找枚举类中的对象。toString():返回当前枚举类对象常量的名称
enum Season1{
SPRING,
SUMMER,
AUTUMN,
WINTER;
}
Season1[] values = Season1.values();
for (int i = 0; i < values.length; i++) {
System.out.println(values[i]);
}
System.out.println("--------------------------------------");
Season1 season1 = Season1.valueOf("SPRING");
System.out.println(season1);
SPRING SUMMER AUTUMN WINTER ----------------------------- SPRING3.5 枚举类实现接口 3.5.1 细节
- 和普通 Java 类一样,枚举类可以实现一个或多个接口;若每个枚举值在调用实现的接口方法呈现相同的行为方式,则只要统一实现该方法即可;若需要每个枚举值在调用实现的接口方法呈现出不同的行为方式, 则可以让每个枚举值分别来实现该方法;
interface test{
void show();
}
enum Season1 implements test{
SPRING,
SUMMER,
AUTUMN,
WINTER;
@Override
public void show() {
System.out.println("季节");
}
}
3.5.3 每个枚举值分别来实现方法
interface test{
void show();
}
enum Season1 implements test{
SPRING{
@Override
public void show() {
System.out.println("春");
}
},
SUMMER {
@Override
public void show() {
System.out.println("夏");
}
},
AUTUMN {
@Override
public void show() {
System.out.println("秋");
}
},
WINTER {
@Override
public void show() {
System.out.println("冬");
}
};
}



