Java集合类解析
来源:互联网 发布:sqlserver怎么读 编辑:程序博客网 时间:2024/05/16 11:48
最近看了下Java中的集合类对象,发现零碎的知识好多,有些记忆已经模糊了,突然想回忆下这块内容,给自己充充电。废话少说了,直接入主题吧~~
在Java中有一套设计优良的接口和类组成了Java集合框架,使程序员操作成批的数据或对象元素极为方便。所有的Java集合都在java.util包中。
网上找了一张图片详细解释了其中的继承关系:
然后看出集合之间的(继承)关系,还是文字说下比较直观点,以下是常用的集合类介绍:
Collection (单列集合)├List │├LinkedList │├ArrayList │└Vector │ └Stack └Set│├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
夜深了,关灯睡觉,晚安 ~~
- Java集合类解析
- Java集合类解析
- Java集合类解析
- 【Java集合类】ArrayList解析
- 【Java集合类】LinkedList解析
- 【Java集合类】Vector解析
- 【Java集合类】HashTable解析
- 【Java集合类】HashMap解析
- 【Java集合类】TreeMap解析
- 【Java集合类】HashSet解析
- JAVA集合类解析之List类
- 解析java.util集合类源码(SubList)
- 解析java.util集合类源码(ArrayList)
- 解析java.util集合类源码(AbstractSequentialList)
- 解析java.util集合类源码(Queue)
- Java集合---Arrays类源码解析
- Java集合类库 ArrayList 源码解析
- Java集合概述--HashSet类解析
- 程序底层查看工具之dumpbin
- Codeforces Round #336 (Div. 2)-C Chain Reaction(二分+DP)
- Arduino的toInt()注意事项
- win系统删除,已经注册的服务
- 文本挖掘的分词原理
- Java集合类解析
- FastDFS 图片上传功能实现
- [UE4]编译时的各个平台定义宏
- 调整数组顺序使奇数位于偶数前面(剑指Offer 第 13 题)
- c++ 调用Python接口小问题
- 322. Coin Change
- zookeeper技术原理(转)
- 深度学习Loss function之Softmax中的矩阵求导
- [UE4]蓝图调用c++