日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

ArrayList的去重、排序以及其他应用

發布時間:2024/1/1 编程问答 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 ArrayList的去重、排序以及其他应用 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

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

文章目錄

  • 1 Array和ArrayList的區別以及使用條件
  • 2 List去重
    • 2.1 借助輔助集合
    • 2.2 利用迭代器
    • 2.3 利用java8的lambda
  • 3 List排序
  • 4 反射獲取ArrayList的容量
  • 5 迭代器和for循環速度測試

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

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

區別:

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

  • 當存放的內容數量不固定,不確定,有限時采用arraylist。
  • 如果想要保存一些在整個程序運行期間都會存在而且不變的數據,可以放在數組里。
  • 如果我們需要對元素進行頻繁的移動或刪除,或者是處理的是超大量的數據,那么,使用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 blocke.printStackTrace();}return length; }

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

    一般來說,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);} }

    如果有什么不懂或者需要交流,可以留言。另外希望點贊、收藏、關注,我將不間斷更新各種Java學習博客!

    總結

    以上是生活随笔為你收集整理的ArrayList的去重、排序以及其他应用的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。