java三大集合总结(List、Set、Map)
当前还未总结完毕,后期会持续更新,若有不当之处请评论指出,互相学习。
集合具体实现类 | ArrayList | LinkedList | Vector | HashSet | TreeSet | HashTable | HashMap | TreeMap |
是否有序 | 有序 | 有序 | 有序 | 无序(底层并非真正的无序,遵循Hash算法来保证数据的存储,但是我们作为使用者,就理解为无序) | 可自然排序或实现Comparable接口定制排序 | 取出时有散列顺序,无排序 | 无序 | 自动排序 |
线程安全 | 非安全 | 非安全 | 安全 | 非安全 | 非安全 | 安全 | 非安全 | 非安全 |
元素可否为null | 允许 | 允许 | 允许 | 允许 | 不允许 | 键值都不允许 | 键值都允许 | 键允许,值不允许 |
元素是否可重复 | 可重复 | 可重复 | 可重复 | 不可重复 | 不可重复 | 键不可重复,值可重复 | 键不可重复,值可重复 | 键不可重复,值可重复 |
操作效率 | 查询快,增删慢 | 查询慢,增删快 | 查询快,增删慢 | 存取速度快 | 性能比HashSet稍差 | 效率比HashMap低 | 通过哈希表内部映射关系快速查找 | 在添加、删除和定位映射关系性能比HashMap稍差 |
底层、实现 | 数组 | 链表 | 数组 | 使用了哈希表实现。 HashSet是通过HashMap实现的,只不过Set用的只是Map的key。 | 使用二叉树实现,SortedSet接口的唯一实现类。 TreeSet是通过TreeMap实现的,只不过Set用的只是Map的key。 | 基于Dictionary类。 哈希表(HashTable)又叫做散列表,是根据关键码值(即键值对)而直接访问的数据结构。映射函数就叫做散列(哈希)函数,存放记录的数组叫做散列表。 方法中都加入了Synchronize,所以即使多线程也安全。 | 存储方式是一个数组结构,数组中的每一项又是一个链表。 存入的键值对在取出的时候是随机的,它根据键的HashCode值存储数据,根据键可以直接获取它的值,具有很快的访问速度。 在Map中插入、删除和定位元素,HashMap 是最好的选择。 LinkedHashMap是HashMap的一个子类,如果需要输出的顺序和输入的相同,那么用LinkedHashMap可以实现,它还可以按读取顺序来排列,像连接池中可以应用。 方法中都没有Synchronize,所以多线程时不安全。 | 实现了SortedMap接口,映射关系有一定的顺序。二叉树。 TreeMap取出来的是排序后的键值对。但如果要按自然顺序或自定义顺序遍历键,那么TreeMap会更好。 |
遍历 | for循环 | Set<String> set = new HashSet<>(); set.add("value1"); set.add("value2"); //遍历方法一,迭代器 Iterator iterator = setExample.iterator(); while (iterator.hasNext()) { String value = iterator.next(); } // 遍历方法二 for (String value : set) { System.out.println(value); } | Map<String, String> map = new HashMap<String, String>(); map.put("1", "value1"); map.put("2", "value2"); // 遍历方法一 for (String key : map.keySet()) { String value = map.get(key); } // 遍历方法二 Iterator<Map.Entry<String, String>> it = map.entrySet().iterator(); while (it.hasNext()) { Map.Entry<String, String> entry = it.next(); String key = entry.getKey(); String value = entry.getValue(); } // 遍历方法三 for (Map.Entry<String, String> entry : map.entrySet()) { String key = entry.getKey(); String value = entry.getValue(); } | |||||
添加元素函数 | .add(元素); --加在集合最后。 .add(数字,元素); --加载指定的位置。 .addAll(另一个集合名); --加在最后。 .addAll(数字,另一个集合名); --加载指定位置。 | .add(元素); --添加指定元素(之前集合不过包含的) | .put(键,值); --在此映射中关联指定值与指定键,若该键已经存在,则新元素会替换原来的元素 | |||||
删除元素函数 | .remove(数字); --移去指定位置的元素 .remove(元素); --移去集合中第一次出现的指定元素(如果存在) .removeALL(另一个集合名); --移去另一个集合中的所有元素 .retaintALL(另一个集合名); --仅保留另一个集合中的所有元素 .clear(); --清空集合 | .remove(元素); --移去指定的元素 .clear(); --清空集合 | .remove(键); --从映射中移除指定键的映射关系(如果存在) | |||||
其他函数 | .get(数字); --获得指定位置的元素 .contains(元素); --判断集合是否包含该元素,是则返回true .contains(另一个集合名); --判断是否包含另一个集合的所有元素 .indexOf(元素); --返回该元素的索引,无则返回-1 .equals(元素); --判断该元素是否与集合的元素一致 返回true或false .set(数字,元素); --用该元素替换指定位置的元素 .size(); --获取集合的大小 | .containts(元素); --如果集合包含此元素,返回true .size(); --获得集合的大小 | .containsKey(键); --如果此映射包含对于指定键的映射关系,返回true .containsValue(值); --如果此映射将一个或多个键映射到指定值,返回true .size(); --获得集合的大小 | |||||
参考地址 | HashTable和HashMap的区别详解 https://www.cnblogs.com/williamjie/p/9099141.html |