一、版本中数据结构的修改浅析
1、HashMap、HashSet、ConcurrentHashMap的数据结构发生变化

(1)HashMap简介(结构:哈希表+链表)

HashMap存储的数据是无序的,结构哈希表加链表的存储方式,key不能重复,哈希表就是数组,存储的数组都是entry,初始大小默认是16,HashMap底层使用哈希算法原理:当创建一个对象,想要加入到HashMap,会默认调用底层的一个方法hashCode()。

HashMap算出索引值,会上对应的链表中找是否有对象,如果没有对象,没有直接添加,如果有对象,通过equals比较两个对象,如果内容一样,将视为重复元素,后边的将前边的覆盖掉.内容不一样,JDK1.7中,不一样的时候生成一个链表,后加入的跟前边的生成链表,称为"碰撞","碰撞"过多的时候,下次添加就会更多个值进行equals,效率会极低.如何避免?无法避免。
         如果不采用上述方式,就需要每次添加都equals比较,并且还要比较下一次添加的值,效率会大大降低。

         HashMap具有加载因子,是0.75,当哈希表达到75%的时候,就会进行扩容,扩容是原来长度的2倍.一旦扩容,发生碰撞的元素就会进行重新排序.将元素放到新的位置上去,以解决"碰撞"问题.
         HashMap把Key和Value封装到entry对象中,还是无法避免碰撞问题。
  (2)Java8中HashMap的数据结构发生变化(结构:数组+链表+红黑树)

新版设计:

            当HashMap中的某一个链表的长度大于8,并且元素总容量大于64的时候,链表就会变为二叉树中的红黑树.
         优势:除了添加,其他的效率都提高了.1.8前添加的重复元素直接添加在链表最后,1.8中需要跟红黑树的子节点进行比较,最后找到合理的位置添加.

  查询提速,原来是遍历整个链表,挨个比较查询值.
        现在二叉树节点比较查询,查询的节点数目减少。
  (3)HashSet也会更新,因为HashSet的底层就是HashMap。
  (4)ConcurrentHashMap简述
         锁分段(锁分离)机制1.8以前

  也进行了更改,以往HashMap线程不安全的处理方案是加锁,但是效率极低,1.8以前,它有个默认并发级别是16,每个段都是线程安全的,在每个段中对应着一个HashMap,意味着一次能有16个线程访问HashMap.
         无锁算法1.8以后
     1.8前存在问题:并发级别段的大小不好控制,过大浪费资源,过小操作不便.
     1.8中取消了并发级别段,采用了CAS算法,其实是一个底层硬件的算法,底层硬件对于并发的一个支持,效率比锁的高,CAS算法又称为无锁算法。
  (5)JVM支持的内存结构发生改变
          JVM拥有两块虚拟的内存空间,一部分称之为栈,一部分称之为堆.还有一部分为方法区.

          方法区是属于堆内存的,堆内存分为垃圾回收区和永久区,方法区属于永久区的一部分.
         JVM分类(不同厂商):
                Oracle-Sun Hotspot 
                Oracle(自己生产的) JRocket
                IBM   J9
                Alibaba(国产) Taobao
         1.8以前只有Hotspot的版本有永久区,其他厂商独立分区.(永久区存储类加载信息)
         1.8以后JVM变化:

              1.8中删除了JVm中的永久区.独立分出一片区域叫做MetaSpace(元空间),元空间采用物理内存,服务器内存空间多大,MetaSpace就有多大.OOM错误发生概率降低.(除非一个无限创建的类加载),由于垃圾回收机制改为元空间将要满的时候才垃圾回收,垃圾回收运行的次数减少了,效率提高了.
              永久区中调优属性PermGenSize和MaxPermGenSize,改为MetaSpaceSize和MaxMetaSpaceSize

注:

哈希算法:

哈希算法是将hashCode()生成的值,进行一个运算(哈希算法运算),运算成对应的数组的索引值,这就是哈希算法.

JAVA 8 主要新特性 ----------------(二)版本中数据结构的修改浅析的更多相关文章

  1. JAVA 8 主要新特性 ----------------(二)JDK1.8优点概括

    一.JDK1.8优点概括 1.速度更快 由于底层结构和JVM的改变,使得JDK1.8的速度提高. 2.代码更少(增加了新的语法 Lambda 表达式)          增加新特性Lambda表达式的 ...

  2. 深入理解java虚拟机---jdk8新特性(二)

    1.jdk8新特性 1.新特性 2.lambda函数表达式的作用 A: 替换内部类 B:对集合的操作并行化

  3. JAVA 8 主要新特性 ----------------(一)总纲

    一.版本中数据结构的修改浅析 二.JDK1.8优点概括 三.新功能Lambda表达式入门 四.Lambda函数式接口 五.Lambda方法引用与构造器引用 六.集合Stream API 七.新时间日期 ...

  4. [转] Java 8的新特性

    简介 毫无疑问,Java 8是Java自Java 5(发布于2004年)之后的最重要的版本.这个版本包含语言.编译器.库.工具和JVM等方面的十多个新特性.在本文中我们将学习这些新特性,并用实际的例子 ...

  5. Java 8的新特性—终极版

    作者:杜琪[译] 原文链接:http://www.jianshu.com/p/5b800057f2d8 1. 简介 毫无疑问,Java 8是Java自Java 5(发布于2004年)之后的最重要的版本 ...

  6. Java 9和Java 10的新特性

    http://www.infoq.com/cn/news/2014/09/java9 Java 9新特性汇总 继2014年3月份Java 8发布之后,Open JDK加快了开发速度, Java 9的发 ...

  7. JDK 15 JAVA 15的新特性展望

    目录 JEP 371: Hidden Classes JEP 372: 删除 Nashorn JavaScript Engine JEP 377: 新的垃圾回收器ZGC正式上线了 JEP 378: T ...

  8. Java8新特性(一)_interface中的static方法和default方法

    什么要单独写个Java8新特性,一个原因是我目前所在的公司用的是jdk8,并且框架中用了大量的Java8的新特性,如上篇文章写到的stream方法进行过滤map集合.stream方法就是接口Colle ...

  9. [转] Java se 7新特性研究(二)

    详见: http://blog.yemou.net/article/query/info/tytfjhfascvhzxcytp82   今天主要研究Java se 7中异常处理的新功能.从今天开始正在 ...

随机推荐

  1. 杂谈2.py

    tuple用圆括号括住的项的列表,这些项不能改变,括号内的值都是相关的 dictionary 已经配对的键和值的列表,用花括号括住 当创建对象并在其中存储信息的时候变量的类型就确定啦 type(obj ...

  2. TensorFlow模型加载与保存

    我们经常遇到训练时间很长,使用起来就是Weight和Bias.那么如何将训练和测试分开操作呢? TF给出了模型的加载与保存操作,看了网上都是很简单的使用了一下,这里给出一个神经网络的小程序去测试. 本 ...

  3. win10 64 + VS2010 + Opencv 2.4.9 + HIKVISION(海康)

    海康相机型号:DS-2CD2512F-IS 参考连接http://blog.csdn.net/wanghuiqi2008/article/details/31404571 先上效果图 其中,在连接时遇 ...

  4. asp.net 微信JsSDK

    有时间再整理吧 using System; using System.Collections.Generic; using System.Linq; using System.Web; using S ...

  5. java DES加解密及Wrong key size错误

    如下的DES加密方法会报错:Wrong key size public static String encryptDES(String source) throws Exception{ Secret ...

  6. javascript中正则表达式中的 match,exec,test,replace 之我理解

    这个正则 ($&) 的语法: https://msdn.microsoft.com/library/3k9c4a32(v=vs.94).aspx 在ECMAScript中对这几个的说明: ma ...

  7. 《CSAPP》符号和符号表

    符号和符号表 每个可重定位目标模块m都有一个符号表,它包含m所定义和引用的符号的信息. 有三种不同的符号: 由m定义并能被其他模块引用的全局符号.对应非静态的C函数以及不带C static属性的全局变 ...

  8. 【Django】关于设置和获取cookies

    def TestCookies(request): response=HttpResponse() # cookie=request.COOKIES#下面两句等cookies设置以后,才使用 # if ...

  9. C++对象的内存分布和虚函数表

    c++中一个类中无非有四种成员:静态数据成员和非静态数据成员,静态函数和非静态函数. 1.非静态数据成员被放在每一个对象体内作为对象专有的数据成员.    2.静态数据成员被提取出来放在程序的静态数据 ...

  10. IIC基本概念和基本时序

    1. IIC基本概念和基本时序 1.1 I2C串行总线概述 I2C总线是PHLIPS公司推出的一种串行总线,是具备多主机系统所需的包括总线裁决和高低速器件同步功能的高性能串行总线. 1.I2C总线具有 ...