Java集合类解析

来源:互联网 发布:sqlserver怎么读 编辑:程序博客网 时间:2024/05/16 11:48

最近看了下Java中的集合类对象,发现零碎的知识好多,有些记忆已经模糊了,突然想回忆下这块内容,给自己充充电。废话少说了,直接入主题吧~~
在Java中有一套设计优良的接口和类组成了Java集合框架,使程序员操作成批的数据或对象元素极为方便。所有的Java集合都在java.util包中。

网上找了一张图片详细解释了其中的继承关系:
这里写图片描述

然后看出集合之间的(继承)关系,还是文字说下比较直观点,以下是常用的集合类介绍:

Collection (单列集合)├List │├LinkedList │├ArrayList │└Vector │ └StackSet│├HashSet │└TreeSetMap ( 键值对,键不可重复,键可以重复)├Hashtable ├HashMap ├Properties └WeakHashMap 

1 列表 List接口(继承于Collection接口)及其实现类

list集合特点:    List的特征是其元素以线性方式存储,集合中可以存放重复对象。 次序是List最重要的特点:它保证维护元素特定的顺序。简单来说就是:有存储顺序, 可重复。实现的子类:    一:ArrayList  数组实现, 查找快, 增删慢    由于是数组实现, 在增和删的时候会牵扯到数组增容, 以及拷贝元素. 所以慢。数组是可以直接按索引查找, 所以查找时较快。   二:LinkedList 链表实现, 增删快, 查找慢   双向链表来实现,删除与插入速度快,读取速度较慢,因为它读取时是从头向尾(如果节点在链的前半部分),或尾向头(如果节点在链的后半部分)查找元素。因此适合于元素的插入与删除操作。     三:Vector 数组实现,线程安全,重量级     和ArrayList实现方式相同, 但考虑了线程安全问题, 所以效率略低

2 集 Set接口(继承于Collection接口)及其实现类

set集合特点:    集合中的元素不按特定方式排序,只是简单的把对象加入集合中,就像往口袋里放东西。对Set中成员的访问和操作是通过Set中对象的引用进行的,所以集中不能有重复对象。实现子类:    一:HashSet  线程不安全,存取速度快。    底层是以哈希表实现的。要注意的是:存入HashSet中的对象必须实现HashCode()方法;    二:TreeSet 红-黑树的数据结构    默认对元素进行自然排序(String)。如果在比较的时候两个对象返回值为0,那么元素重复。

3 映射 Map接口(继承于Collection接口)及其实现类

map集合特点:    Map是一个单独的接口,不继承于Collection。Map是一种把键对象和值对象进行关联的容器。key不允许重复。实现子类:    一:HashTable  底层是使用了哈希表维护的    存取的读取快,存储元素是无序的。实现一个映象,所有的键必须非空。为了能高效的工作,定义键的类必须实现hashcode()方法和equal()方法。    二:HashMap 底层是以哈希表实现的    线程不安全,存取速度快。实现一个键到值映射的哈希表,通过键取得值对象,没有顺序,通过get(key)来获取value,允许存储空对象,而且允许键是空(由于键必须是唯一的,当然只能有一个);    三:TreeMap 红-黑树的数据结构    默认对元素进行自然排序(String)。如果在比较的时候两个对象返回值为0,那么元素重复。对key排好序的Map; key 就是TreeSet, value对应每个key; key要实现Comparable接口或TreeMap有自己的构造器;    四:Properties     一般是把属性文件读入流中后,以键-值对的形式进行保存,以方便读取其中的数据。 

4 Iterator接口
Iterator接口位于java.util包中,它是一个对集合进行迭代的迭代器。
集合容器(如:List、Set、Map等)本身提供了处理元素置入和取出的方式,但是单一选取元素的方法很受限制。所以我们要用Iterator去选取容器中的元素,它将容器转换成一个序列。

Iterator iterator = list.iterator();         while(iterator.hasNext()){              String string = iterator.next();              //do something         }

问题总结:

LinkedList和ArrayList的区别

1) 因为Array是基于索引(index)的数据结构,它使用索引在数组中搜索和读取数据是很快的。Array获取数据的时间复杂度是O(1),但是要删除数据却是开销很大的,因为这需要重排数组中的所有数据。

2) 相对于ArrayList,LinkedList插入是更快的。因为LinkedList不像ArrayList一样,不需要改变数组的大小,也不需要在数组装满的时候要将所有的数据重新装入一个新的数组,这是ArrayList最坏的一种情况,时间复杂度是O(n),而LinkedList中插入或删除的时间复杂度仅为O(1)。ArrayList在插入数据时还需要更新索引(除了插入数组的尾部)。

3) 类似于插入数据,删除数据时,LinkedList也优于ArrayList。

4) LinkedList需要更多的内存,因为ArrayList的每个索引的位置是实际的数据,而LinkedList中的每个节点中存储的是实际的数据和前后节点的位置。

什么场景下更适宜使用LinkedList,而不用ArrayList

1) 你的应用不会随机访问数据。因为如果你需要LinkedList中的第n个元素的时候,你需要从第一个元素顺序数到第n个数据,然后读取数据。

2) 你的应用更多的插入和删除元素,更少的读取数据。因为插入和删除元素不涉及重排数据,所以它要比ArrayList要快。

以上就是关于ArrayList和LinkedList的差别。你需要一个不同步的基于索引的数据访问时,请尽量使用ArrayList。ArrayList很快,也很容易使用。但是要记得要给定一个合适的初始大小,尽可能的减少更改数组的大小。

HashMap与HashTable有什么区别?

两者都是用key-value方式获取数据。Hashtable是原始集合类之一(也称作遗留类)。HashMap作为新集合框架的一部分在Java2的1.2版本中加入。它们之间有一下区别:
  
1) HashMap和Hashtable大致是等同的,除了非同步和空值(HashMap允许null值作为key和value,而Hashtable不可以)。
  
2) HashMap没法保证映射的顺序一直不变,但是作为HashMap的子类LinkedHashMap,如果想要预知的顺序迭代(默认按照插入顺序),你可以很轻易的置换为HashMap,如果使用Hashtable就没那么容易了。

3) HashMap不是同步的,而Hashtable是同步的。

4) 迭代HashMap采用快速失败机制,而Hashtable不是,所以这是设计的考虑点。

Collection、Set和List的区别?

1) Collection对象之间没有指定的顺序,允许有重复元素和多个null元素对象;它是Set和List接口的父类,是一种最通用型的集合接口;

2)Set各个元素对象之间没有指定的顺序,不允许有重复元素,最多允许有一个null元素对象;

3) List各个元素对象之间有指定的顺序,允许重复元素和多个null元素对象;

参考自博客:http://www.cnblogs.com/lxl57610/p/5822415.html

夜深了,关灯睡觉,晚安 ~~