欢迎您访问365答案网,请分享给你的朋友!
生活常识 学习资料

java学习笔记4-

时间:2023-07-07
目录

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);

SPRINGSUMMERAUTUMNWINTER-----------------------------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("冬"); } };}

Copyright © 2016-2020 www.365daan.com All Rights Reserved. 365答案网 版权所有 备案号:

部分内容来自互联网,版权归原作者所有,如有冒犯请联系我们,我们将在三个工作时内妥善处理。