深入理解Java中的List、Set与Map集合

list 和set 有共同的父类Collection ,set中不能有相同的元素 list中可以;
map :使用键值对的方式来储存数据 键不能有重复的 值可以有;

1 List 、Set、 Map都有哪些子类:

CollectionList
│├LinkedList
│├ArrayList
│└Vector
│ └StackSet
 |-HashSetTreeSet        
MapHashtableHashMapWeakHashMap

需要注意的是:Map没有继承Collection接口。

2 List

2.1 LinkedList

1 LinkedList实现了List接口,允许null元素。

2 LinkedList提供额外的list.getLast()、list.getFirst(),list.removeFirst()、ist.removeLast()、 list.remove(index)、list.addLast()、list.addFirst()方法,可以在 LinkedList的首部或尾部操作,这些操作使LinkedList可被用作堆栈(stack),队列(queue)或双向队列(deque)。

3 遍历获取 O(n);直接尾部添加,复杂度O(1); 指定位置O(n)。

4 LinkedList线程不安全。

List list = Collections.synchronizedList(new LinkedList());

特点:寻址困难,插入和删除容易。

2.2 ArrayList

1 ArrayList 是动态数组的数据结构实现。

2 ArrayList没有同步,CopyOnWriteArrayList。

3 get()根据下标直接查询,复杂度O(1);add(E)直接尾部添加复杂度O(1);add(index, E)插入位置后面的元素需要后移,复杂度为O(n);remove(E)需要前移,复杂度O(n);

特点是:寻址容易,插入和删除困难;

2.3 Vector

Vector非常类似ArrayList,但是Vector是同步的。

2.4 Stack

Stack继承自Vector,实现一个后进先出的堆栈。Stack提供5个额外的方法使得 Vector得以被当作堆栈使用。基本的push和pop 方法,还有peek方法得到栈顶的元素,empty方法测试堆栈是否为空,search方法检测一个元素在堆栈中的位置。Stack刚创建后是空栈。

3 Set

3.1 HashSet

1 它不允许出现重复元素;

2 不保证集合中元素的顺序;

3 允许包含值为null的元素,但最多只能有一个null元素。

4 HashSet的实现是不同步的。

3.2 TreeSet

1 TreeSet类实现 Set 接口,该接口由 TreeMap 实例支持。此类保证排序后的 set 按照升序排列元素,根据使用的构造方法不同,可能会按照元素的自然顺序 进行排序,或按照在创建 set 时所提供的比较器进行排序。TreeSet描述的是Set的一种变体——可以实现排序等功能的集合,它在将对象元素添加到集合中时会自动按照某种比较规则将其插入到有序的对象序列中.

4 Map

https://blog.csdn.net/zs18753479279/article/details/119277282

4.1 Map的遍历方式

方式一 通过Map.keySet使用iterator遍历

public static void main(String[] args) {
    
    
        Map<Integer, String> map = new HashMap<>();
        map.put(001, "Java");
        map.put(002, "数据库");
        map.put(003, "Vue");

        Iterator<Integer> iterator = map.keySet().iterator();
        while (iterator.hasNext()) {
    
    
            Integer key = iterator.next();
            String value = map.get(key);
            System.out.println(key + ": " + value);
        }
    }

1: Java
2: 数据库
3: Vue

方式二 通过Map.entrySet使用iterator遍历

    public static void main(String[] args) {
    
    
        Map<Integer, String> map = new HashMap<>();
        map.put(001, "Java");
        map.put(002, "数据库");
        map.put(003, "Vue");

        Iterator<Map.Entry<Integer, String>> iterator = map.entrySet().iterator();
        while (iterator.hasNext()) {
    
    
            Map.Entry<Integer, String> entry = iterator.next();
            System.out.println(entry);
            System.out.println(entry.getKey() + ": " + entry.getValue());
        }
    }

1=Java
1: Java
2=数据库
2: 数据库
3=Vue
3: Vue

方式三 使用lambda表达式forEach遍历

 public static void main(String[] args) {
    
    
        Map<Integer, String> map = new HashMap<>();
        map.put(001, "Java");
        map.put(002, "数据库");
        map.put(003, "Vue");
        map.forEach((k, v) -> System.out.println(k + ": " + v));
    }
1: Java
2: 数据库
3: Vue

猜你喜欢

转载自blog.csdn.net/zs18753479279/article/details/119873164