Java集合框架位于Java.util包下面,下面是jdk util包结构图
大致上可以分为五个部分:包含list列表,set集合,map映射,iterator迭代器,还有工具类(对集合的操作)
从集合结构图来看大致分为两种 Collection 和 Map 两大顶级接口
Collection
Collection 实现了Iterable<E> 接口 可以对其进行遍历,用来提供一个Iterator 迭代器,进行集合的迭代。
collection中常用的有分为三大接口类 list列表 , set集合 ,queue队列
List<T>
常用的的有ArrayList,LinkedList,Vector
1 ArrayList :
优点: 有序,遍历快,底层是数组实现,可以与数组自由转换,动态增长等优点。
缺点:底层是数组实现,一旦长度确定不可以在实现插入元素,否则抛出越界异常,多线程下不安全。
1,通过collection 提供的迭代器Iterator 进行迭代 + (for ,while ) 循环
2 LinedList
相比ArrayList多实现了队列接口Queue<E>,Deque<E>, 除去RandomAccess接口
相比ArrayListt添加了一些增加删除的常用方法等(这里只列举了一部分方法)
Set
1 HashSet
通过hash算法来计算元素存储的位置,从而实现元素不重复(实际上是HashMap的Key)
JDK源码
特点:无序,不重复,可以为null , 线程不安全
2 LinkedHashSet
可预知迭代顺序的 Set 接口的哈希表和链接列表实现。此实现与 HashSet 的不同之外在于,后者维护着一个运行于所有条目的双重链接列表。此链接列表定义了迭代顺序,即按照将元素插入到 set 中的顺序(插入顺序)进行迭代。注意,插入顺序不 受在 set 中重新插入的 元素的影响。(如果在 s.contains(e) 返回 true 后立即调用 s.add(e),则元素 e 会被重新插入到 set s 中。)
JDK描述难以理解,其实说白了就是 “”继承与HashSet、又基于LinkedHashMap来实现的,重复覆盖“”
特点:有序,不重复,线程不安全
3 TreeSet
特点:有序(默认是按照升序排序),不重复,不可以为null,线程不安全
根据其元素的自然顺序进行排序 |
Map
1 HashMap
特点:线程不安全,无序,key只能一次为Null value,遍历效率高(根据key获取值,当容量大的时候,效率比较低), 适合插入定位查找元素;
通过下面方法获取set 对象 获取 key , 遍历key 获取 value
entrySet , keySet 获取 set 集合(key)
2 LinedHashMap
特点:有序,key不重复,线程不安全,效率(根据数据量大小,与实际数据有关,跟容量无关)
3 HashTable
4 TreeMap
默认是自然排序,也可以进行自定义排序
构造方法:
public class TreeMapTest {
private static TreeMap<String, String> treeMap = null;
public static <T> void main(String[] args) {
// 自然排序,pojo需要实现Comparable接口,调用compareTo方法进行比较
//数组的.sort() 以及collections.sort()方法都是自然排序
//调用集合元素的compareTo方法来比较元素的大小关系,然后将集合元素按照升序排列(从小到大)
defaultTest();
//自定义排序,实现compartor接口
initByComparator();
}
public static void initByComparator() {
System.out.println("------------------- comparetor 自定义排序 --------------------------");
treeMap = new TreeMap<>(new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
return o1.compareTo(o2);
}
});
initTreeMap();
treeMap.forEach((k, v) -> {
System.out.println("k = " + k + " v = " + v);
});
}
// initTreeMap
public static TreeMap<String, String> initTreeMap() {
treeMap = new TreeMap<String, String>();
treeMap.put("sjh1", "1");
treeMap.put("sj3", "2");
treeMap.put("sjhs2123", "2");
treeMap.put("sjs213", "3");
treeMap.put("6", "4");
treeMap.put("sjhd", "5");
treeMap.put("世界级", "6");
treeMap.put("是的", "7");
return treeMap;
}
public static void defaultTest() {
System.out.println("------------------------ 默认自然排序 ----------------------");
initTreeMap();
treeMap.forEach((k, v) -> {
System.out.println("k = " + k + " v = " + v);
});
}
}
总结:
linked***** 双向链表,有序,适合增删操作(个别除外,如 LinkedTreeSet)
一 般情况下,我们用的最多的是HashMap,在Map 中插入、删除和定位元素,HashMap 是最好的选择。
如果您要按自然顺序或自定义顺序遍历键,那么TreeMap会更好。
以上类列举常用方法,还有从父类或者接口继承,更多查看JDK即可!
菜鸟一枚,如有错误请指出!