list、set、map集合的详细区别

一、list、set

list、set、map集合的详细区别

list、set的父类是collection,collection的父类是Iterator

List:有序可重复集合

①、List list1 = new ArrayList();

    底层数据结构是数组,查询快,增删慢;线程不安全,效率高

   ②、List list2 = new Vector();

    底层数据结构是数组,查询快,增删慢;线程安全,效率低,几乎已经淘汰了这个集合

   ③、List list3 = new LinkedList();

    底层数据结构是链表,查询慢,增删快;线程不安全,效率高

Set:查看HashSet的源码,HashSet集合就是HashMap的key组成

  • HashSet:不能保证元素的顺序;不可重复;不是线程安全的;集合元素可以为 NULL;其底层是一个数组,加快查询效率,index = hash(value);

对于 HashSet: 如果两个对象通过 equals() 方法返回 true,这两个对象的 hashCode 值也应该相同;如果 hashCode 值相同,那么会继续判断该元素和集合对象的 equals() 作比较

hashCode 相同,equals 为 true,则视为同一个对象,不保存在 hashSet()中

hashCode 相同,equals 为 false,则存储在之前对象同槽位的链表上。

  • Set linkedHashSet = new LinkedHashSet(); 不可重复有序集合,不是线程安全的

因为底层采用 链表 和 哈希表的算法。链表保证元素的添加顺序,哈希表保证元素的唯一性

  • Set treeSet = new TreeSet();不可重复有序集合,不是线程安全的

底层使用红黑树算法,擅长于范围查询

如果使用 TreeSet() 无参数的构造器创建一个 TreeSet 对象, 则要求放入其中的元素的类必须实现 Comparable 接口所以, 在其中不能放入 null 元素;必须放入同样类的对象.(默认会进行排序) 否则可能会发生类型转换异常.我们可以使用泛型来进行限制

​​​​​​​二、map

map两个集合之间 的映射关系,key-value键值对的形式,Map没有实现Collection接口

1、通过 map.values() 方法得到 Map 中的 value 集合

Collection<Object> value = hashMap.values();

2、通过 map.keySet() 得到 Map 的key 的集合,然后 通过 get(key) 得到 Value

Set<String> set = hashMap.keySet();

3、通过 Map.entrySet() 得到 Map 的 Entry集合,然后遍历

    Set<Map.Entry<String, Object>> entrys = hashMap.entrySet();

    for(Map.Entry<String, Object> entry: entrys){

        String key = entry.getKey();

        Object value2 = entry.getValue();

        System.out.println(key+"="+value2);

    }

 

Map实现类

说明

HashMap

采用Hash表算法,Map中的key不保证添加的先后顺序,key也不允许重复,判断key重复的条件是equals为true并且HashCode值相等

LinkedHashMap

采用链表和Hash算法,Map中的key会按照自然顺序进行排序,key不允许重复,key的重复的判断标准和HashMap

TreeMap

采用红黑树算法,Map中的key会按照自然顺序或定制排序进行排序,key不允许重复,判断key重复的条件是compareTo或者compare的返回值是否为0

Hashtable

采用Hash算法,是HashMap的前身(类似于Vector是ArrayList的前身),是继承Dictionary类然后再实现Map,线程安全的,性能比较低,已经弃用

Propertise

HashTable的子类,要求key和value都是String类型,用来加载资源文件(propertise文件)