day04—常用API

一、Arrays类

1 Arrays基本使用-回顾

Arrays是操作数组的工具类,它可以很方便的对数组中的元素进行遍历、拷贝、排序等操作。

2 Arrays操作对象数组

使用Arrays操作数组时,数组中存储存储的元素是int类型、double类型,是可以直接排序的,而且默认是升序排列。
如果数组中存储的元素类型是自定义的对象,如何排序:

public class Student {
    private String name;
    private double height;
    private int age;
	
    public Student(String name, double height, int age) {
        this.name = name;
        this.height = height;
        this.age = age;
    }

	@Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", height=" + height +
                ", age=" + age +
                '}';
    }
}

然后再写一个测试类,往数组中存储4个学生对象,代码如下。

public class ArraysTest2 {
    public static void main(String[] args) {
         // 目标:掌握如何对数组中的对象进行排序。
        Student[] students = new Student[4];
        students[0] = new Student("蜘蛛精", 169.5, 23);
        students[1] = new Student("紫霞", 163.8, 26);
        students[2] = new Student("紫霞", 163.8, 26);
        students[3] = new Student("至尊宝", 167.5, 24);

        // 1、public static void sort(类型[] arr):对数组进行排序。
        Arrays.sort(students);
        System.out.println(Arrays.toString(students));
        // 第一次使用报错了 why? Student类型不具备 比较的特性。
        // 为什么之前的不报错呢? 因为之前的类型 都具备比较特性,比如Integer String Double
        // 1:Student想要能够进行比较,需要实现比较特性接口   Comparable
    }
}
  • **排序方式1:**让Student类实现Comparable接口,同时重写compareTo方法。Arrays的sort方法底层会根据compareTo方法的返回值是正数、负数、还是0来确定谁大、谁小、谁相等。代码如下:
/*
  实现接口之后 会报错 原因 是还得重写 比较的规则
 */
public class Student implements Comparable<Student>{
    private String name;
    private double height;
    private int age;

    public Student(String name, double height, int age) {
        this.name = name;
        this.height = height;
        this.age = age;

    }

    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", height=" + height +
                ", age=" + age +
                '}';
    }
   /*
       实现具备 比较特性的接口 Comparable
         有 一个compareTo 需要重写
    */
    @Override
    public int compareTo(Student o) {

        // 当前对象 this 是前
        // 传递的对象 o 是后
        return this.age-o.age;//前-后 升序  后-前 降序
    }
}
  • **排序方式2:**在调用Arrays.sort(数组,Comparator比较器);时,除了传递数组之外,传递一个Comparator比较器对象。Arrays的sort方法底层会根据Comparator比较器对象的compare方法方法的返回值是正数、负数、还是0来确定谁大、谁小、谁相等。代码如下
public class ArraysTest2 {
  // 1、public static void sort(类型[] arr):对数组进行排序。
//        Arrays.sort(students);
         // 临时抱佛脚 临时进行排序  你在 进行排序的时候 按照 自定义排序规则来完成
        // 临时排序 不会在意 之前的类型 具不具备 排序的特性 都能在此进行临时的排序
        // 2、public static void sort(类型[] arr,new Comparator<排序类型>):对数组进行排序。

        Arrays.sort(students, new Comparator<Student>() {
            // 完成临时的排序规则
            @Override
            public int compare(Student o1, Student o2) {

                // Student类型必须有setget方法
                //  前-后  升序  后-前 降序
//                return o2.getAge()-o1.getAge();//按照年龄降序
                // 按照身高升序
                     //  double类型比较 比较之后 返回 整数形式  默认小数
                     //  Double包装类 compare
//                return Double.compare(o1.getHeight(),o2.getHeight());// 前-后
                return Double.compare(o2.getHeight(),o1.getHeight());// 后 前
            }
        });

        System.out.println(Arrays.toString(students));
}

二、Lambda表达式

作用:用于简化匿名内部类代码的书写。

1 Lambda表达式基本使用

(被重写方法的形参列表) -> {
    被重写方法的方法体代码;
}

在使用Lambda表达式之前,必须先有一个接口,而且接口中只能有一个抽象方法。(注意:不能是抽象类,只能是接口)。接口可以写注解 @FunctionalInterface
这样的接口,我们称之为函数式接口,只有基于函数式接口的匿名内部类才能被Lambda表达式简化。

// 定义一个 接口 会游泳的
public interface Swimming {

    // 游泳功能
    void swim();
}

把刚才使用Arrays方法时的代码,使用Lambda表达式简化一下。

public class LambdaTest2 {

    public static void main(String[] args) {
        // 1:定义一个Person数组  创建四个Person对象放到数组中
        //  创建对象数组  类型[] 数组名 = new 类型[4];
        Person[] persons = new Person[4];
        persons[0] = new Person("恐龙抗狼", 28);
        persons[1] = new Person("补录biu", 18);
        persons[2] = new Person("我没k", 8);
        persons[3] = new Person("晋城话", 48);

        // 2: 根据 Person的年龄进行 排序(正序)
        // 问  Arrays.sort() 一个参数 还是两个参数的?
        //  Arrays.sort(数组)  数组的类型必须实现可排序接口
        //  Arrays.sort(数组,新的排序规则)
        Arrays.sort(persons, new Comparator<Person>() {
            @Override
            public int compare(Person o1, Person o2) {
                return o1.getAge() - o2.getAge();//前-后 是升序 正序
//             
                // 使用默认顺序 升序       后面的比较前面的代表降序
                // 小数   Double.compare()

            }
        });
        System.out.println(Arrays.toString(persons));

        // 将上面的 排序操作使用 Lambda来简化
        Arrays.sort(persons,
                (Person o1, Person o2) -> {
                    return o1.getAge() - o2.getAge();
                });
    }
}

2 Lambda表达式省略规则

1.Lambda的标准格式
	(参数类型1 参数名1, 参数类型2 参数名2)->{
		...方法体的代码...
		return 返回值;
	}

2.在标准格式的基础上()中的参数类型可以直接省略
	(参数名1, 参数名2)->{
		...方法体的代码...
		return 返回值;
	}
	
3.如果{}总的语句只有一条语句,则{}可以省略、return关键字、以及最后的“;”都可以省略
	(参数名1, 参数名2)-> 结果
	
4.如果()里面只有一个参数,则()可以省略
	(参数名)->结果

三、Object类- 深克隆浅克隆

  • clone() 方法

我们已经学习过Object的常见方法,接下来,做一个扩展.我们学习Object类的clone()方法,克隆。意思就是某一个对象调用这个方法,这个方法会复制一个一模一样的新对象,并返回。

public Object clone()
    克隆当前对象,返回一个新对象
如何 完成对象的克隆呢?
      1:javabean对象类 要实现接口Cloneable。
      2:javabean中重写clone方法。快捷键
        因为clone功能不是java所设置的,所以还需要做一个重写,才能完成调用。
      3:调用有异常就抛出..alt+enter 回车就行。
      4:调用方法实现克隆。

想要调用clone()方法,必须让被克隆的类实现Cloneable接口。

浅克隆的意思:拷贝出来的对象封装的数据与原对象封装的数据一模一样(引用类型拷贝的是地址值)

day04-API(内部类、API高级、lambda)(笔记)_笔记


day04-API(内部类、API高级、lambda)(笔记)_ide_02


深度克隆案例:

public class User implements Cloneable{
    private String id; //编号
    private String username; //用户名
    private String password; //密码
    private double[] scores; //分数

    public User() {
    }

    public User(String id, String username, String password, double[] scores) {
        this.id = id;
        this.username = username;
        this.password = password;
        this.scores = scores;
    }

    //...get和set...方法自己加上

	@Override
    protected Object clone() throws CloneNotSupportedException {
        //先克隆得到一个新对象
        User u = (User) super.clone();
        //再将新对象中的引用类型数据,再次克隆
        u.scores = u.scores.clone();
        return u;
    }
}

五、Date类

接下来,我们学习一下Date类,Java中是由这个类的对象用来表示日期或者时间。

Date对象记录的时间是用毫秒值来表示的。Java语言规定,1970年1月1日0时0分0秒认为是时间的起点,此时记作0,那么1000(1秒=1000毫秒)就表示1970年1月1日0时0分1秒,依次内推。

常见成员方法:

day04-API(内部类、API高级、lambda)(笔记)_ide_03

六、SimpleDateFormat类

使用SimpleDateFormat类就可以转换Date对象表示日期时间的显示格式。

  • Date对象转换为指定格式的日期字符串:日期格式化,
  • 指定格式的日期符串转换为Date对象:日期解析。
    常用成员方法

    SimpleDateFormat日期时间格式字符
字母	   表示含义
yyyy	年
MM		月
dd		日
HH		时
mm		分
ss		秒
SSS		毫秒

"2022年12月12日" 的格式是 "yyyy年MM月dd日"
"2022-12-12 12:12:12" 的格式是 "yyyy-MM-dd HH:mm:ss"

七、Calendar类

Calendar类表示日历,它提供了一些比Date类更好用的方法。

常用成员方法

day04-API(内部类、API高级、lambda)(笔记)_数组_04