Java——集合框架

一.Collection接口是最基本的集合接口,一个Collection代表一组Object,即Collection的元素。Java不提供直接继承Collection的类,只提供继承它的子接口(例如List和Set,注意Map不是Collection的子接口)。

    List接口是一个有序的Collection,使用此接口能够精确的控制每个元素插入的位置,能够通过索引来访问List中的元素,而且允许有相同的元素。List接口存储一组不唯一,有序的对象。

    Set具有与Collection完全一样的接口,只是行为上不同,Set不保存重复的元素。Set接口存储一组唯一,无序的对象。

 

    1.ArrayList,LinkedList,Vector

    ArrayList和Vector都是使用数组方式存储数据的线性表,此数组数大于实际存储的数据以便增加和插入元素,它们都允许按序号索引元素,但是插入元素要涉及数组元素移动等操作,所以索引数据快而插入数据慢。Vector由于使用了Synchronize方法(线程安全),通常性能上较ArrayList差,而LinkedList是使用双向链表实现存储的线性表,按序号索引数据需要进行前向或后向遍历,但是插入数据时只需要记录本项的前后项即可,所以插入速度较快。Vector是线程安全的,也就是说它的方法之间是线程同步的,而ArrayList是线程不安全的,它的方法之间是线程不同步的。如果只有一个线程会访问到集合,那最好使用ArrayList,因为它不考虑线程安全,效率会高一点;如果有多个线程会访问集合,那最好是使用Vector,因为不需要我们再去考虑和编写线程安全的代码。扩容:Vector增长为原来的一倍,ArrayList增加为原来的0.5倍。

    2.HashSet

    HashSet按照hashcode值的某种运算方法进行存储,而不是直接按照hashcode值的大小进行存储。HashSet的底层结构为HashMap(HashTable)。Set里的元素是不能重复的(去重复的原理跟重写了equals()和hashCode()方法有关),换个角度就是Map的Key,再把value弄成一个固定值即可。不能重复用Iterator()方法来区分重复与否。equals()是判读两个Set是否相等。equals()方法和==方法决定引用值是否指向同一个对象,equals()在类中被覆盖,为的是当两个分离的对象的内容和类型相配的话,返回真值。

    3.HashMap,HashTable

    HashMap是HashTable的轻量级实现(非线程安全的实现),它们都完成了Map接口,主要在于HashMap允许空(null)键值(key)(只能放一个null)。由于非线程安全,效率上可能高于HashTable。HashMap把HashTable的contains方法改成了containsValue和containsKey,因为contains方法容易引起误解。HashTable继承自Dictionary类,而HashMap是Java1.2引进的Map interface的一个实现。最大的不同是,HashTable的方法是Synchronize的,而HashMap不是,在多个线程访问HashMap时,不需要为它的方法实现同步,而HashMap就必须为之提供外同步。HashTable和HashMap的hash/rehash算法都大概一样,所以性能不会有很大的差异。HashMap基于Hash数组实现,若Key的hash值相同则使用链表方式进行保存。HashMap中还存在一个内部类Entry,用于链表的存储。它是一个节点,持有下一个元素的引用,这样就构成了一个链表。

    4.List,Set,Map

    List和Set都是存储单列数据的集合,所以它们有一个共同的父借口Collection。

    Set里面不允许有重复的元素(有A,插入B,equals相等则B存不进去,Set集合有一个boolean的返回值,当集合没有某个元素时,add方法可成功加入该元素,返回值为true,否则返回false)。所以Set取值时,没法说取第几个,只能以Iterator接口取得所有元素,再逐一遍历各个元素。

    List表示有先后顺序的集合并且允许重复。有时可以插队,调用add(int index,Obj e)方法,可以指定当前对象在集合中的存储位置。一个对象可以反复存储进List中,并不是把这个对象存储进了集合中,而是在集合变量中用一个索引变量指向对象,当这个对象被add多次时,相当于有多个索引指向该对象。List除了可以Iterator接口获取所有的元素再逐一遍历各个元素外,还可以调用get(index i)来明确说取第几个。

    Map是存储键和值这样的双列数据的集合,存储的数据没有顺序,其键是不能重复的,它的值可以有重复的。它有put方法,每次存储时,要存储一对key/value,不能存储重复的key,规则也是按equals比较相等。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值