<menu id="ycqsw"></menu><nav id="ycqsw"><code id="ycqsw"></code></nav>
<dd id="ycqsw"><menu id="ycqsw"></menu></dd>
  • <nav id="ycqsw"></nav>
    <menu id="ycqsw"><strong id="ycqsw"></strong></menu>
    <xmp id="ycqsw"><nav id="ycqsw"></nav>
  • java去重的方法(java高并發解決方案)


    介紹了ArrayList集合去重的三種方式,以及排序的兩種方式,以及反射獲取ArrayList的容量,以及Array和ArrayList的區別。


    1 Array和ArrayList的區別以及使用條件

    Array 和 ArrayList都是存放數據的容器.array是代表的是數組,arraylist是一個集合,arraylist底層使用的封裝了一個object數組。它的可變就是數組擴容。

    區別:

    1. Array可以包含基本類型和對象類型,ArrayList只能包含對象類型,jdk1.5之后傳入基本類型會自動裝箱。
    2. Array數組在存放的時候一定是同種類型的元素。ArrayList就不一定了,因為ArrayList可以存儲Object。
    3. Array大小是固定的,ArrayList的大小是動態變化的。
    4. ArrayList作為Array的增強版,當然是在方法上比Array更多樣化,比如添加全部addAll()、刪除全部removeAll()、返回迭代器iterator()等。

    使用條件:

    1. 當存放的內容數量不固定,不確定,有限時采用arraylist。
    2. 如果想要保存一些在整個程序運行期間都會存在而且不變的數據,可以放在數組里。
    3. 如果我們需要對元素進行頻繁的移動或刪除,或者是處理的是超大量的數據,那么,使用ArrayList的效率很低,使用數組進行這樣的容量調整動作很麻煩,我們可以選擇LinkedList。

    2 List去重

    2.1 借助輔助集合

    借助輔助集合

    ArrayList<String> al = new ArrayList<String>();
    al.add("aa");
    al.add("bb");
    al.add("aa");
    al.add("dd");
    al.add("dd");
    al.add("dd");
    al.add(null);
    al.add("ee");
    al.add("ee");
    //去重思路一  借助輔助集合
    ArrayList<String> al2 = new ArrayList<String>();
    for (String s : al) {
        if (!al2.contains(s))
        {
            al2.add(s);
        }
    }
    al.clear();
    al.addAll(al2);
    System.out.println(al);   //[aa, bb, dd, null, ee]

    2.2 利用迭代器

    直接利用列表迭代器,無需借助輔助集合(打亂順序)

    ListIterator<String> sli = al.listIterator();
    while (sli.hasNext()) {
        String next =  sli.next();   //獲得下一個元素
        sli.remove();   //移除獲得的元素
        if (!al.contains(next))  //判斷源集合是否包含被移除的元素
        {
            sli.add(next);  //沒包含就再添加進來
        }
    }
    System.out.println(al);

    注意: contains(obj); remove(Object obj);

    以上兩個方法底層是依據equals方法:根據equals方法返回的值,判斷是否移除/或者是判斷是否存在。因此對對象去重時,需要重寫equals方法,使得equals比較的是具體值而不是地址。

    2.3 利用java8的lambda

    使用Java8的lambda表達式輕松實現集合去重

    al = al.stream().collect(Collectors.collectingAndThen(Collectors.toCollection(HashSet::new), ArrayList::new));
    System.out.println(al);

    3 List排序

    Clooections的sort方法快速實現排序:

    public static <T extends Comparable<? super T>> void sort(List list) –自然排序 public static void sort(List list,Comparator<? super T> c) –自定義排序

    4 反射獲取ArrayList的容量

    明顯我們無法直接通過可用方法獲取ArrayList的容量,因此只有使用反射獲取:

    // 獲取list容量
    public static Integer getCapacity(ArrayList list) {
        Integer length = null;
        Class clazz = list.getClass();
        Field field;
        try {
            field = clazz.getDeclaredField("elementData");
            field.setAccessible(true);
            Object[] object = (Object[]) field.get(list);
            length = object.length;
            return length;
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return length;
    }

    5 迭代器和for循環速度測試

    public class ArrayListTest {
        static List<Integer> list = new ArrayList<Integer>();
    
        static {
            for (int i = 1; i <= 100000000; i++) {
                list.add(i);
            }
        }
    ?
        public static long arrayFor() {
            //開始時間
            long startTime = System.currentTimeMillis();
            for (int j = 0; j < list.size(); j++) {
                Object num = list.get(j);
            }
            //結束時間
            long endTime = System.currentTimeMillis();
            //返回所用時間
            return endTime - startTime;
        }
    ?
        public static long arrayIterator() {
            long startTime = System.currentTimeMillis();
            Iterator iterator = list.iterator();
            while (iterator.hasNext()) {
                Object next = iterator.next();
            }
            long endTime = System.currentTimeMillis();
            return endTime - startTime;
        }
    ?
        public static void main(String[] args) {
            long time1 = arrayFor();
            long time2 = arrayIterator();
    ?
            System.out.println("ArrayList for循環所用時間==" + time1);
            System.out.println("ArrayList 迭代器所用時間==" + time2);
        }
    }

    版權聲明:本文內容由互聯網用戶自發貢獻,該文觀點僅代表作者本人。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如發現本站有涉嫌抄襲侵權/違法違規的內容, 請發送郵件至 舉報,一經查實,本站將立刻刪除。

    發表評論

    登錄后才能評論
    国产精品区一区二区免费