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

来源:互联网 发布:ubuntu jdk路径有空格 编辑:程序博客网 时间:2024/04/27 13:25


集合的基本概念

集合:保存多个其他对象的对象,不能保存简单类型。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 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 hp打印机卡了纸怎么办 华为荣耀9进水了怎么办 小米5x屏幕脱胶怎么办 小米5x后盖松动怎么办 苹果手机没电了怎么办 荣耀9的后盖裂了怎么办 手机一直在开机画面怎么办华为 华为手机一直显示开机画面怎么办 华为p7手机开不了机怎么办 华为荣耀8弯了怎么办 手机壳掉漆了怎么办 华为5a手机音量小怎么办 华为5a手机声音小怎么办 苹果屏幕磨花了怎么办 白色磨砂手机壳脏了怎么办 胶皮手机壳变黄怎么办 手机壳边缘黑了怎么办 手机壳磨黑了怎么办 iphon8原装后壳碎裂怎么办 皮的手机壳发黄怎么办 荣耀手机一直在开机画面怎么办 玻璃手机壳碎了怎么办 华为6x信号不好怎么办 昂达平板v819i刷成砖了怎么办 华为5x忘记密码怎么办 荣耀8开不了机怎么办 华为5s死机了怎么办 华为重启后忘了解锁密码怎么办 华为mate.9上网速度慢怎么办 华为mate10上网速度慢怎么办 四核豌豆2变砖怎么办 苹果32g不够用怎么办 移动4g网络卡怎么办 移动4g网非常卡怎么办 移动4g卡网速慢怎么办 手机移动4g网卡怎么办 华为手机摄像头进灰怎么办 美图t8忘记密码怎么办 华为mate7忘记开机密码怎么办 华为mate9开机密码忘记怎么办 华为手机系统更新失败怎么办