栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

java学习笔记4 -- 比较器

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

java学习笔记4 -- 比较器

目录

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:定制排序

1.2.1 两者区别

Comparable接口的比较规则是在实现类中重写的,此类中所有的对象都可以使用;
Comparator接口的比较规则是在排序时临时定义的;

1.3 Comparable接口 1.3.1 概述
    Comparable接口中有一个抽象方法public int compareTo(T o);,像String,包装类都重写了compareTo方法,用于对象之间的比较。如果想要对自定义类的对象进行默认排序,必须实现Comparable接口,然后重写compareTo方法,在compareTo方法中进行属性的比较;实现Comparable接口的对象列表(和数组)可以通过 Collections.sort 或Arrays.sort进行自动排序。
1.3.2 重写compareTo(T o)方法的规则

如果当前对象大于形参对象o,返回正整数;
如果当前对象小于形参对象o,返回负整数;
如果两者相等,返回0;

1.3.3 缺点

只能在类中重写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()一致。创建匿名内部类当作排序方法的形参传入,排序规则只可以使用一次。
1.4.2 实例

p是一个Person类型的数组

        Arrays.sort(p, new Comparator() {
            @Override
            public int compare(Person o1, Person o2) {
                return o1.getAge() - o2.getAge();
            }
        });
2.System类、Math类、BigInteger与BigDecimal

完整笔记

3.枚举类 3.1 概述
    如果一个类只有有限个确定的对象,那么可以使用枚举类。如果需要定义一组常量时,强烈建议使用枚举类。若枚举只有一个对象, 则可以作为一种单例模式的实现方式。
3.1.1 一些例子

星期:Monday(星期一)、…、Sunday(星期天)
性别:Man(男)、Woman(女)
季节:Spring(春节)…Winter(冬天)

3.2 jdk1.5之前的定义方式
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 子句可以直接使用枚举值的名字, 无需添加枚举类作为限定。
3.3.2 代码
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
-----------------------------
SPRING
3.5 枚举类实现接口 3.5.1 细节
    和普通 Java 类一样,枚举类可以实现一个或多个接口;若每个枚举值在调用实现的接口方法呈现相同的行为方式,则只要统一实现该方法即可;若需要每个枚举值在调用实现的接口方法呈现出不同的行为方式, 则可以让每个枚举值分别来实现该方法;
3.5.2 统一实现方法
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("冬");
        }
    };

}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/732021.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号