为什么要学习java8新特性?
简单而言就是使一个程序员的代码更加简洁高效,这也是语言发展的必然性,当然我这样说太笼统了,所以我特意去网上找了一张图,相信这张图就很能说明问题了。
何来速度更快?
为什么说java8速度更快呢?因为它对底层的数据结构做了改动,对垃圾回收机制(内存结构)做了改变,对并行做了一个扩展和支持,当然还有一些小的改动就不一一例举了。
数据结构的改变
最典型的就是HashMap,说到它就不得不说一下哈希表了,相信作为程序员大部分应该都知道,HashMap底层其实就是一个链表,说白了就是类似于一个数组+链表的结构(当然它还多了其它东西,嘿嘿,想知道你就得去看看HashMap详解了),然后根据索引来放你想存放的东西,而这个索引是怎么产生的呢,就是通过哈希算法产生的,所以说这一下就提高了多少的运算效率呢,如果没有它,你要放一个新元素去这个数组中,它就需要和数组中已经存在的每一个元素进行一次比较,但有了哈希表后,你每次放一个新元素,只需要计算这个新元素的哈希值,然后通过哈希值找到这个数组的索引,然后往这索引的位置插入就可以了,这样是不是就只需要比较一次了呢。
当然废了这么多话,还没说到HashMap在java7和java8中的区别(坐下,放下你手中的40米大刀),那么,你想下,每次计算到相同的hash值,新的值会代替老的值,那么它是怎么插入的呢(懂得已经懂了,嘿嘿),它会产生碰撞,它会把老的值以链的形式缀在新值后面,形成一个链型结构,那么如果这个值很多呢,那么这个链就会很长,最后当你插入一个相同的哈希值的索引的时候,这个新值依然要和这个老的值形成的链表一一比对,那么效率就会降低很多了,(注意重点来了),所以java7就使用了一种扩容的办法来解决这个问题,HashMap会以0.75的加载因子来判断是否扩容,当这个链表的长度达到了HashMap长度的百分之75的时候,那么HashMap就会自动扩容,然后对这个链表的所有数据除了最新那个,进行一个哈希值的重新运算,这样做是解决了很大一部分问题,但是碰撞的情况依然存在,所以此时java8就出现了。
到了java8的时候,HashMap就有了一种新的结构,数组+链表+红黑树,简单来说就是当碰撞的数量大于8,hashmap总容量大于64的时候,那么它就会把这个链表结构转换为红黑树,红黑树就像一个二分法,一直把这个列表一分二,二分四,这样下次进来比对的时候就会比对整个链表比对快的多了(除了新增更慢,因为新增链表会直接放最后,而红黑树要二分),当然速度还是快了不少,所以HashMap在java8就做了这种改变,那么随之而来HashSet,ConcurrentHashMap也做了这样的改变。
内存结构的改变
1.8把jvm中的永久区给去除,取而代之的是元空间,里面直接用的就是物理内存,而不是你来分配内存了,这样垃圾回收机制就几乎不做回收了,虽然1.7里面方法区也一般不会被回收,但还是有一些被回收的情况,所以1.8直接优化了内存机制,(虽然其它大厂早已优化,比如taobao jvm,但是这次java的优化也是对这个提高效率的肯定),然后你会发现在jdk 1.8中,PremGenSize和MaxPremGenSize这两个参数已经没有用了,取而代之的是MetaSpaceSize和MaxMetaSpaceSize,默认是你得全部物理内存。
来源:CSDN
作者:小小攻城狮Jack
链接:https://blog.csdn.net/qq_40111437/article/details/104246301