介紹AVIF圖片格式的特點和在Web端顯示AVIF格式圖片的兩種方案。 1 簡介 AVIF是一種基於AV1視頻編碼的新圖像格式,相對於JPEG、Wep等圖片格式壓縮率更高,並且畫面細節更好。AVIF通過使用更現代的壓縮演算法,在相同質量的前提下,AVIF文件大小是JPEG文件的35%左右。 AVIF支 ...
原理很簡單,利用對象引用特性。
科普一下知識點:
淺拷貝:
淺拷貝又稱為淺複製,淺克隆,淺拷貝是指拷貝時只拷貝對象本身(包括對象中的基本變數),而不拷貝對象包含的引用所指向的對象,拷貝出來的對象的所有變數的值都含有與原來對象相同的值,而所有對其他對象的引用都指向原來的對象,簡單地說,淺拷貝只拷貝對象不拷貝引用。
深拷貝:
深拷貝又稱為深複製,深克隆,深拷貝不僅拷貝對象本身,而且還拷貝對象包含的引用所指向的對象,拷貝出來的對象的所有變數(不包含那些引用其他對象的變數)的值都含有與原來對象的相同的值,那些引用其他對象的變數將指向新複製出來的新對象,而不指向原來的對象,簡單地說,深拷貝不僅拷貝對象,而且還拷貝對象包含的引用所指向的對象。
思路:
在構建樹形結構時,我們最常用方法是使用遞歸演算法進行處理,讓程式按照我們的想法一步一步的向下查找子節點,這個過程是程式員通過代碼控制的;
參考對象引用的特性,這個過程其實完全可以利用引用特性自動執行;
進入正題:
第一步:判斷實體中包含 id parentId childList這三個構建一顆樹的必備屬性;
第二步:查找到每一列數據的下一級元素;
第三步:記錄所有的 id,用於篩選出來第一級的節點,一個簡單的思路,如果 parentId 不存在於 ids數組中,那麼當前節點一定是一級節點;
第四步:將一級節點加入新數組,並返回;
直接上代碼:
1 public <E extends Object> List<E> tree(List<E> e) { 2 List<E> result = new ArrayList<>(); 3 List<Long> ids = new ArrayList<>(); 4 for (E e1 : e) { 5 Method setChildList = e1.getClass().getMethod("setChildList",List.class); 6 if(ObjectUtils.isEmpty(setChildList)) continue; 7 Method getId = e1.getClass().getMethod("getId"); 8 if(ObjectUtils.isEmpty(getId)) continue; 9 long id = (long) getId.invoke(e1); 10 if(ObjectUtils.isEmpty(id)) continue; 11 Method getParentId = e1.getClass().getMethod("getParentId"); 12 if(ObjectUtils.isEmpty(getParentId)) continue; 13 long parentId = (long) getParentId.invoke(e1); 14 if(ObjectUtils.isEmpty(parentId)) continue; 15 ids.add(id); 16 List<E> es = e.stream().filter(p -> { 17 try { 18 Method pk = p.getClass().getMethod("getParentId"); 19 if (ObjectUtils.isEmpty(pk)) return false; 20 long pv = (long) pk.invoke(p); 21 if (ObjectUtils.isEmpty(pv)) return false; 22 return pv == id; 23 } catch (Throwable ex) { 24 return false; 25 } 26 }).collect(Collectors.toList()); 27 if(!ObjectUtils.isEmpty(es)) setChildList.invoke(e1,es); 28 } 29 for (E e1 : e) { 30 Method getParentId = e1.getClass().getMethod("getParentId"); 31 if(ObjectUtils.isEmpty(getParentId)) continue; 32 long parentId = (long) getParentId.invoke(e1); 33 if(ObjectUtils.isEmpty(parentId)) continue; 34 if(!ids.contains(parentId)) result.add(e1); 35 } 36 37 return result; 38 }