1. 程式人生 > >java成神之——集合框架之ArrayList,Lists,Sets

java成神之——集合框架之ArrayList,Lists,Sets

code integer 查詢 aes 循環 etl 散列 排序 shuf

  • 集合
    • 集合種類
    • ArrayList
      • 聲明
      • 增刪改查元素
      • 遍歷幾種方式
      • 空集合
      • 子集合
      • 不可變集合
      • LinkedList
    • Lists
      • 排序
      • 類型轉換
      • 取交集
      • 移動元素
      • 刪除交集元素
    • Sets
      • 集合特點
      • 常用方法
      • 根據set創建list

集合

集合種類

List<String> list = new ArrayList<>(data); 
Set<String> set1 = new HashSet<>(data); // 值不重復
SortedSet<String> set2 = new TreeSet<>(data); // 值有序並且不重復
Set<String> set3 = new LinkedHashSet<>(data); // 值順序固定並且不重復
Map<String, Object> map1 = new HashMap<>(map);
SortedMap<String, Object> map2 = new TreeMap<>(map);

ArrayList

聲明

ArrayList是順序表,增刪慢,查詢快,有序可重復集合
只能用來存儲自定義應用類型和包裝類型 Byte Short Integer Long Float Double Character Boolean

List list = new ArrayList();
List<String> list = new ArrayList<String>();
List<String> list = new ArrayList<>();
ArrayList<Integer> arr = new ArrayList<Integer>();

增刪改查元素

List<Integer> list = new ArrayList<Integer>();
List<Integer> list1 = new ArrayList<Integer>();
list.add(1); 
list1.add(2);
list.addAll(list1);

list.add(11);
list.add(1, 33);
list.set(0, 33);
list.remove(0);
list.clear();
list.get(0)
list.size()

遍歷幾種方式

第一種

    List<String> list = new ArrayList<>(Arrays.asList("a", "b", "c"));
    list.forEach(System.out::println);

第二種

    list.parallelStream().forEach(System.out::println);

第三種

    for (String item : list) {
        System.out.println(item);
    }

第四種

    ListIterator<String> iterator = list.listIterator();
    while(iterator.hasNext()) {
        System.out.println(iterator.next());
    }

空集合

List<String> anEmptyList = Collections.emptyList();
Map<Integer, Date> anEmptyMap = Collections.emptyMap();
Set<Number> anEmptySet = Collections.emptySet();

子集合

List<String> list = new ArrayList<>(Arrays.asList("a", "b", "c"));
List<String> list1 =  list.subList(0,2); // [a, b]

不可變集合

List<String> list = new ArrayList<>(Arrays.asList("a", "b", "c")); 
List<String> list1 = Collections.unmodifiableList(list); // 不能修改值
List<String> unmodifiableList = Collections.singletonList("Only string in the list"); // 只有一個元素的不可變集合

LinkedList

鏈表,增刪快,查詢慢
        
LinkedList<String> arr = new LinkedList<String>();
arr.add("a");
arr.addLast("c");
arr.addFirst("b");
arr.getFirst();
arr.getLast();
arr.removeFirst();
arr.removeLast();
arr.clear();

Lists

排序

方式一,實現Comparable接口

    public class User implements Comparable<User> {
        private Integer id;
        private String name;

        public User(Integer id, String name) {
            this.id = id;
            this.name = name;
        }

        @Override
        public int compareTo(User u) {
            return id.compareTo(u.id);
        }

        public void setId(Integer id) {
            this.id = id;
        }

        public Integer getId() {
            return id;
        }

        public void setName(String name) {
            this.name = name;
        }

        public String getName() {
            return name;
        }
    }

    List<User> users = new ArrayList<User>();
    users.add(new User(1, "小李"));
    users.add(new User(2, "小紅"));
    Collections.sort(users);

第二種,傳遞Comparator接口實現

    Collections.sort(users, new Comparator<User>() {
        @Override
        public int compare(User s, User e){
            return s.getId().compareTo(e.getId());
        }
    });

第三種,lambda表達式

    Collections.sort(users, (s, e) -> s.getId().compareTo(e.getId()));

第四種,實現類sort

    users.sort((s, e) -> s.getId().compareTo(e.getId())); 

類型轉換

List<Integer> nums = Arrays.asList(1, 2, 3);
List<String> strings = nums.stream().map(Object::toString).collect(Collectors.toList());

取交集

List<Integer> list1 = new ArrayList<>();
List<Integer> list2 = new ArrayList<>();
list1.addAll(Arrays.asList(new Integer[]{1,2,3}));
list2.addAll(Arrays.asList(new Integer[]{1,2,4}));
list1.retainAll(list2);

移動元素

Collections.reverse(list);                  // 反轉
Collections.rotate(list1, 1);               // 集合元素整體循環後移一位
Collections.shuffle(list1);                 // 重排元素

Random random = new Random(12);
Collections.shuffle(list1, random);         // 隨機重排,只會隨機一次

刪除交集元素

List<Integer> list1 = new ArrayList<>();
List<Integer> list2 = new ArrayList<>();
list1.addAll(Arrays.asList(new Integer[]{1,2,3}));
list2.addAll(Arrays.asList(new Integer[]{1,2,4}));
list1.removeAll(list2); // [3]

Sets

集合特點

Hash集合底層數據結構是散列表,所以要求元素必須不重復,避免地址對應沖突
Hash集合訪問的直接是數據地址,查詢元素最快,增刪元素也快

HashSet集合處理地址沖突的方法使用開放定址法
HashSet是無序無重復元素集合,使用方法和ArrayList類似

LinkedHashSet集合處理地址沖突的方法使用鏈地址法

Set<T> set = new HashSet<T>();                              // 快速定位,隨機排序
TreeSet<T> sortedSet = new TreeSet<T>();                    // 按照compareTo排序,操作慢
LinkedHashSet<T> linkedhashset = new LinkedHashSet<T>();    // 快速定位,按照插入順序排序,備份慢

常用方法

set.add(12); 
set.clear(); 
set.contains(0);
set.isEmpty();
set.remove(0);
set.size(); 

根據set創建list

Set<String> set = new HashSet<String>();
set.add("a");
set.add("b");

方式一
    List<String> list = new ArrayList<String>();
    list.addAll(set);

方式二
    List<String> list = set.stream().collect(Collectors.toList());

java成神之——集合框架之ArrayList,Lists,Sets