首页 > 其他分享 >JDK1.8新特性(二):为什么要关注JDK1.8

JDK1.8新特性(二):为什么要关注JDK1.8

时间:2023-05-03 12:32:06浏览次数:35  
标签:为什么 JDK1.8 Java HashMap 代码 并行 特性 链表


JDK1.8新特性(二):为什么要关注JDK1.8_多核


前期回顾:

JDK1.8新特性(一):JDK1.8究竟有哪些新特性呢

自1996年JDK1.0(Java1.0)发布以来,Java已经受到了学生、程序员、整个软件行业人员等一大批活跃用户的欢迎。这一语言极富活力,不断被用在大大小小的项目里。从Java1.1(1997年) 一直到Java 7(2011年),Java通过增加新功能,不断得到良好的升级。Java 8则是在2014年3月发布的……

版本的不断更新、升级,无非是对bug的修复、新功能的增加、优化等,在JDK版本中,JDK1.8变得备受关注,也成了各大公司面试中常常被问及的话题。

代码更少、更简洁

之所以备受关注的最原因是,JDK1.8所做的改变,在许多方面比Java历史上任何一次改变都深远。而且好消息是,这些改变会让你编起程来更容易,用不着再写类似下面这种啰嗦的程序了。(对peopleList中人的年龄进行排序)

Collections.sort(peopleList, new Comparator<People>() {
    public int compare(People o1, People o2) {
        if (o1.getAge() > o2.getAge()) {
            return 1;
        } else {
            return -1;
        }
    }
});

而在JDK1.8里,你可以编写如下更为简洁的代码:

Collections.sort(peopleList, Comparator.comparingInt(People::getAge));

自从接触JDK1.8后,这样类似简洁的代码你将会非常喜欢的。

更好的利用多核处理器

JDK1.8对多核处理器有更好的处理:平时我们用的电脑或服务器的CPU都是多核的,但是,绝大多数现有的Java程序都只使用其中一个内核,而其他的都是处于闲置状态。

在JDK1.8之前,可能有人会告诉你,必须使用多线程才能使用多个内核。问题是,线程用起来比较难,也容易出现错误。从JDK的版本演变来看,它一直致力于让并发编程更容易、出错更少。JDK1.0里有线程和锁,甚至有一个内存模型——这是当时的最佳做法,但事实证明,不具备专门知识的项目团队很难可靠地使用这些基本模型。JDK1.5添加了如线程池和并发集合。JDK1.7添加了分支/合并(fork/join)框架,使得并行变得更实用,但仍然很困难。而JDK1.8中对并行有了一个更简单的新思路,但需要遵循一些规则。

JDK1.8提供了一个新的API(称为“流”,Stream),它支持许多处理数据的并行操作,其思路和在数据库查询语言中的思路类似:用更高级的方式表达想要的东西,而由“实现”(在这里
是Streams库)来选择最佳低级执行机制。这样就可以避免用synchronized编写代码,这一代码不仅容易出错,而且在多核CPU上执行所需的成本也比你想象的要高。

速度更快

如果你的开发环境装的就是JDK1.8,那么你就已经在无形中享用JDK1.8的新特性了。

JDK1.8对于底层的数据结构上做了些更新和改动,对垃圾回收机制(内存结构)也做了一定的改变,以及对于并行/并行流,并行的操作能够很容易的进行使用,对并行做了一些扩展和支持。

我们一起了解一下它是怎么让底层的数据结构“速度更快”呢?我们都知道底层数据结构最核心的一个就是HashMap,那么它对HashMap做了怎样的改动呢?

原来的HashMap是怎样的呢?(数组+链表)

1.8之后的HashMap是怎样的呢?(数组+链表+红黑树)

当链表长度太长(默认超过8)时,链表就转换为红黑树。红黑树的改进解决了什么问题呢?

HashMap碰撞处理的优化,针对超长链的检查,时间复杂度从O(n)降到了O(log2n)。

HashMap的优化,只是体现JDK1.8速度更快的典型代表之一,其他优化之处在此就不一一说明。

总结

看了上面这几点,你应该知道为什么要关注JDK1.8的原因了吧。因为它给我们开发、系统带来前所未有的好处,在后续的使用中,你会发现它的种种优点。


标签:为什么,JDK1.8,Java,HashMap,代码,并行,特性,链表
From: https://blog.51cto.com/xcbeyond/6241264

相关文章

  • 为什么 SELECT FOR UPDATE 只在事务中起作用
    在MySQL中SELECTFORUPDATE建议要在事务中运行,原因是当SELECTFORUPDATE执行完之后,就释放锁了。其实查询出来的数据接下来还要更新,所以建议必须要在事务中运行,针对spring事务其实就是加注解@Transaction。图二中显示一直转圈圈,说明上一个图中已经上了锁,第二图的更新必须要在......
  • c#中的特性Atrtribute和反射
    特性(Attribute)特性概述特性即Attribute,网页翻译也叫属性。他在c#代码中是一个类,名称通常为xxxAttribute。用于对程序片段(方法、类、属性)等附加一些额外信息,这些信息可以通过反射被获取,以便做一些逻辑处理。通常与筛选器、AOP等结合使用。官方文档:利用特性扩展元数据|Micr......
  • 【pytorch】为什么 ToTensor 后紧接 Normalize 操作?
    学习pytorch的transforms一节中产生疑问:ToTensor操作中图像数据满足[0,255]条件会进行线性归一化,映射到[0,1]。在ToTensor操作后一般紧接着Nomalize操作,又进行了一次标准差归一化。既然已经归一化了一次,为什么还要再来一次?以下是我在网络上找到的一些答案:数据如果......
  • 为什么要使用分布式锁(通过redis实现)
    如果需要使用到缓存机制,那就存在着这三个问题:*1、缓存穿透问题:(全部访问redis中不存在的信息),解决方式:在redis中将数据库中没有的数据暂时赋值为null*2、缓存雪崩问题:(redis中的key在同一时间大幅度的过期),解决方式:在redis中存入数据的时候,传入一个随机值作为存活时间*3、缓存击......
  • linux安装jdk1.8
    为防止操作权限不足,建议切换root用户,当然如果你对Linux命令熟悉,能够自主完成权限更新操作,可以不考虑此推荐。环境:centos7.6ssh连接工具:tabby(自从用了这个工具,我再也不用xshell了,这个工具自带文件上传,还有网页版)创建目录mkdir/opt/jdk把jdk的压缩包上传到/opt/jdk......
  • stack为什么叫做2-sheaf
    设\(\mathcal{C}\)是一个site,我们知道\(\mathcal{C}\)上的sheaf定义为满足下列条件的presheaf\(F\):对于任意sieve\(R\hookrightarrowX\),典范映射\[\mathrm{Hom}(X,F)\to\mathrm{Hom}(R,F)\]是双射.其中右侧的Hom集合定义为presheaf范畴中的Hom,即\(\mathrm{PSh}(\mathcal{C......
  • Vue3 新特性 笔记整理
    一.基于Vite的构建vite优点(可以快速构建vue项目比webpack打包更加快捷)1.快速的冷启动2.及时的模块热更新3.真正的按需编译举例:vite3构建vue3项目npminitvite=>选择框架,选择类别npminstall安装依赖 注:vite构建后的项目,不包含路由等脚手架,需要按需导入 二......
  • 从CPU的视角看 多线程代码为什么那么难写!
      当我们提到多线程、并发的时候,我们就会回想起各种诡异的bug,比如各种线程安全问题甚至是应用崩溃,而且这些诡异的bug还很难复现。我们不禁发出了灵魂拷问“为什么代码测试环境运行好好的,一上线就不行了?”。为了解决线程安全的问题,我们的先辈们在编程语言中引入了各种各样新名......
  • python 高级特性
    Python高级特性列表推导式(Listcomprehension)列表推导式允许您使用简洁的方式创建一个新的列表。它的语法如下:new_list=[expressionforiteminold_listifcondition]其中,expression是新列表中每个元素的计算公式,item是旧列表中的每个元素,condition是可选的条件......
  • MybatisPlus高级特性之SimpleQuery工具类
    1、是很么?SimpleQuery可以对selectList查询后的结果使用Stream流进行操作,使其可以返回指定的结果,简洁了api的调用2、怎么玩?案例演示(1)list操作/***list(LambdaQueryWrapper<E>wrapper,SFunction<E,A>sFunction,Consumer<E>...peeks)*参数说明:*p......