一、比较器
1、比较器的作用: 可以通过自定义指定比较 规则,比较引用数据类型的数据
2、使用方法:
Arrays.sort() 对 数组中的多个数据进行升序排序
当对自定义引用数据类型数组排序的时候,通过两种方式实现:
要求数据需要实现: 内部比较器|外部比较器
1.Comparable 内部比较器|自然排序|默认排序规则
2.使用类去实现Comparable接口,重写内部的compareTo方法,方法中自定义比较规则
缺点:与类的耦合度太高,不便于后期维护
推荐使用自定义比较器|自定义排序
实现Comparator接口,重写compare方法,方法内部自定义比较规则
二、java8新特性
-
为什么要学Java8
1.1. 简介
优点:速度更快(底层的数据结构做了一些更新和改动,垃圾回收机制内存结构做了一些改动)
代码更少(增加了新的语法Lambda表达式)
强大的StreamAPI
便于并行
最大化减少空指针异常(Optional容器类)
1.2. 主要内容
1、Lambda表达式
2、函数式接口
3、方法引用与构造器引用 -
Lambda表达式
2.1. 什么是Lambda表达式?
Lambda表达式是一个匿名函数,我们可以把Lambda表达式理解为是一段可以传递的代码(将代码像数据一样进行传递)。可以写出更简洁、更灵活的代码。作为一种更紧凑的代码风格,使得Java语言表达能力得到了提升。
Java8中引入了一个新的操作符” -> ”该操作符称为箭头操作符或Lambda操作符,箭头操作符将Lambda表达式拆分为两部分:
左侧:Lambda表达式的参数列表。对应接口中抽象方法的参数列表。
右侧:Lambda表达式中所需要执行的功能,即Lambda体。对应接口中抽象方法的实现。
2.2. Lambda表达式的基础语法
2.2.1. 无参数,无返回值
要求存在一个接口,接口中存在一个方法,方法无参无返回值即可。
栗子
2.2.2. 有一个参数,无返回值
要求存在一个接口,接口中存在一个方法,方法带一个参数无返回值即可。
一个参数时小括号可以省略
2.2.3. 有参数有返回值
要求存在一个接口,接口中存在一个方法,方法带参数带返回值即可。
若Lambda体中只有一条语句,return和大括号都可以省略不写
2.3. 说明
Lambda表达式的参数列表的数据类型可以省略不写,因为JVM编译器通过上下文推断出数据类型,即“类型推断”。
三、 函数式接口
3.1. 什么是函数式接口?
接口中只有一个抽象方法的接口,称为函数式接口。default修饰方法只能在接口中使用(只能被实现了这个接口的对象调用),在接口种被default标记的方法为普通方法,可以直接写方法体。
可以使用注解@FunctionalInterface修饰,可以检查是否是函数式接口。
Lambda表达式需要函数式接口的支持
3.2. 使用函数式接口
@FunctionalInterface
public interface MyFunction<T> {
public T getValue(T o);
}
// 需求:对一个数进行运算
@Test
public void test7() {
Integer result = operation(100, (x) -> x * x);
System.out.println(result);
result = operation(200, (y) -> y - 100);
System.out.println(result);
}
public Integer operation(Integer num, MyFunction<Integer> mf) {
return mf.getValue(num);
}
3.3. 四大内置核心函数式接口
消费型、供给型、函数型、断定型
消费型接口 Comsumer
void accept(T t)
供给型接口 Supplier
T get()
函数型接口 Function<T,R>
R apply(T t)
断定型接口 Predicate
boolean test(T t)
消费性:只进不出
供给型:白手起家,空手套白狼
函数型:礼尚往来
断定行:鉴定评审
四、常用类
- 字符串相关类
1)String
不可变的字符序列
2)StringBuffer
可变字符序列,并且线程安全,但是效率低
3)StringBuilder
可变字符序列,线程 不安全,但是效率高 (一般用他!)
1.1. String
由于使用特别多,所以有特殊快捷的创建方式通过双引号 “” 直接创建对象
1.1.1. 构造方法
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-g10pSJ5f-1585613297232)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\1585566575309.png)]
1.1.2. 常用方法
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5CBP8RYO-1585613297236)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\1585566653521.png)]
还有 valueOf()系列,可以将基本类型的数据转为字符串,当然一般不用这么麻烦
字符串分割 split()
1.2. StringBuffer和StringBuilder
这两个类使用方式类似。一般用于做字符串拼接,删除,替换,反转,截取,插入等。
通过查看源码,认识StringBuffer和StringBuilder的构造方式,以及与String的转换方式
- 包装类
JAVA并不是纯面向对象的语言。Java语言是一个面向对象的语言,但是Java中的基本数据类型却是
不面向对象的。但是我们在实际使用中经常需要将基本数据转化成对象,便于操作。比如:集合的操作
中。例如使用Map对象要操作put()方法时,需要传入的参数是对象而不是基本数据类型。为了解决这个
不足,在设计类时为每个基本数据类型设计了一个对应的类进行代表,这样八个和基本数据类型对应的
类统称为包装类(Wrapper Class)。包装类均位于java.lang包
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BiaZcgQx-1585613297239)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\1585566773051.png)]
在这八个类名中,除了Integer和Character类以后,其它六个类的类名和基本数据类型一直,只是类名
的第一个字母大写即可。
对于包装类说,这些类的用途主要包含两种:
a、作为和基本数据类型对应的类类型存在,方便涉及到对象的操作。
b、包含每种基本数据类型的相关属性如最大值、最小值等,以及相关的操作方法(这些操作方法的作
用是在基本类型数据、包装类对象、字符串之间提供转化!)。
这些类的用途主要包含两种:
a、作为和基本数据类型对应的类类型存在,方便涉及到对象的操作。
b、包含每种基本数据类型的相关属性如最大值、最小值等,以及相关的操作方法(这些操作方法的作
用是在基本类型数据、包装类对象、字符串之间提供转化!)。
包装类和基本类型之间存在自动装箱和自动拆箱操作,所以可以互相方便地切换。