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);
    }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM