您的位置:首页 > 其它

list map set的简单方法的总结

2015-11-01 00:00 148 查看
摘要: 对常用集合的方法的总结

Java Collections Framework是Java提供的对集合进行定义,操作,和管理的包含一组接口,类的体系结构。

Java集合框架的基本接口/类层次结构:

java.util.Collection [I]
+--java.util.List [I]
+--java.util.ArrayList [C]
+--java.util.LinkedList [C]
+--java.util.Vector [C]
+--java.util.Stack [C]
+--java.util.Set [I]
+--java.util.HashSet [C]
+--java.util.SortedSet [I]
+--java.util.TreeSet [C]

java.util.Map [I]
+--java.util.SortedMap [I]
+--java.util.TreeMap [C]
+--java.util.Hashtable [C]
+--java.util.HashMap [C]
+--java.util.LinkedHashMap [C]
+--java.util.WeakHashMap [C]

[I]:接口

[C]:类

从上图可以看出:

List和Set 都是继承于Collection借口,而Map 没有继承Collection接口。也就是说Map和Collection是2种不同的集合。

Collection可以看作是(value)的集合,而Map可以看作是(key,value)的集合。

Map接口由Map的内容提供3种类型的集合视图,一组key集合,一组value集合,或者一组key-value映射关系的集合。

所以,java集合的主要分为三种类型:

Set(集)

List(列表)

Map(映射)

要深入理解集合首先要了解下我们熟悉的数组:

数组是大小固定的,并且同一个数组只能存放类型一样的数据(基本类型/引用类型),而JAVA集合可以存储和操作数目不固定的一组数据。 所有的JAVA集合都位于 java.util包中! JAVA集合只能存放引用类型的的数据,不能存放基本数据类型

简单说下集合和数组的区别:(参考文章:《Thinking In Algorithm》03.数据结构之数组)

有人想有可以自动扩展的数组,所以有了List

有的人想有没有重复的数组,所以有了set

有人想有自动排序的组数,所以有了TreeSet,TreeList,Tree**

而几乎有有的集合都是基于数组来实现的.

因为集合是对数组做的封装,所以,数组永远比任何一个集合要快

但任何一个集合,比数组提供的功能要多

一:数组声明了它容纳的元素的类型,而集合不声明。这是由于集合以object形式来存储它们的元素。

二:一个数组实例具有固定的大小,不能伸缩。集合则可根据需要动态改变大小。

三:数组是一种可读/可写数据结构---没有办法创建一个只读数组。然而可以使用集合提供的ReadOnly方法,

以只读方式来使用集合。该方法将返回一个集合的只读版本。

List : 是有序的,允许重复的集合,所以,有add(object )方法和add(int index,Object o)的方法。一个对象可以反复存储到list集合中,每调用一次add方法,对象就被插入一次,(集合中用一个索引变量指向该对象)。可以使用Iterator遍历list中的所有对象,也可以使用get(index i)来获取。

ArrayList ,Vector, LinkedList的区别:

ArrayList 和Vector是采用数组方式存储数据,此数组元素数大于实际存储的数据以便增加和插入元素,都允许直接序号索引元素,但是插入数据要设计到数组元素移动等内存操作,所以索引数据快插入数据慢,Vector由于使用了synchronized方法(线程安全)所以性能上比ArrayList要差,LinkedList使用双向链表实现存储,按序号索引数据需要进行向前或向后遍历,但是插入数据时只需要记录本项的前后项即可,所以插入数度较快

ArrayList 和 Vector的区别:

1.同步性:Vector是线程安全的,而ArrayList和LinkedList是线程不安全的

2.数据增长:Vector增长原来的1倍,而ArrayList增加原来的0.5倍

ArrayList和LinkedList在性能上各有优缺点,都有各自所适用的地方,总的说来可以描述如下:

1.对ArrayList和LinkedList而言,在列表末尾增加一个元素所花的开销都是固定的。对ArrayList而言,主要是在内部数组中增加一项,指向所添加的元素,偶尔可能会导致对数组重新进行分配;而对LinkedList而言,这个开销是统一的,分配一个内部Entry对象。

2.在ArrayList的中间插入或删除一个元素意味着这个列表中剩余的元素都会被移动;而在LinkedList的中间插入或删除一个元素的开销是固定的。

3.LinkedList不支持高效的随机元素访问

4.ArrayList的空间浪费主要体现在在list列表的结尾预留一定的容量空间,而LinkedList的空间花费则体现在它的每一个元素都需要消耗相当的空间

Set:多个对象之间没有明显的顺序不允许重复元素。所以add方法有一个Boolean的返回值,如果集合中含有与某个元素equals相等的元素时返回false,否则放回true。同时没有办法获取第几个元素,只能使用Iterator接口获取所有的元素,再逐一遍历各个元素。

HashSet按Hash算法来存储集合的元素,因此具有很好的存取和查找性能

HashSet的特点:

(1)HashSet不是同步的,多个线程访问是需要通过代码保证同步
(2)集合元素值可以使null。
HashSet集合判断两个元素相等的标准是两个对象通过equals方法比较相等,并且两个对象的hashCode()方法返回值也相等

hash算法的功能:
它能保证通过一个对象快速查找到另一个对象。hash算法的价值在于速度,它可以保证查询得到快速执行。
当需要查询集合中某个元素时,hash算法可以直接根据该元素的值得到该元素保存位置,从而可以让程序快速找到该元素。
TressSet : 可以对Set集合中的元素进行排序。
底层数据结构是二叉树,保证元素唯一性。
TreeSet排序的第一中方式:让元素自身具备比较性
元素需要实现Complare

Map 是双列的集合,添加的时候使用put(obj key,obj value)方法,不能存储重复的key,重复使用equals来判断,使用get(obj key) 来得到value,可以获取所有的key的结合,还可以获取所有的value的集合。
删除clear()和remove(Object key),判断containsValue(Object value)和containsKey(Object key)

|--Hashtable:底层是哈希表数据结构,不可以存入null键null值,该集合是线程同步的。jdk1.0效率低
|--HashMap:底层是哈希表数据结构,允许使用null值和null键,该集合是不同步的。jdk1.2效率高
|--TreeMap:底层是二叉树数据结构。线程不同步,可以用于给map集合中的键进行排序。
和Set很像。Set底层就是使用了Map集合。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  集合 List Set Map