JDK1.8 新特性

简介: JDK1.8 新特性

文章目录


      JDK1.8新特性


           1、HashMap

           2、ConcurrentHashMap

           3、Lambda表达式

           4、并行流

           5、Optional类


JDK1.8新特性


有关JDK1.8的新特性,自己做了以下总结。


       速度更快 – 红黑树


       代码更少 – Lambda


       强大的Stream API – Stream


       便于并行 – Parallel


       最大化减少空指针异常 – Optional


1、HashMap


有人会在问你HashMap的时候会问你JDK1.7和1.8有什么变化;


主要还是HashMap中链长度大于8时采取红黑树的结构存储。(1.7的时候是链表结构)

红黑树,除了添加,效率高于链表结构在jdk1.8中对hashMap等map集合的数据结构优化。hashMap数据结构的优化原来的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算法(无锁算法,不再使用锁分段),数组+链表中也引入了红黑树的使用


2、ConcurrentHashMap



Jdk1.7时隔壁级别CocnurrentLevel(锁分段机制)默认为16。


JDK1.8采取了CAS算法


CAS原理主要涉及的有:锁机制、CAS 操作;


Jdk1.8没有永久区,取而代之的是MetaSpace元空间,用的是物理内存。

(当你跟面试官聊到JVM的时候可以聊到1.8后用就去是被取代了,这会是一个加分项)


3、Lambda表达式


1、Lambda表达式的基础语法:Java8引入了一个新的操作符“->”,该操作符成为箭头操作符或者Lambda操作符,箭头操作符将Lambda表达式拆分成两部分


左侧:Lambda表达式的参数列表


右侧:Lambda表达式中所需执行的功能,即Lambda体。


语法格式一:无参数,无返回值

Runnable r2 = () -> System.out.println("hello lambda");
        r2.run();
1
2


语法格式二:有一个参数,并且无返回值

(x) -> System.out.print(x);


语法格式三:若只有一个参数,小括号可以省略不写

x -> System.out.print(x);


语法格式四:有两个以上的参数,有返回值,并且Lambda体中有多条语句

Comparator<Integer> c1 = (x, y) -> {
            System.out.print(Integer.compare(x, y)+"函数式接口");
            return Integer.compare(x, y);
        }  ;
        c1.compare(1, 2);
1
2
3
4
5


语法格式五:若Lambda体中只有一条语句,return和大括号都可以省略不写

Comparator c1 = (x,y) -> Integer.compare(x,y); 
1


语法格式六:Lambda表达式的参数列表的数据类型可以省略不写,因为JVM编译器可以通过上下文进行类型推断出数据类型,既“类型推断”。

(Integer x,Integer y) -> Integre.compare(x,y);


口诀: 左右遇一括号省,左侧推断类型省, 能省则省。


注:当一个接口中存在多个抽象方法时,如果使用lambda表达式,并不能智能匹配对应的抽象方法,因此引入了函数式接口的概念


4、并行流


Fork/Join框架:


在必要的情况下,将一个大任务进行必要的拆分Fork成若干个小任务,再将小任务的运算结果进行Join汇总。


Fork/Join框架和传统线程池的区别:


采用“工作窃取”模式(Working-stealing),即当执行新的任务时它可以将其拆分分成更小的任务执行,并将小任务加到线程队列中,然后再从一个随机线程的队列中偷一个并把它放在自己的队列中。


相对于一般的线程池实现,fork/join框架的优势体现在对其中包含的任务的处理方式上,如果一个线程正在执行的任务由于某些原因无法继续运行,那么该线程会处于等待状态,而在fork/join框架实现中,如果某个子问题由于等待另外一个子问题的完成而无法继续运行,那么处理该子问题的线程会主动寻找其他尚未运行的子问题来执行,这种方式减少了线程等待的时间,提高了性能。


并行流就是把一个内容分成多个数据块,并用不同的线程分别处理每个数据块的流。

Java 8 中将并行进行了优化,我们可以很容易的对数据进行并行操作。Stream API 可以声明性地通过parallel() 与sequential() 在并行流与顺序流之间进行切换。


自己实现的ForkJoin

/**
 * JDK8的并行流实现。
 */
@Test
public void test3(){
    Instant start = Instant.now();
    long sum = LongStream.rangeClosed(0, 1000000000L)
            .parallel()//并行流
            //.sequential()//串行流
            .reduce(0, Long::sum);
    Instant end = Instant.now();
    System.out.println(Duration.between(start,end).toMillis());
}
//并行流将会充分使用多核的优势,多线程并行执行,基数越大,效果越明显。其底层还是Fork/Join框架。只不过SUN公司优化的更好,比自己实现更高效


5、Optional类


Optional 类(java.util.Optional) 是一个容器类,代表一个值存在或不存在,原来用null 表示一个值不存在,现在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


目录
相关文章
|
2月前
|
容器
jdk8新特性-详情查看文档
jdk8新特性-详情查看文档
72 7
|
5月前
|
容器
jdk8新特性-详情查看文档
jdk8新特性-详情查看文档
62 3
|
4月前
|
存储 安全 Java
JDK1.8 新的特性
JDK1.8 新的特性
46 0
|
5月前
|
编解码 安全 Java
jdk8新特性-接口和日期处理
jdk8新特性-接口和日期处理
|
6月前
|
Java API
JDK8到JDK25版本升级的新特性问题之使用Collectors.teeing()来计算一个列表中学生的平均分和总分如何操作
JDK8到JDK25版本升级的新特性问题之使用Collectors.teeing()来计算一个列表中学生的平均分和总分如何操作
|
6月前
|
Java API Apache
JDK8到JDK24版本升级的新特性问题之在Java中,HttpURLConnection有什么局限性,如何解决
JDK8到JDK24版本升级的新特性问题之在Java中,HttpURLConnection有什么局限性,如何解决
|
6月前
|
Oracle Java 关系型数据库
JDK8到JDK29版本升级的新特性问题之未来JDK的升级是否会成为必然趋势,如何理解
JDK8到JDK29版本升级的新特性问题之未来JDK的升级是否会成为必然趋势,如何理解
|
6月前
|
Oracle 安全 Java
JDK8到JDK28版本升级的新特性问题之在Java 15及以后的版本中,密封类和密封接口是怎么工作的
JDK8到JDK28版本升级的新特性问题之在Java 15及以后的版本中,密封类和密封接口是怎么工作的
|
6月前
|
Java API 开发者
JDK8到JDK17版本升级的新特性问题之SpringBoot选择JDK17作为最小支持的Java lts版本意味着什么
JDK8到JDK17版本升级的新特性问题之SpringBoot选择JDK17作为最小支持的Java lts版本意味着什么
210 0
JDK8到JDK17版本升级的新特性问题之SpringBoot选择JDK17作为最小支持的Java lts版本意味着什么
|
5月前
|
Java 编译器 API
JDK8新特性--lambda表达式
JDK8的Lambda表达式是Java语言的一大进步。它为Java程序提供了更多的编程方式,让代码更加简洁,也让函数式编程的概念在Java中得到了体现。Lambda表达式与Java 8的其他新特性,如Stream API、新的日期时间API一起,极大地提高了Java编程的效率和乐趣。随着时间的流逝,Java开发者对这些特性的理解和应用将会越来越深入,进一步推动Java语言和应用程序的发展。
36 0