主要参考:JAVA常见容器
Set,List,Map,Vector,ArrayList的区别
Java所有容器见下图:
数组
int[] t = new int[10]; //声明并创建长度为10的数组,用默认值占位,String默认值为null
int[] t = new int[] {1, 2, 3}; //声明并创建数据同时初始化初值
int[] t = {1, 2, 3}; //同楼上
//数组的长度都是不可变的
List
list是有序的集合,内容也可以重复
- ArrayList是采用数组实现的list,所以利于随机查找和修改,不利于增加和删除。
- LinkedList是采用循环双链表实现的list,所以利于在插入和删除,不利于随机查找和修改。而且由于需要存储节点,LinkedList占用空间较大
- Vector与ArrayList的唯一区别是Vector是线程安全、同步、效率低,ArrayLisy相反
- Stack类继承于Vector,实现一个栈,提供push、pop、peek(不出栈的pop)、search、empty等方法
list的子类都继承了iterator方法以供遍历:
ArrayList<Integer> al = new ArrayList<>();
Iterator<Integer> it = al.iterator();
while (it.hasNext()) {
System.out.println(it.next());
}
此外List还提供ListIterator方法,允许增加、删除、修改和向前向后移动,使用方法同Iterator。
ArratList和Vector的默认容量为10, 最大容量是Integer.MAX_VALUE - 8。】
ArrayList采用1.5倍扩容,Vector采用2倍扩容如果扩容后仍不够用,则直接扩容到所需的大小。
Map
1.HashMap与HashTable
HashMap与HashTable类似于ArrayList与Vector,实现原理相同,但是前者非线程安全非同步,效率高;后者相反。
Map的key是不可重复的
Map的常用Api:
HashMap<Integer, String> hm = new HashMap();
hm.put(1, "英语");
hm.put(2, "语文");
hm.put(3, "数学");
hm.replace(1, "化学"); //将key=1的value替换
Boolean i = hm.replace(1, "英语", "化学"); //如果key=1的value=英语则替换为化学,否则不替换
hm.remove(1); //这一对函数的原理同replace
Boolean i = hm.remove(1, "英");
Set<Entry<K, V>> entrySet = hm.entrySet(); //Map的实际元素就是Entry
hm.getOrDefault(Object key, String defValue);//取出key对应的value,如果没有则返回默认值defValue
hm.putIfAbsent(Object key, String defValue);//插入键值对.如果key不存在则
HashMap内部采用Hash算法进行排序,HashMap默认容量为16,容量为2^n,加载因子为0.75(已有元素超过总容量的75%是扩容),如:
HashMap<Integer, String> hm = new HashMap();
hm.put(15, "数学"); //15
hm.put(19, "英语"); //4
hm.put(72, "语文"); //8
for (Map.Entry<Integer, String> e : hm.entrySet()) {
System.out.println(e.getKey() + " " + e.getValue());
}
//上面输出为:
//19 英语
//72 语文
//15 数学
HashTable默认容量为11,加载因子为0.75,扩容方式为:2*原容量+1
2.LinkedHashMap
LinkedHashMap继承了HashMap。但是与HashMap不同的是:LinkedHashMap插入元素和取出元素的顺序是一致的,因为其内部维持了一个双向链表,用于记录迭代顺序。
LinkedHashMap扩容机制同HashMap
3.TreeMap
TreeMap同样有序,但是TreeMap是按照字典顺序升序排列key(数字0-9,字母a-z)。如:
TreeMap<String, String> tm = new TreeMap<>();
tm.put("aircrew", "英语");
tm.put("aircraft", "数学");
tm.put("rabbit", "语文");
tm.put("airdrome", "语文");
for (Map.Entry<String, String> e : tm.entrySet()) {
System.out.println(e.getKey() + " " + e.getValue());
}
//以上输出为:
//aircraft 数学
//aircrew 英语
//airdrome 语文
//rabbit 语文
TreeMap由红黑树算法实现,无容量限制
Set
Set内部元素是无序、确定、单一的。Set比较元素是否相同使用equals而不是==。
Set的主要子类有HashSet、LinkedHashSet和TreeSet,其关系与Map的三个子类相同。
HashSet用HashMap来实现,其内部实例化一个HashMap用于存储数据,但只用到了key,value用一个Object()代替。
所以在排序和扩容方面,HashSet和HashMap完全相同。
Queue
除了以上三大类数据结构外,Java还提供了队列的接口Queue(LinkedList实现了其子接口Deque,可以当做Queue使用)。