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線程鎖的升級
相關文章
相關標籤/搜索