Java-1129

Java8

  1. 新特性
    1. 速度更快
    2. 代码更少(lambda、stream)
    3. 强大的Stream API
    4. 便于并行
    5. 最大化减少空指针异常Optional
  2. 速度更快:对底层数据结构哈希map的优化

    在这里插入图片描述

    1. 解释说明hashmap基本原理
      1. hashmap本质是一个长度16的数组
      2. 元素的键值对以key:value的形式存储,当key相同时如果value不同则放入同一个key下的链表中,遵循先来的往后放的原则。在jdk1.8则是直接加在链表末尾
      3. hashcode方法:调用之后产生一个长串的哈希码值,码值再经过运算变成hashmap数组的索引值。
    2. hashMap在jdk8中底层实现原理与jdk7不同的说明:
      1. new HashMap(); 底层没有创建一个长度为16的数组。首次调用put()方法时才创建了长度为16的数组
      2. jdk8底层数组为: Node[] ,而非Entry[]
      3. jdk7的底层为: 数组+链表 而 jdk8的底层为: 数组+链表+红黑树
        1. 数组: 用来定位元素的位置
        2. 链表: 用来存储位置相同的元素
        3. 红黑树: 可以实现自平衡(旋转)
      4. 当数组的某一个索引位置上的元素以链表形式存储的数据个数>8,且当前数组元素总数的长度>64时,此时此索引位置上的所有数据改为使用红黑树存储;当在树上进行删除操作,使结点数等于6时,又自动转为链表存储
      5. 加载因子 :也叫扩容因子,就是当hashmap的实际包含元素达到初始化容量*加载因子时,hashmap会进行扩容,
      6. 加载因子0.75: 容量与性能的平衡结果,过大会引起更多冲突,过小会浪费太多空间。
    3. hashset的实现方式也相应改变了。
    4. ConcurrentHashMap也进行了升级,原本并发级别concurrentLevel = 16,改进后基本不用,使用CAS算法
    5. CAS无锁算法:一种乐观锁算法,销量更高,底层操作系统支持的算法。
  3. 速度更快2:底层内存结构也不一样
    1. 原本:栈、堆、方法区(堆中永久区的一部分,堆永久区主要加载类信息,几乎不会被垃圾回收区回收,只不过回收条件比较苛刻;)
      1. 堆的永久区:早在1.8之前,除sun版本的jvm其余JVM早已没有永久区,已经将方法区单独剥离出来永久区。
      2. 堆的永久区:1.8之后,彻底被干掉了,取而代之的是metaSpace元空间,它使用的是物理内存,而不是分配的内存,物理内存有多大,我就可以用多大,而不受限于分配空间。垃圾的清理取决于metaSpaceSize和MaxMetaSpaceSize
  4. 代码更少:Lambda表达式和Stream API
  5. 便于并行:对于pop、join进行了提升,从串行切换到并行
  6. 最大化减少空指针异常
    1. 提供了一个容器类Option,用于封装有可能为空的对象封装到容器类中提供解决方法
  7. 总之:最大的两个改动:lambda表达式和stream API

Lambda表达式

  1. 为什么使用lambda
    1. lambda是一个匿名函数,是一段可以传递的代码,也可以理解为函数参数。基本形式() -> {}

    2. 简化了很多无用的代码,例如:相比匿名内部类定义比较器

      		/**
           * 匿名内部类
           */
          @Test
          public void test1(){
      
              //  匿名内部类实现接口,匿名内部类的实例作为参数
              Comparator<Integer> com =  new Comparator<Integer>() {
                  @Override
                  public int compare(Integer o1, Integer o2) {
                      return Integer.compare(o1,o2);
                  }
              };
              TreeSet<Integer> ts = new TreeSet<>(com);
          }
      
          /**
           * lambda表达式
           */
          @Test
          public void test2(){
              Comparator<Integer> com = (x,y) -> Integer.compare(x,y);
            	//	更简洁可以这样写
              TreeSet<Integer> ts = new TreeSet<>(Integer::compare);
          }
      
    3. 对于一些重复代码可以使用相应的设计模式进行优化,例如定义比较器接口然后进行分别实现,不过代码量也不小。

    4. 总之就是一个词,简洁。

  2. Lambda基本语法
    1. lambda操作符:"->"也叫箭头操作符。左右侧分别为不同内容:
      1. 左侧:参数列表
      2. 右侧:所需执行功能,lambda体
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值