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 調用構造器
- Stream 流式操做
- Stream<T> s = list.stream();
- 方法
- s.filter( XXX ).forEach( XXX );
filter適配,傳入集合的對象,返回布爾條件表達式 留下true的 forEach遍歷
- distinct()去重
- limit(1) 按照正常順序截斷,最多一我的
- skip(1) 跳過第一我的
- sorted() 排序 用的是類中重寫的compareTo方法 能夠在括號中用lambda重寫compareTo方法
集合中的元素必須是Comparable接口的實現類
- peek( 代碼 ) 內部有消費接口
- 映射
- map( 集合中對象 -> 要執行的的操做後的返回值 )
- *flatMap() 返回集合
- 終端操做
- forEach() 遍歷
- allMatch() 傳入斷言接口的實現 必須都達成條件,而後返回布爾值 過程當中一旦有一個不符合直接返回false
- anyMatch() 傳入斷言接口的實現 有一個達成就返回真
- nonMatch() 是否都不符合這個條件
- findAny() 篩選全部符合條件的
- findFirst() 篩選第一個
- count() 統計符合條件的個數 返回Long型值
- Optional<> o 若是find返回的是空,則用Optional自動給一個默認值
- 規約操做
- reduce( 初始值 , 二元運算接口實現BinaryOperator b )
- reduce( 0 , (x, y)->x+ y ); 0是初始累加和, x是當前累加和, y是下一個元素
- collect() 把返回的元素收集到集合中 括號裏寫Collectors.to'集合類型'
- Collectors還能夠.counting() 總數 .summingInt()總合 .averageingInt() 平均值 .groupingBy()傳入lambda表達式 .partitioningBy() 按照布爾條件分組 .joining("分隔符","前置拼接","後置拼接")
- Path接口:文件路徑接口,
- Paths.get(路徑) 獲取對象,此對象指向路徑
- Files.list(Path p) 返回Stream對象, 對象中保存了一堆Path對象, 這些對象是list對象文件夾下面的 子文件和子文件夾路徑
- 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線程鎖的升級
歡迎關注本站公眾號,獲取更多信息