list、set、map集合的详细区别
一、list、set
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文件) |