整理之Java容器

主要参考:JAVA常见容器

Set,List,Map,Vector,ArrayList的区别

Java所有容器见下图:

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使用)。

原文地址:https://www.cnblogs.com/lizhenxin/p/12449471.html