一、分类:大类型主要分为以下两种类型)Collection:一个独立要素序列,这些要素均遵循一个或多个规则: List必须按插入顺序保存元素,并且set不能有重复的元素。 Queue根据队列规则确定对象生成的顺序。 通常与插入的顺序相同。
2)Map:对中的“键-值对”对象。 可以使用键搜索值。
细分如下:
| collection 3358 www.Sina.com/http://www.Sina.com/http://www.Sina.com/3358 www.Sina.com http://www.Sina.com/http://www.Sina.com/3358 www.Sina.com/3358 ww.Sina.com
Collection是最基本的集合接口,一个Collection表示一系列对象,即Collection的元素(Elements )。 有些Collection允许相同的元素,其他元素不允许。 有些可以排序,有些不能。 Java SDK不提供直接从Collection继承的类。 Java SDK提供的类是从Collection (如List和Set )继承的“子接口”。
主要方法:将对象添加到布尔添加(对象)集合布尔移动(对象)删除指定对象int size )是当前集合中元素的数量布尔连接搜索集合中是否存在指定的对象。判断集合是否为空的Iterator iterator ()返回迭代器booleancontainsall (collection c ), 集合c中的元素布尔追加(Booleanaddall ) collectionc )确定是否将集合c中的所有元素添加到该集合void clear中,并删除集合中的所有元素删除元素void retain all (从集合c集合中删除集合c中不包含的元素1,List接口
实现List接口的一般类是链接列表、ArrayList、Vector和堆栈。
| List
LinkedList、ArrayList都实现了List接口,都是异步的,线程不安全,元素有序,可重复
| --LinkedList
基于链表的数据结构允许空元素,并比ArrayList更有效地添加、删除和修改元素。
此外,链接列表还在链接列表的开头或结尾提供其他get、remove和insert方法。 通过这些操作,链接的列表可以用作堆栈、队列或双向队列。
| --ArrayList如果多个线程同时访问一个List,则必须自己进行访问同步。 一种解决方法是在创建列表时构建同步的列表。 列表列表=collections.synchronized list (new linked list (…) );
| --Vector
基于数组的数据结构、异步、线程不安全,查询(获取集)效率高。
size、isEmpty、get和set方法的执行时间是常量。 但是,add方法的开销是分配的常数,追加n个要素需要o(n )的时间。 其他方法的执行时间是线性的。 每个ArrayList实例都有一个“容量”(Capacity ),它是用于存储元素的数组的大小。 添加新元素时,此容量会自动增加,但没有定义增长算法。 如果需要插入大量元素,可以在插入之前调用ensureCapacity方法来增加ArrayList的容量以提高插入效率。
一般用这两个就可以了,但因为是异步的,所以效率很高。| Stack
对于需要快速插入,删除元素,应该使用LinkedList,如果需要快速随机访问元素,应该使用ArrayList。
___________________________________________________________________________________________________
Array和ArrayList的区别及各自适用的场景
Array是数组,ArrayList是Array的加强版。
(1)array可以保存基本类型和对象类型,arrayList只能保存对象类型
(2)array数组的大小是固定的不能更改,而ArrayList的大小可以改变
(3)Array数组在存放的时候一定是同种类型的元素。ArrayList就不一定了,因为ArrayList可以存储Object。
(4)ArrayList有更加丰富的方法如addAll()、removeAll()、iterator()
适用场景:
如果想要保存一些在整个程序运行期间都会存在而且不变的数据,我们可以将它们放进一个全局数组里,但是如果我们单纯只是想要以数组的形式保存数据,而不对数据进行增加等操作,只是方便我们进行查找的话,那么,我们就选择ArrayList。而且还有一个地方是必须知道的,就是如果我们需要对元素进行频繁的移动或删除,或者是处理的是超大量的数据,那么,使用ArrayList就真的不是一个好的选择,因为它的效率很低,使用数组进行这样的动作就很麻烦,那么,我们可以考虑选择LinkedList。
________________________________________________________________________________________________
3)Vector类
Vector非常类似ArrayList,但是Vector是同步的。由Vector创建的Iterator,虽然和ArrayList创建的 Iterator是同一接口,但是,因为Vector是同步的,当一个 Iterator被创建而且正在被使用,另一个线程改变了Vector的状态(例 如,添加或删除了一些元素),这时调用Iterator的方法时将抛出 ConcurrentModificationException,因此必须捕获该 异常。
4)Stack 类
Stack继承自Vector,实现一个后进先出的堆栈。Stack提供5个额外的方法使得Vector得以被当作堆栈使用。基本的push和pop方 法,还有 peek方法得到栈顶的元素,empty方法测试堆栈是否为空,search方法检测一个元素在堆栈中的位置。Stack刚创建后是空栈。
2、Set接口
Set容器类主要有HashSet和TreeSet等。
共同点:元素不重复
实现了Java.util.Set接口。
1)HashSet类
-> 不保证集合中元素的顺序
->允许包含值为null的元素,但最多只能有一个null元素。
2)TreeSet
TreeSet描述的是Set的一种变体——可以实现排序等功能的集合,它在讲对象元素添加到集合中时会自动按照某种比较规则将其插入到有序的对象序列中,并保证该集合元素组成的读uixiangxulie时刻按照“升序”排列。
Map没有继承Collection接口,Map提供key到value的映射。一个Map中不能包含相同的key,每个key只能映射一个 value。Map接口提供3种集合的视图,Map的内容可以被当作一组key集合,一组value集合,或者一组key-value映射。
主要方法:boolean equals(Object o)比较对象boolean remove(Object o)删除一个对象put(Object key,Object value)添加key和valueHashtable类HashTable和HashMap区别
第一、继承不同。
public class Hashtable extends Dictionary implements Map
public class HashMap extends AbstractMap implements Map
第二、Hashtable 中的方法是同步的,而HashMap中的方法在缺省情况下是非同步的。在多线程并发的环境下,可以直接使用Hashtable,但是要使用HashMap的话就要自己增加同步处理了。
第三、Hashtable中,key和value都不允许出现null值。在HashMap中,null可以作为键,这样的键只有一个;可以有一个或多个键所对应的值为null。当get()方法返回null值时,即可以表示 HashMap中没有该键,也可以表示该键所对应的值为null。因此,在HashMap中不能由get()方法来判断HashMap中是否存在某个键, 而应该用containsKey()方法来判断。
第四、两个遍历方式的内部实现上不同。Hashtable、HashMap都使用了 Iterator。而由于历史原因,Hashtable还使用了Enumeration的方式 。
第五、哈希值的使用不同,HashTable直接使用对象的hashCode。而HashMap重新计算hash值。
3、WeakHashMap类
WeakHashMap是一种改进的HashMap,它对key实行“弱引用”,如果一个key不再被外部所引用,那么该key可以被GC回收。