框架集合概念,分类及应用


集合的基本概念

集合:保存多个其他对象的对象,不能保存简单类型。Collection框架结构如下:

Collection

|--List

|--|--LinkedList

|--|--ArrayList

|--|--Vector

| |--Stack

|--Set


Map

|--HashMap

|--Hashtable

|--WeakHashMap

Collection是最基本的集合接口,一个Collection代表一组Object,即Collection的元素(Elements)。

Map提供key到value的映射。

List:有序(存放元素的顺序),可重复的集合。

ArrayList:实质就是一个会自动增长的数组。查询效率较高,增删效率比较低,适用于查询比较频繁,增删动作较少的元素管理的集合。加载大批量的数据时,先进性手动扩容(就是调用ensureCapacity(int minCapacity)方法),这样可以提高效率。

LinkedList:底层是用双向循环链表来实现的,查询效率较低,但是增删效率很高,适用于增删动作比较频繁,查询次数较少的元素管理集合。

Set:无序的,不允许有重复元素的集合

HashSet:Object中的hashCode()的方法是所有类都会继承的方法,这个方法会计算出一个hash码值去和数组长度取模,对象的模值相同时才会判断数组中的元素和要加入的对象的内容是否相同,如果不同才回再找位置添加进去,相同则不允许添加。如果数组中的元素和要加入的对象的hashCode()返回了相同的hash码,才会用equals方法判断两个对象的内容是否相同。

注意:要存入hashset的集合对象中自定义类必须覆盖hashCode(), equals()两个方法,才能保证元素集合中元素不重复。

TreeSet:可排序的Set。SortedSet接口是Set的子接口,TreeSet是SortedSet接口的实现类,他可以对集合中的元素进行排序。将自定义的对象放入TreeSet中,这个类需要实现Comparable接口,TreeSet可以自动过滤掉重复元素,所以不需要重载hashCode()方法,TreeSet会根据比较规则判断元素内容是否相同,不同则会存入,TreeSet会在元素存入时就进行排序。

map:存放key-value对(有关系的两个对象,一个当key一个当value,同时存入)。

HashMap:基于哈希表的Map接口实现,此实现提供所有可选的映射操作,并允许使用null键和null值。

遍历

先用keySet()得到key的set集合,在迭代遍历key的set集合根据key得到value。

Hashtable:同HashMap。

HashMap和Hashtable的区别

HashMap:JDK1.2之后推出,是新的类。才用异步处理方式,性能较高,但是属于非线程安全。允许设置null.

Hashtable:JDK1.0时推出,是旧的类。才用同步处理方式,性能较低,但是属于非线程安全。不允许设置null.

二者最大的不同是,Hashtable的方法是Synchronize的而HashMap不是,在多线程访问Hashtable时,不需要自己为它的方法实现同步,而HashMap就必须为之提供外同步。


SortedMap接口:Map的子接口,按某一特定排序规则来存放所加入的键值对。实现类有TreeMap类。Key值的排序规则,同SortedSet接口实现类TreeSet。

注意:key一般是8种基本类型的封装类或是String类,拿自己定义的类作为key没有意义,key不可重复,value可以重复。


ArrayList和Vector的区别

这两个类都实现了List接口(List接口继承了Collection接口),他们都是有序集合,即存储在这两个集合中的元素位置都是有顺序的,相当于一种动态数组,我们以后可以按位置索引号取出某个元素,并且其中的数据是允许重复的。

关于ArrayList和Vector的区别,主要分为两个方面:

1. 同步性:

Vector是线程安全的,也就是说它的方法之间是线程同步的,而ArrayList是线程不安全的,它的方法之间是线程不同步的。如果只有一个线程会访问到集合,那最好是使用ArrayList,因为它不考虑线程安全,性能会更高;如果有多个线程会访问到集合,那最好是使用Vector,因为不需要我们自己再去考虑和编写线程安全的代码。

2. 数据增长:

ArrayList和Vector都有一个初始的容量大小,当存储进他们里面的元素的个数超过了容量时,就需要增加ArrayList与Vector的存储空间,每次要增加存储空间时,不是只增加一个存储单元,而是增加多个存储单元,每次增加的存储单元的个数在内存空间利用与程序效率之间要取得一定的平衡。Vector默认增长为原来的两倍,而ArrayList的增长策略在文档中没有明确规定(从源代码看出是为原来的1.5倍)。ArrayList与Vector都可以设置初始的空间大小,Vector还可以设置增长空间大小,而ArrayList没有提供设置增长空间的方法。

总结:Vector增长原来的一倍,ArrayList增加原来的0.5倍。




  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值