`
lvwenwen
  • 浏览: 958422 次
  • 性别: Icon_minigender_1
  • 来自: 魔都
社区版块
存档分类
最新评论

想对集合说的一些话

阅读更多

Java的集合很有用,自己看过很多了,但是总是感觉很模糊,用起来一点也不顺手,在这里我想好好总结一下。我们学过的集合主要有一下这些:
Collection是超级父类,第二层父类分为List和Set.。list又可以分为ArrayList,LinkList,Vector.。Set分为HashSet,TreeSet。此外还有用于键值对的集合Map。它可以分为Hashtable和Hashmap,treemap。
下面来说说为啥java容器要分为那么多类的。Java容器类包含List、ArrayList、Vector及map、HashTable、HashMap。
Collection接口
Collection是最基本的集合接口,一个Collection代表一组Object,即Collection的元素(Elements)。一些Collection允许相同的元素而另一些不行。一些能排序而另一些不行。Java SDK不提供直接继承自Collection的类,Java SDK提供的类都是继承自Collection的“子接口”如List和Set。 所有实现Collection接口的类都必须提供两个标准的构造函数:无参数的构造函数用于创建一个空的Collection,有一个Collection参数的构造函数用于创建一个新的Collection,这个新的Collection与传入的Collection有相同的元素。后一个构造函数允许用户复制一个Collection。
  如何遍历Collection中的每一个元素?
  不论Collection的实际类型如何,它都支持一个iterator()的方法,该方法返回一个迭代子,使用该迭代子即可逐一访问Collection中每一个元素。典型的用法如下:
  Iterator it = collection.iterator(); // 获得一个迭代子
  while(it.hasNext()) {
  Object obj = it.next(); // 得到下一个元素
  }
  由Collection接口派生的两个接口是List和Set。
List是有序的Collection,使用此接口能够精确的控制每个元素插入的位置。用户能够使用索引(元素在List中的位置,类似于数组下标)来访问List中的元素,这类似于Java的数组。 和下面要提到的Set不同,List允许有相同的元素。 除了具有Collection接口必备的iterator()方法外,List还提供一个listIterator()方法,返回一个 ListIterator接口,和标准的Iterator接口相比,ListIterator多了一些add()之类的方法,允许添加,删除,设定元素, 还能向前或向后遍历。实现List接口的常用类有LinkedList,ArrayList,Vector。
ArrayList类
ArrayList实现了可变大小的数组。它允许所有元素,包括null。ArrayList没有同步。 size,isEmpty,get,set方法运行时间为常数。但是add方法开销为分摊的常数,添加n个元素需要O(n)的时间。其他的方法运行时间为线性。 每个ArrayList实例都有一个容量(Capacity),即用于存储元素的数组的大小。这个容量可随着不断添加新元素而自动增加,但是增长算法 并没有定义。当需要插入大量元素时,在插入前可以调用ensureCapacity方法来增加ArrayList的容量以提高插入效率。 和LinkedList一样,ArrayList也是非同步的(unsynchronized)
Vector:底层数据结构数组,线程安全,增删查改都慢,已过时 Enumeration:Vector独特的取出方式,被Iterator取代
Map接口
请注意,Map没有继承Collection接口,Map提供key到value的映射。一个Map中不能包含相同的key,每个key只能映射一个 value。Map接口提供3种集合的视图,Map的内容可以被当作一组key集合,一组value集合,或者一组key-value映射。
HashMap类
HashMap和Hashtable类似,不同之处在于HashMap是非同步的,并且允许null,即null value和null key。,但是将HashMap视为Collection时(values()方法可返回Collection),其迭代子操作时间开销和HashMap 的容量成比例。因此,如果迭代操作的性能相当重要的话,不要将HashMap的初始化容量设得过高,或者load factor过低。
Hashtable类
  Hashtable继承Map接口,实现一个key-value映射的哈希表。任何非空(non-null)的对象都可作为key或者value。 添加数据使用put(key, value),取出数据使用get(key),这两个基本操作的时间开销为常数。 Hashtable通过initial capacity和load factor两个参数调整性能。通常缺省的load factor 0.75较好地实现了时间和空间的均衡。增大load factor可以节省空间但相应的查找时间将增大,这会影响像get和put这样的操作。
  使用Hashtable的简单示例如下
  将1,2,3放到Hashtable中,他们的key分别是”one”,”two”,”three”:
  Hashtable numbers = new Hashtable();
  numbers.put(“one”, new Integer(1));
  numbers.put(“two”, new Integer(2));
  numbers.put(“three”, new Integer(3));
  要取出一个数,比如2,用相应的key:
  Integer n = (Integer)numbers.get(“two”);
  System.out.println(“two = ” + n);
  由于作为key的对象将通过计算其散列函数来确定与之对应的value的位置,因此任何作为key的对象都必须实现hashCode和equals方法。hashCode和equals方法继承自根类Object,如果你用自定义的类当作key的话,要相当小心,按照散列函数的定义,如果两个对象相同,即obj1.equals(obj2)=true,则它们的hashCode必须相同,但如果两个对象不同,则它们的hashCode不一定不同,如果两个不同对象的hashCode相同,这种现象称为冲突,冲突会导致操作哈希表的时间开销增大,所以尽量定义好的hashCode()方法,能加快哈希表的操作。 如果相同的对象有不同的hashCode,对哈希表的操作会出现意想不到的结果(期待的get方法返回null),要避免这种问题,只需要牢记一条:要同时复写equals方法和hashCode方法,而不要只写其中一个。
  Hashtable是同步的。
分享到:
评论

相关推荐

    计算机专业的一些毕业设计集合

    【标题】"计算机专业的一些毕业设计集合"涵盖了多种计算机科学和技术的应用实例,主要集中在系统设计领域。这可能包括软件开发、数据库管理、网络技术、用户界面设计等多个方面。毕业设计通常是一个学生在大学期间的...

    python集合类型用法分析

    本文实例分析了python集合类型用法。...一、先看下python 集合类型的不重复性,这方面做一些去重处理非常的好,比如我们要处理一些数据,想把重复的数据给 去掉,然后在操作的话,可以把它转换成集合类型,然后在由集

    对爱人说的话.doc

    这篇文档实际上是一篇表达爱意的话语集合,虽然标签为“资料”,但内容上与IT行业并无直接关联。不过,我们可以从中提取出一些情感表达和人际沟通的通用知识点: 1. **真诚的情感表达**:文本中的每一句话都充满了...

    python中如何使用正则表达式的集合字符示例

    在正则表达式里,想匹配一些字符中的一个,也就是说给出一个字符的集合,只要出现这个集合里任意的字符,都是成立的。比如[ab],就是将匹配任意出现a或b的字符。比如a[ab]+,它是贪婪模式,将会匹配所有是a后面的a或...

    好词好句作文集合五篇.docx

    【标题】和【描述】中提到的文档是一个包含“好词好句”的作文集合,而【标签】为“技术”,这表明文档可能被错误地标记,因为内容并不涉及技术领域。不过,我们可以从【部分内容】中提取一些通用的写作技巧和表达...

    有关电影的语录大集合59句.docx

    这句话教导我们在处理人际关系时要保持警觉,尤其是对敌人,要深入了解他们的动机和策略。 8. "做羹要讲究火候。火候不到,众口难调,火候过了,事情就焦。做人也是这样。" ——《一代宗师》 生活中的平衡与把握...

    数据结构与算法之并查集(不相交集合)

    package 并查集不想交集合; ``` import java.util.Scanner; public class DisjointSet { static int tree[]=new int[100000];//假设有500个值 public DisjointSet() { set(this.tree); } public DisjointSet...

    OpenSwing---Java 常用控件集合

    加入了好多人在CJW论坛上贴子中想要的带关闭按钮的JCloseableTabbedPane可关闭的JTabbedPane的组件 2005/06/21 对JDatePicker加入了时分秒的输入 2006/01/20 修正了JPopupButton在XP风格下呈两个按钮样子的BUG 对...

    2021年经典中秋祝贺词集合30句.docx

    9. **情感表达**:“我想说,无论我身在何处,无论我人在何方,我的心永远和你们在一起!”这表达了情感表达的重要性。在远程协作的IT环境中,有效的沟通和情感表达能缓解距离带来的隔阂。 综上所述,虽然文档内容...

    sketches:小代码草图的集合

    因此,这个集合对于想要学习TypeScript或已经使用TypeScript的人来说,是一个宝贵的参考资料。 在"sketches-master"这个压缩包中,我们可以期待找到一系列用TypeScript编写的代码片段或小型项目。这些草图可能涵盖...

    MalwareDatabase:该存储库是GitHub上的一些恶意软件集合之一

    恶意软件数据库免责声明该存储库是GitHub上为数不多的恶意软件集合之一。 这里几乎每个样本都是恶意的,因此我强烈建议您不要在真实的硬件上打开这些文件,也不要滥用该恶意软件来恶作剧您的朋友。 这些样本播放可能...

    周末对女朋友说的情话大全.doc

    这些话展示了对对方深深的依赖和情感的深度。 4. **承诺与坚持**:一些情话包含了对未来共同生活的承诺,如“如果上天让我许三个愿望,第一个是今生今世和你在一起...”。这些承诺表达了对关系的认真态度和对未来的...

    QQ个性签名:有没有想过你在跟对方聊天的时候对方却是不难烦和讨厌参照.pdf

    4. **情感互动**:“你不说,我也不说,就这样,说着说着就变了,想着想着就算了。”这反映了人际沟通中的误解和沉默可能导致关系疏远,强调了沟通的重要性。 5. **自我价值**:“可以不善良,但不能活的卑鄙。”这...

    旨在打造在线最佳的Java学习笔记,含博客讲解和源码实例,包括Java SE和Java Web.zip

    笔记内容主要是对一些基础功能和编程细节进行总结整理,适合了解Java基础语法、想进一步研究学习的人包含博客讲解和实例源码,采用maven构建,分模块学习,涉及反射,代理,多线程,IO,集合类等核心知识。...

    python-code:我针对问题和算法实现的Python解决方案的集合。 还包括一些特殊文件,其中包含我的编码挑战课程的解决方案

    标题中的“python-code”指的是一个Python编程资源集合,包含了作者为解决特定问题和算法而编写的代码。这个集合不仅展示了作者...这个资源对于学习Python编程,尤其是想要提升实战能力的开发者来说,是非常有价值的。

    风云OL资料_风云_风云OL的一些代码_

    然而,“什么鸟网要用英文的啊”这句话可能暗示了一些问题,比如部分开发者或社区可能更倾向于使用英文文档或交流,这可能对中文环境下的使用者造成一些困扰,尤其是在寻找帮助或理解代码时。 “风云”和“风云OL的...

    C#语言参考守则 很有用的参考书 学C#想要在开发上有所造诣的话相信着本书会很有帮助的!

    《C#语言参考守则》是一本专门为C#开发者量身打造的权威指南,它涵盖了C#编程的各个方面,旨在帮助...书中的每个知识点都是作者多年经验和实践的结晶,对于想要深入理解C#的开发者来说,这是一份不可多得的参考资料。

    2012年新年祝词.doc

    这篇文档实际上是一篇新年祝福语的集合,包含了各种祝福的话语和情感表达,旨在向朋友们传递新年的喜悦和祝福。以下是从这些祝福语中提取出的一些知识点: 1. **节日祝福语的构成**:祝福语通常包含对个人的关怀、...

    宫崎骏动画经典语录收集.doc

    宫崎骏动画经典语录收集是宫崎骏的一些精彩语录的集合,这些语录来自于他的动画作品,表达了他对生活、人生、爱情、友谊等方面的看法和感悟。下面是对这些语录的详细解读和知识点总结: 1.离别的滋味:“我不知道...

    程序人生--一个程序员对学弟学妹建议

    作为一名在程序世界中摸爬滚打多年的程序员,我想通过这篇文章为我的学弟学妹们提供一些宝贵的建议,帮助你们在程序员的道路上更加平稳和高效地前行。 首先,我们要走出一个常见的误区,即认为计算机技术就等同于...

Global site tag (gtag.js) - Google Analytics