• jdk1.8新特性



    JDK1.8新特性:

    hashMap

    在jdk1.8中对hashMap等map集合的数据结构优化。hashMap数据结构的优化
    原来的hashMap采用的数据结构是哈希表(数组+链表),hashMap默认大小是16,一个0-15索引的数组,如何往里面存储元素,首先调用元素的hashcode
    方法,计算出哈希码值,经过哈希算法算成数组的索引值,如果对应的索引处没有元素,直接存放,如果有对象在,那么比较它们的equals方法比较内容
    如果内容一样,后一个value会将前一个value的值覆盖,如果不一样,在1.7的时候,后加的放在前面,形成一个链表,形成了碰撞,在某些情况下如果链表
    无限下去,那么效率极低,碰撞是避免不了的
    加载因子:0.75,数组扩容,达到总容量的75%,就进行扩容,但是无法避免碰撞的情况发生
    在1.8之后,在数组+链表+红黑树来实现hashmap,当碰撞的元素个数大于8时 & 总容量大于64,会有红黑树的引入
    除了添加之后,效率都比链表高,1.8之后链表新进元素加到末尾
    ConcurrentHashMap (锁分段机制),concurrentLevel,jdk1.8采用CAS算法(无锁算法,不再使用锁分段),数组+链表中也引入了红黑树的使用

     

    Lambda表达式:

      Lambda表达式的本质是一段匿名内部类。也可以是一段可以传递的代码,

     在商场购物时,需要进行筛选过滤类

    public List<Product> filterProductByPredicate(List<Product> list,MyPredicate<Product> mp){
            List<Product> prods = new ArrayList<>();
            for (Product prod : list){
                if (mp.test(prod)){
                    prods.add(prod);
                }
            }
            return prods;
        }
    //Lambda表达式来代替匿名内部类
    @Test
    public void test4(){ List<Product> products = filterProductByPredicate(proList, (p) -> p.getPrice() < 8000); for (Product pro : products){ System.out.println(pro); } }

     Lmabda表达式的语法总结: () -> ();口诀:左右遇一省括号,左侧推断类型省

    前置 语法
    无参数无返回值 () -> System.out.println(“Hello WOrld”)
    有一个参数无返回值 (x) ->  System.out.println(x)
    有且只有一个参数无返回值 x -> System.out.println(x)
    有多个参数,有返回值,有多条lambda体语句 (x,y) -> {System.out.println(“xxx”);return xxxx;};
    有多个参数,有返回值,只有一条lambda体语句 (x,y) -> xxxx

     

    函数式接口:

      只定义了一个抽象方法的接口(Object类的public方法除外),就是函数式接口,并且还提供了注解:@FunctionalInterface

    常见的四大函数式接口:

    • Consume<T>:消费型接口,有参无返回值
    • Supplier 《T》:供给型接口,无参有返回值
    • Function 《T,R》::函数式接口,有参有返回值,
    • Bifunction<T, U, V> 可以理解为Function的一种扩展, Function接口接收一个参数, 返回一个参数; BiFunction接口接受两个参数, 返回一个参数
    • Predicate《T》: 断言型接口,有参有返回值,返回值是boolean类型
      /**
      *Consumer<T> 消费型接口
      */
    public void accept(String str, Consumer<String> con){ con.accept(str); } @Test public void testConsumer(){ accept("hello",str -> System.out.println(str)); }
        /**
         * Supplier<T> 供给型接口
         * @param supplier
         */
        public String getValue(Supplier<String> supplier){
           return supplier.get();
        }
    
        public void testSupplier(){
           String str= getValue(() ->  "hello");
           System.out.println(str);
        }
    }
     /**
         * Function<T,R> 函数式接口
         * @param str
         * @param func
         * @return
         */
        public String strAppend(String str, Function<String,String> func){
            return func.apply(str);
        }
    
        @Test
        public void testFunction(){
            String str = strAppend("hello",(x) -> x+" function");
        }
     /**
         * Predicate<T> 断言型接口
         * @param str
         * @param pred
         * @return
         */
        public Boolean isOutMax(String str, Predicate<String> pred){
           return  pred.test(str);
        }
    
        @Test
        public void testPredicate(){
          boolean b =  isOutMax("hello",(x) -> x.length() > 1);
          System.out.println(x);
        }
  • 相关阅读:
    java(样品集成框架spring、spring mvc、spring data jpa、hibernate)
    设定十分钟android在状态栏上集成的开源project推荐
    分析javascript关闭
    排列-条件求和(Code)
    Leetcode: Remove Duplicates from Sorted Array
    怎样将baidu地图中的baidu logo 去掉
    Android自适应不同屏幕几种方法
    浏览器兼容性问题解决方式
    XMPP入门
    “聊天剽窃手”--ptrace进程注入型病毒
  • 原文地址:https://www.cnblogs.com/perserv/p/11767923.html
Copyright © 2020-2023  润新知