JDK1.8新特性总结
背景:
因为面试被问到了,而且一直以来想去深入了解一下JDK 1.8的新特性 。才发现其实好多已经用在了项目中,自己没能察觉,所以总结一下,方便后期使用,以及加深理解。
主要有几点:
一. JCF 集合中 :
+红黑树 (详细见 hashmap源码分析)-----------更快速
在jdk1.8中对hashMap等map集合的数据结构优化。
原来的hashMap采用的数据结构是哈希表(数组+链表),hashMap默认大小是16,一个0-15索引的数组,如何往里面存储元素,首先调用元素的hashcode方法,计算出哈希码值,经过哈希算法算成数组的索引值,如果对应的索引处没有元素,直接存放,如果有对象在,那么比较它们的equals方法比较内容
如果内容一样,后一个value会将前一个value的值覆盖,如果不一样,在1.7的时候,后加的放在前面,形成一个链表,形成了碰撞,在某些情况下如果链表 无限下去,那么效率极低,碰撞是避免不了的
加载因子:0.75,数组扩容,达到总容量的75%,就进行扩容,但是无法避免碰撞的情况发生
在1.8之后,在数组+链表+红黑树来实现hashmap,当碰撞的元素个数大于8时 & 总容量大于64,会有红黑树的引入
除了添加之后,效率都比链表高,1.8之后链表新进元素加到末尾
ConcurrentHashMap (锁分段机制),concurrentLevel,jdk1.8采用CAS算法(无锁算法,不再使用锁分段),数组+链表中也引入了红黑树的使用
+Lambda表达式 -----------------代码的简洁性
为引入Lambda表达式,Java8新增了java.util.funcion
包,里面包含常用的函数接口,这是Lambda表达式的基础,Java集合框架也新增部分接口,以便与Lambda表达式对接。lambda表达式本质上是一段匿名内部类,也可以是一段可以传递的代码
首先回顾一下Java集合框架的接口继承结构:
下表详细列举了这些方法。
接口名 | Java8新加入的方法 |
---|---|
Collection | removeIf() spliterator() stream() parallelStream() forEach() |
List | replaceAll() sort() |
Map | getOrDefault() forEach() replaceAll() putIfAbsent() remove() replace() computeIfAbsent() computeIfPresent() compute() merge() |
这些新加入的方法大部分要用到java.util.function
包下的接口
Collection中的新方法:
JDK1.8 集合新特性
举例:
Java 7 中 ArrayList底层源码解析
原 增强的for循环
需求:假设有一个字符串列表,需要打印出其中所有长度大于3的字符串.
ArrayList<String> list = new ArrayList<>(Arrays.asList("I", "love", "you", "too"));
for(String str : list){if(str.length()>3)System.out.println(str);
新 forEach() +匿名内部类
// 使用forEach()结合匿名内部类迭代
ArrayList<String> list = new ArrayList<>(Arrays.asList("I", "love", "you", "too"));
list.forEach(new Consumer<String>(){@Overridepublic void accept(String str){if(str.length()>3)System.out.println(str);}
});
+Lambda表达式
// 使用forEach()结合Lambda表达式迭代
ArrayList<String> list = new ArrayList<>(Arrays.asList("I", "love", "you", "too"));
list.forEach( str -> {if(str.length()>3)System.out.println(str);});
给forEach()
方法传入一个Lambda表达式,我们不需要知道accept()
方法,也不需要知道Consumer
接口,类型推导帮我们做了一切。
Map中的新方法
相比Collection
,Map
中加入了更多的方法,我们以HashMap
为例来逐一探秘。了解Java7HashMap
实现原理,将有助于理解下文。
需求:假设有一个数字到对应英文单词的Map,请输出Map中的所有映射关系.
Java7以及之前经典的代码如下:
// Java7以及之前迭代Map
HashMap<Integer, String> map = new HashMap<>();
map.put(1, "one");
map.put(2, "two");
map.put(3, "three");
for(Map.Entry<Integer, String> entry : map.entrySet()){System.out.println(entry.getKey() + "=" + entry.getValue());
}
之后:
HashMap<Integer, String> map = new HashMap<>();
map.put(1, "one");
map.put(2, "two");
map.put(3, "three");
map.forEach((k, v) -> System.out.println(k + "=" + v));
}
更多方法细节请参照 JDK1.8 集合新特性
lambda表达式规范及Java8中的四大核心函数式接口 请看lambda表达式
总结
- Java8为容器新增一些有用的方法,这些方法有些是为完善原有功能,有些是为引入函数式编程,学习和使用这些方法有助于我们写出更加简洁有效的代码.
- 函数接口虽然很多,但绝大多数时候我们根本不需要知道它们的名字,书写Lambda表达式时类型推断帮我们做了一切
二.接口
接口中可以定义默认实现方法和静态方法
在接口中可以使用default和static关键字来修饰接口中定义的普通方法
public interface Interface {default String getName(){return "zhangsan";}static String getName2(){return "zhangsan";}
}
在JDK1.8中很多接口会新增方法。
为了保证1.8向下兼容,1.7版本中的接口实现类不用每个都重新实现新添加的接口方法,引入了default默认实现。
static的用法是直接用接口名去调方法即可。
当一个类继承父类又实现接口时,若后两者方法名相同,则优先继承父类中的同名方法,即“类优先”,如果实现两个同名方法的接口,则要求实现类必须手动声明默认实现哪个接口中的方法。
三.并行流和串行流
在jdk1.8新的stream包中针对集合的操作也提供了并行操作流和串行操作流。并行流就是把内容切割成多个数据块,并且使用多个线程分别处理每个数据块的内容。Stream api中声明可以通过parallel()与sequential()方法在并行流和串行流之间进行切换。
jdk1.8并行流使用的是fork/join框架进行并行操作
ForkJoin框架
Fork/Join 框架:就是在必要的情况下,将一个大任务,进行拆分(fork)成若干个小任务(拆到不可再拆时),再将一个个的小任务运算的结果进行 join 汇总。
关键字:递归分合、分而治之。
采用 “工作窃取”模式(work-stealing):
当执行新的任务时它可以将其拆分分成更小的任务执行,并将小任务加到线 程队列中,然后再从一个随机线程的队列中偷一个并把它放在自己的队列中 。
相对于一般的线程池实现,fork/join框架的优势体现在对其中包含的任务的 处理方式上.在一般的线程池中,如果一个线程正在执行的任务由于某些原因 无法继续运行,那么该线程会处于等待状态.而在fork/join框架实现中,如果
某个子问题由于等待另外一个子问题的完成而无法继续运行.那么处理该子 问题的线程会主动寻找其他尚未运行的子问题来执行.这种方式减少了线程 的等待时间,提高了性能.。
JDK1.8新特性总结相关推荐
- JDK1.8 新特性(全)
JDK1.8 新特性 本文主要介绍了JDK1.8版本中的一些新特性,乃作者视频观后笔记,仅供参考. jdk1.8新特性知识点: Lambda表达式 函数式接口 方法引用和构造器调用 Stream AP ...
- jdk1.8新特性的应用-Stream 的终止操作
jdk1.8新特性的应用-Stream 的终止操作 public class TestStreamApi4 {List<Employee> emps = Arrays.asList(new ...
- jdk1.8新特性_Lambda表达式的引入
jdk1.8新特性_Lambda表达式的引入 引入 需求: 获取工资大于20000的员工信息 public class Employee {private String name;private in ...
- jdk1.5新特性5之枚举之模拟枚举类型
一 简单应用 package cn.xy.Enum; public enum TrafficLamp { RED,GREEN,YELLOW; } TrafficLamp red = TrafficL ...
- java 1.7 可变参数,JDK1.7新特性(2):异常和可变长参数处理
异常 jdk1.7对try--catch--finally的异常处理模式进行了增强,下面我们依次来看增强的方面. 1. 为了防止异常覆盖,给Throwable类增加了addSuppressed方法,可 ...
- JAVA day20、21 双列集合Map<K,V>:HashMap,LinkedHashMap,TreeMap,Hashtable, ConcurrentHashMap;JDK1.9新特性
一.Map<K,V> Java提供了专⻔的集合类⽤来存放这种这种⼀⼀对应的关系,叫做映射对象,即 java.util.Map 接⼝. 类型参数: K - 此映射所维护的键的类型 V - 映 ...
- JDK1.6“新“特性Instrumentation之JavaAgent
JDK1.6"新"特性Instrumentation之JavaAgent 文章目录 JDK1.6"新"特性Instrumentation之JavaAgent 简 ...
- 黑马程序员————高新技术————JDK1.5新特性
----------------------ASP.Net+Android+IOS开发----------------------期待与您交流! JDK1.5新特性 一:静态导入 l Import语 ...
- JDK-1.5_新特性
1.泛型(Generics) 泛型是JDK1.5中一个最"酷"的特征.通过引入泛型,我们将获得编译时类型的安全和运行时更小地抛出ClassCastExceptions的可能.在JD ...
- java基础知识总结:基础知识、面向对象、集合框架、多线程、jdk1.5新特性、IO流、网络编程
目录 一.基础知识: 二.面向对象 三.集合框架 四.多线程: 五.jdk1.5的新特性 六.IO流 七.网络编程: 一.基础知识: 1.JVM.JRE和JDK的区别: JVM(Java Virtua ...
最新文章
- Mysql数据库文件路径重置
- android7.0如何加载本地图片,Android 6.0和7.0 加载同一张图片,结果不同
- C语言socket accept()函数(提取出所监听套接字的等待连接队列中第一个连接请求,创建一个新的套接字,并返回指向该套接字的文件描述符)
- c语言 游戏程序,C语言做的推箱子游戏源程序
- JavaScript浮点运算0.2+0.1 !== 0.3
- 《团队激励与沟通》第 5 讲——沟通的技巧 重点部分总结
- 所有科研人都应该收藏的论文下载网站,不是sci-hub!
- 漫谈边缘计算(三):5G的好拍档
- Mysql触发器与事务
- GAN里面的Kullback-Leibler Divergence和Jensen–Shannon Divergence
- 机械振动的傅里叶变化分析技术
- 关于微信小程序的开发
- Java和Python哪个比较有前途,好就业?(初学者必读)
- open_source_team
- 寒假“搜索”练习题解
- 全自动叠片式过滤器结构、原理说明
- 【深度学习实战03】——YOLO tensorflow运行及源码解析
- JDK、JER、JVM是什么
- pythonifelse简化_简化“if…elif..else”条件
- Verilog HDL学习笔记