java提供了大量持有对象的方式:数组是保存一组对象的最有效的方式,但是数组有固定的尺寸,很多实际情况并不能满足。因此提供容器来解决对象存放问题。有四种容器:Map,List ,Set,Queue.使用容器时可以使用泛型来规定保存对象的类型,可以在编译期防止将错误的类型对象保存在容器中,并且在从容器中获取元素时,不必进行类型转换。
Collection :一个独立元素的序列,这些元素符合一条或者多条规则。例如Map List Set Queue 。所有继承自Collection的都可以用foreach进行遍历。在collection中添加一组元素时,Arrays.asList()方法接受一个数组或者是一个用逗号分隔的元素列表,并且将它转换为List对象。Collections.addAll()接受一个Collection对象,以及一个数组或者是逗号分隔的列表,将元素添加到Collection中。使用Arrays.toString()来打印数组。如果实现Collection就必须实现iterator()。
iterator:迭代器是用于遍历并选择序列中的对象,只能单向运动。
Iterator<String>it=list.iterator();
while(it.hasNext()) {
System.out.println(it.next());
}
容器返回一个iterator,iterator将返回序列的第一个元素。
hasNext()检查序列中是否还有元素,next()获取序列中的下一个元素。
listIterator是一个更加强大的iterator子类型,它只能用于各种list类的访问,listIterator可以双向移动。它还可以产生相对于迭代器在列表中的当前位置的前一个和后一个元素对的索引,并且可以使用set()方法替换它访问过的最后一个元素。
LIst:
Arraylist:用于随机访问元素,但在List中插入和移除元素时比较慢,无序的。
LinkedList:用于在List中插入和删除元素,查询比较慢,有序的。
list通过add()和get()方法进行插入和获取元素。
通过remove() 进行删除元素。
contains():用来确定某个对象是否在列表中
indexof():返回对象在LIst中所处位置的索引编号。
subList():用于在列表中截取一个片段,截取前包含后不包含。
isEmpty():判断是否为空
toArray():将collection转换为一个数组
replace:用来替换指定索引处的元素。
LinkedList中添加了使其用作栈,队列,双向队列的方法。getFirst()和element一样都是返回列表的第一个元素,但是并不移除它,如果list为空,则抛出NoSuchElement-Exception,peek()在列表为空时返回null;
RemoveFirst()和remove一样移除并返回列表的头,在列表为空时抛出NosuchElementException,poll在列表为空时返回null;
addFirst()和add 和addlast一样,将某个元素插入列表的尾部。
removeLast:移除并返回列表的最后一个元素。
Stack:栈是“先进后出”的容器。LinkedLIst能够实现栈的所有功能,因此可以直接使用LinkedList作为栈使用。
Set:
Set不保存重复元素,set经常用于查询某个元素在set中,通常选择hashSet的实现。hashSet使用了散列存储,treeSet采用红黑树数据结构存储。TreeSet是有序的。
Map:
map以key-value键值对的方式存储数据。可以用containsKey()和containsValue()来判断map中是否包含某个键或者值。
keySet()方法产生了所有键组成的set,通常用foreach来遍历该map; key值不能重复,value值可以重复。hashmap最多有一条key为空,线程不安全的。Hashtable与HashMap类似,是HashMap的线程安全版,它支持线程的同步,即任一时刻只有一个线程能写Hashtable,因此也导致了Hashtale在写入时会比较慢,它继承自Dictionary类,不同的是它不允许记录的键或者值为null,同时效率较低。TreeMap实现SortMap接口,能够把它保存的记录根据键排序,默认是按键值的升序排序(自然顺序),也可以指定排序的比较器,当用Iterator遍历TreeMap时,得到的记录是排过序的。不允许key值为空,非同步的;
ArrayList 和Vector是采用数组方式存储数据,此数组元素数大于实际存储的数据以便增加和插入元素,都允许直接序号索引元素,但是插入数据要涉及到数组元素移动等内存操作,所以索引数据快,插入数据慢,Vector由于使用了synchronized方法(线程安全)所以性能上比ArrayList要差,LinkedList使用双向链表实现存储,按序号索引数据需要进行向前或向后遍历,但是插入数据时只需要记录本项的前后项即可,所以插入数度较快。
HashTable与HashMap
1、同步性:Hashtable是线程安全的,也就是说是同步的,而HashMap是线程序不安全的,不是同步的。
2、HashMap允许存在一个为null的key,多个为null的value 。
3、hashtable的key和value都不允许为null。
map和collection之间唯一的重叠就是Map可以使用entrySet()和values方法产生collection。
HashMap HashSet :
他们的底层数据结构的实现是:维护了一张 HashTable 。容器中的元素全部存储在Hashtable 中。他们再添加元素的时候,是如何判断是否存在有重复元素的呢? 每一个被添加的元素都有一个 hashCode(哈希值),他们先比较哈希值,是否相同? 不相同的元素,添加进入 HashTable. 如果hashCode相同的话, 再去比较 equals()方法,如果也相同的话,JVM就认为数据已经存在了,就不会添加数据!
TreeMap TreeSet
他们底层是数据结构的实现是:维护了一棵二叉树。 容器中添加元素的时候,他们有是怎么判断是否有相同元素的?我们知道 TreeMap TreeSet 都是有序的存储数据。 为了维护数据的唯一性。 再存入数据的时候,他们会调用元素中实现的 Comparable 的 compareTo() 方法。 或者 集合本身创建的时候 传入了 迭代器。
Queue:
队列是先进先出的容器,队列经常被当做一种可靠的将对象从程序的某个区域传输到另一个区域的途径。linkedList提供了支持队列的行为,并且实现了Queue接口LinkedLIst经常作为Queue的一种实现。
offer():将一个元素插入到队尾,或者返回false
peek()和element()都在不移除的情况下但会对头,peek在队列尾为时返回null,element会抛出NoSuchelementException异常
pool()和remove()都将移除并返回队头,poll在队列为空时返回null;remov()会抛出NoSuchelementException异常。
PriorityQueue:声明队列的优先级。PriorityQueue的逻辑结构是一棵完全二叉树,存储结构其实是一个数组。