一、对HashMap和ConcurrentHashMap变化
JDK1.7:HashMap底层机构是哈希表,数组+链表
JDK1.8:HashMap底层机构是哈希表,数组+链表+红黑树
JDK1.7:ConcurrentHashMap采用锁分段机制,并发的级别默认是16,一共分为了16个段,每个段里面有16个段,然后里面由数组+链表+红黑树组成
JDK1.8:ConcurrentHashMap底层机构是锁分段机制取消,改为cas算法又叫无锁算法
二、jvm变化
去掉永久区,新增元空间,元空间用的是物理内存,这样可以提升性能,调用垃圾回收机制条件是元空间内存慢了
三、Lambda表达式
Lambda是一个匿名函数,还可以理解为一段可以传递的代码。
1、Lambda表达式基础语法:
Java8引入了一个新的操作符“->”,该操作符车叫做箭头操作符或者Lambda操作符
箭头操作符把Lambda表达式拆分成两部分:
左侧:Lambda表达式的参数列表
右侧:Lambda表达式所需执行的功能 即Lambda体
语法格式一:无参、无返回值 ()-> System.out.println(“Hello Lambda”);
语法格式二:一个参数、无返回值 (x) -> System.out.println(x);
语法格式三:只有一个参数,参数列表中的小括号可以省略,一般不会省略去写,写上手又不会掉
语法格式四:两个以上参数、有返回值,并且Lambda体中有多条语句 ,在Lambda体中要用{},return返回
语法格式五:若Lambda体中只有一条语句,return和大括号都可以省略不写 Comparator con = (x,y) -> Integer.compare(x, y);
语法格式六:Lambda表达式参数列表中的数据类型可以不写,因为JVM编译器可以根据上下问推断出数据类型,也叫“类型推断”,要写就全部写要不写就全部不写, Comparator con = (Integer x,Integer y) -> Integer.compare(x, y);
2、 函数式接口
Lambda表达式需要“函数式接口”的支持
函数式接口:接口中只有一个抽象方法的接口,称为函数式接口。可以使用@FunctionalInterface修饰,来检查是不是函数式接口
内置的四大核心函数式接口
-
Consumer : 消费型接口 void accept(T t);
-
Supplier : 供给型接口 T get();
-
Function<T,R> : 函数型接口 R apply(T t);
-
Predicate : 断言型接口 Boolean test(T t);
3、 方法应用
- 方法引用:若Lambda 体中的内容有方法已经实现了,我们可以使用方法引用
(可以理解为方法引用是Lambda 表达式的另外一种变现形式)
主要有三种语法格式:
对象::实例方法名
类::静态方法名
类::实例方法名
注意:
1.Lambda 体中调用方法的参数列表和返回值类型,要与函数式接口中抽象方法的函数类型和返回值类型保持一致
2.Lambda 参数列表中第一个参数是实例方法的调用者,第二个参数是实例方法参数时可以使用 类::实例方法名
- 构造器引用
ClassName::new
注意:需要调用构造器的参数列表和返回值类型,要与函数式接口中抽象方法的函数类型和返回值类型保持一致
- 数组引用
四、 Stream
流是数据渠道,用于操作数据源(集合、数组)所生成的元素序列
集合讲的是数据,流讲的是计算
注意
1.Stream不会存储元素
2.Stream不会改变源对象,返回结果是一个新的Stream
3.操作是延迟执行的,也就是说他们会等到需要结果的时候执行
Stream的操作三个步骤
- 创建Stream: 一个数据源获得一个流
- 中间操作:对数据源数据处理
- 终止操作:执行中间操作产生结果
下面对这三部操作详细介绍说明:
- 创建Stream: 一个数据源获得一个流
1)通过Collection 系列集合获取stream()或者 parallelStream()
2)通过Arrays 中的静态方法 stream()获取数组流
3)通过Stream 类中的静态方法of()获取流
4)创建无限流(迭代和生成)
- 中间操作:对数据源数据处理
1)筛选和切片
filter–接收Lambda,从流中排除某些元素
limit–截断流,使其元素不超过给定的量
skip(n) – 跳过元素,返回一个扔掉了前n个元素的流,若流中元素不足n个,则返回一个空流,和limit互补
distinct–筛选,通过流所生成的hashCode()和equals()去除重复元素
2)映射
map接收一个函数作为参数,该函数会被应用到每个元素上,并将其映射成一个新的元素
flatMap–接收一个函数作为参数,将流中的每个值转换成另外一个流,然后把所有的流连接成一个流
3)排序
sorted()–自然排序(Comparable)
sorted(Comparator com) – 定制排序(Comparator)
- 终止操作:执行中间操作产生结果
1)查找与匹配
allMatch–检查是否匹配所有元素
anyMatch–检查是否至少匹配一个元素
noneMatch–检查是否没有匹配所有元素
findFirst–返回第一个元素
count–返回流中元素的总个数
max–返回流中最大值
min–返回流中最小值
2)规约 --可以将流中元素反复结合起来,得到一个值
3)收集
collect–将流转换为其他形式。接收一个Collector接口实现,用于给Stream中元素做汇总的方法
3)总数、 平均值、总和、最大值、最小值
4)分组
5)多级分组
6)分区
6)拼接字符串
五、Optional 容器
Optional 容器类常用方法
Optional.of(T t):创建一个Optional实例
Optional.empty():创建一个空的Optional实例
Optional.ofNullable(T t):若t不为null,创建Optional实例 否则创建空实例
isPresent():判断是否包含值
orElse(T t):如果调用对象包含值,返回该值,否则返回t
orElseGet(Supplier s):如果调用对象包含值,返回该值,否则返回s获取的值
map(Function f):如果有值对其处理,返回处理后的Optional,否则返回Optional.empty()
flatMap(Function mapper):与map类似,要求返回必须是Optional
上一个案例跑跑看
六、默认方法和静态方法
当继承的类和实现的接口的方法是一样的,优先运行类中的方法,在接口中的默认方法会被忽略
七、日期
1)LocalDate、LocalTime、LocalDateTime方法演示
2)Instant:时间戳(1970年01月01日00时00分00秒起至现在的总毫秒数)
3)Duration:计算两个时间之间的间隔
4)Period:计算两个日期之间的间隔
5)时间校正器:TemporalAdjuster
6)格式化时间/日期 DateTimeFormatter
7)ZonedDate ZonedTime ZonedDateTime
========================== END ==============================