Collection 之 Set、List和Map

Set

一个不包含重复元素的collection,确切的讲,set不包含满足e1.equals(e2)的元素对e1,e2,并且最多包含一个null元素;

此实现不是同步的,如果多个线程同时访问一个set,而其中至少一个线程修改了该set,那么它必须保持外部同步,通常是通过对自然封装该set的对象执行同步操作来完成,如果不存在这样的对象,则:Collections.synchronizedSet();  

1.HashSet

集合中元素无顺序,不重复;数据结构是哈希表;

保证元素唯一性的原理:判断元素的HashCode值是否相同,若相同,还会继续判断元素的equals方法,是否为true; 当一个对象被存储进HashSet集合中后,就不能修改这个对象的那些参与计算哈希值的字段了,如果修改后就会造成内在泄漏;

2.TreeSet

可以对Set集合中的元素进行排序:

(1)让元素自身具备比较性,元素需要实现Comparable接口,覆盖compareTo方法,这种方式也成为元素的自然顺序;

(2)元素自身不具备比较性,或者具备的比较性不是所需要的,这时就需要让集合自身具备比较性。在集合初始化时就有了比较方式[定义比较器(Comparator<>接口),将它作为参数传给集合的构造函数]

以下两种方式为TreeSet需要实现的两种接口

实现Comparable接口

    class Obj implements Comparable<Obj> {
        public int compareTo(Obj o) {
            return this.name.compareTo(o.name);
        }
    }

实现Comparator接口

    class ComptorObj implements Comparator<ComptorObj> {

        @Override
        public int compare(ComptorObj o1, ComptorObj o2) {
            return o1.name.compareTo(o2.name);
        }
    }

List 

一个有序的集合,允许元素的重复;该实现不是同步的,如果多个线程访问一个List实例,而其中至少一个线程从结构上修改了表(添加或删除元素),那么它需要保持外部同步;一般通过对自然封装该列表的对象进行同步操作来完成,如:Collections.synchronizedList()来包装列表;

1.ArrayList 

List接口的大小可变数组的实现,实现了所有可选列表操作,并且允许包括null在内的所有元素,

2.LinkedList

List接口的链接列表实现,允许元素为null,实现所有可选的列表操作,还为在列表的开头及结尾get、remove、insert提供实现;

Map

存储键值对,一对一对的存储;put(K,V)方法返回K值添加之前所对应的值,若已有值则进行覆盖;

取元素原理:将Map集合转成set集合,再通过set集合的迭代器进行值的取出。

1.Hashtable

底层是哈希表数据结构,不可以存入null键null值,线程同步;

2.HashMap

底层是哈希表数据结构,允许使用null键null值,线程不同步,效率高;

3.TreeMap

底层是二叉树数据结构,线程不同步,可以用于给map集合中的键进行排序;

数据迭代:

Set<T> setInstance = Map.keySet();
Iterator<T> iterator = setInstance.iterator();
value val = Map.get(key);

将Map中所有的键存下到Set集合,因为set具备迭代器,所以可以迭代方式取出所有的键,再根据Map集合的get方法,获取每一个键对应的值。

Set<Map.Entry<K,V>> entry = Map.entrySet();

将Map集合中的映射关系取出,存入到set集合中;通过set.iterator()方法得到集合中的数据;

该方法取出的元素类型为Map.Entry<T,V>;

原文地址:https://www.cnblogs.com/a284628487/p/2986277.html