Java8新特性 概述

为什么要用哈希表,--一万个元素一万次equals,效率低
hashmap底层是数组,每个数组都是entry,为什么要用hash表?
哈希表好处--默认16,存入的术后调用对象的hashcode,用hash算法对hashcode进行运算,计算出来的就是数组的索引值,找到对应的位置,看看这个位置上面有没有对象在,如果没有,直接添加。如果当前位置有对象在,进行equals比较,如果一样,value进行覆盖。如果不一样,形成链表,jdk1.7后加的元素放前边,加到表头。(形成链表的情况称之为碰撞)如果碰撞多的情况下(链表中元素多),还是会和原来一样,每个都要equals,效率低。尽可能避免这样碰撞的情况。      
如何减少碰撞情况的发生?--  1.对象的hashcode和equals要写的严谨一点。hashcode和equals方法要保持一致,所谓的一直就是说--对象内容一样,生成的hashcode要一样,equals要返回true。

2.加载因子0.75进行扩容,不能到达100%,可能就五个位置,对象就存在1,3两个位置,链表会越来越长。也不能太低,浪费空间。
扩容会对每个元素进行重新运算,找到新的为只加进去。这样碰撞的几率就小了。

这两种方法也只是减少碰撞。取元素的时候对链表中元素进行equals,极端情况下会对每一个都equals,效率低。

jdk1.8数组加链表--加红黑树(二叉树的一种)一个是链表长度到8,一个是数组长度到64.jdk1.8添加元素添加到链表末尾。红黑树好处--除了添加操作,取出来,删除的操作快(比大小)。红黑树扩容--原来哈希表长度加上当前所在位置。

concurrenthashmap 锁分段技术,默认16个段,每个段是一个表--16   1.7   concurrentLevel=16 太大可能有些段用不到,空间浪费。段太小,元素可能过多,效率低。
--hash表--链表加红黑树,CAS--底层操作系统支持算法,效率高。
    (首先concurrentHashMap是一个segment数组,每个segment都是一个继承了ReentrantLock的类,这样就可以方便地在各个segment里面加锁所以每次需要加锁的操作锁住的是一个 segment,这样只要保证每个 Segment 是线程安全的,也就实现了全局的线程安全。
    这个最外面的Segment[]数组,是不可以扩容的!然后进到Segment内部,会发现,每个Segment可以看作一个HashMap。也就是在一个Segment里面,有个HashEntry[]数组,然后这个数组是一个个桶,桶里面是单向链表。)
    
内存结构发生变化--方法区属于堆的永久区的一部分,类信息,会被垃圾回收,垃圾回收的条件比较苛刻。快满的时候,容量过大的时候
JVM--
Oracle-SUN Hotspot
Oracle--JRocket
IBM J9-JVM
Taobao JVM(国产)

jdk1.8没有永久区--变成MetaSpace 元空间--用的物理内存而不是自己分配内存,物理内存多大,元空间多大。快满的时候,容量过大的时候。用的是物理内存,回收降低,发生几率低。OOM概率低
1.8--PremGenSize-MaxPremGenSize 无效
    MetaSpaceSize-MaxMetaSpaceSize

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值