Java8部分新特性及升级

    • Lambda表达式
      语法糖, "糖衣语法" 在结构上更为清晰简单, 可是本质上并无提高代码执行效率, 典型的语法糖还有 包装类的自动建包拆包等
      • Lambda表达式总体 表示一个已经实现接口方法的对象, 相似匿名内部类的表现形式
      • Runnable runnable = () ­-> {System.out.println("Hello Lambda!");};
        此为实现了run方法的对象 runnable, run方法的内容为打印"Hello Lambda!"
        • 对函数式接口中 抽象方法的实现部分 仅关注方法的参数、执行过程、返回结果
        • ( ) 参数列表 至关于抽象方法的参数
        • -> 表示将参数传递给过程 这一律念
        • {执行体} 至关于抽象方法的具体实现过程
      • 必须为函数式接口: Runnable Comparator FilFilter FilenamFilter等
        • (只有一个未实现方法)
      • Java8中的新接口
        • Consumer:消费型接口 只有参数,没有返回值 accept();
          Consumer<Double> con = (money) ‐> System.out.println("花了" + money + "元");
        • Supplier:供给型接口 只有返回值,没有参数 get();
          Supplier<Integer> supplier = () ‐> (int)(Math.random() * 100);supplier.get(); //获取随机数​
        • Function:函数型接口 加工传入的值并返回 泛型<T,R>传入T返回R
          Function<Integer, Double> function = (angle) ‐> Math.sin(angle);
          • BiFunction<T, U, R> 传入T,U 返回R
          • UnaryOperator<T> 一元运算 传入T返回T
          • BinaryOperator<T> 二元运算 传入T返回T
          • ToIntFunction<T> 传入T返回int
          • ToLongFunction<T> 传入T返回long
          • ToDoubleFunction<T> 传入T返回double
          • IntFunction<R> 传入int 返回R
          • LongFunction<R> 传入long 返回R
          • DoubleFunction<R> 传入double 返回R
        • Predicate:断言型接口 返回布尔值 test(); 对传入的值进行判断
          Predicate<Integer> predicate = (integer) ‐> {     if(integer >= 100 && integer < 500) {        return true;    }        return false;};
      • 表达式中调用类方法 类名::类方法
        Converter c1 = (from) ‐> Integer.parseInt(from); 只代表传入参数的类型,和调用的类方法名​​​Converter c2 = Integer::parseInc2.​接口方法(参数);也能够直接用在类方法位置上写new​ 调用构造器
    • HashMap与红黑树
      • java7中用 HashMap底层算法使用了数组加链表的结构
        • 插入元素
          处于同一链表的元素具备相同的hash值, 但每一个元素的内容仍是不一样, 因此equals返回false插入元素时​, 计算新元素的hashcode值, 经过Hash算法, 算出此hashcode值在数组中对应下标, 而后查这个下标位置的链表, 没有的话直接插入, 若是有的话, 查询链表, 并与新元素equals 若是返回的都是false 则把新元素放在链表第一个位置上, 若是有返回true的, 则插入失败​
        • 数组扩容→加载因子
          由于数组原则上不可变, 因此HashMap存在'加载因子'=0.75意味着若是此HashMap已经有75%的 数组下标被占用, 则对数组进行扩容*发生扩容时会从新计算全部元素的HashCode值,并从新用Hash算法映射对应数组位置的其下标​
        • 弊端
          查找元素效率低元素插入效率慢​
      • java8中 HashMap的内存结构进行升级 数组+链表+红黑树
        • *当前HashMap中元素总数超过64个, 且某一组链表中元素数量>=8个 则将此链表结构变成红黑树结构
        • 红黑树结构牺牲了添加元素的效率, 增长了查找元素的效率
      • 红黑树: 一种特殊的二叉查找树
        时间复杂度→ O(lgn)​根节点为黑色每一个为空的叶子节点为黑色没有一条枝 会比其余的枝长两倍​(红黑树是最接近平衡的二叉树)*应用于TreeSet, TreeMap​
        • 左旋与右旋

          旋转先后, 应当都是二叉查找树
        • 添加元素
          向二叉查找树同样添加, 并将新结点涂成红色而后经过旋转+换颜色, 使二叉查找树知足红黑树的定义​
        • 删除元素
          一样须要旋转+换颜色
    • Java8中对ConcurrentHashMap线程锁的升级
相关文章
相关标签/搜索