`
lvwenwen
  • 浏览: 930747 次
  • 性别: 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 集合类型的不重复性,这方面做一些去重处理非常的好,比如我们要处理一些数据,想把重复的数据给 去掉,然后在操作的话,可以把它转换成集合类型,然后在由集

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

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

    OpenSwing---Java 常用控件集合

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

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

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

    WinForm界面开发之“分页控件”

    耦合性低一些,例如我不想是基于存储过程的,因为我很多程序需要使用Access作为数据库,一般来说,我还希望有导出Excel数据的功能,还有打印预览功能,由于我的数据源表头,如实体类集合、表格内容绑定的时候,表头...

    大数据的一个重要方面:数据可用性.docx

    大数据集合中一定要保证数据的完整性,要让数据库中包含各种我们所想知道的数据,让他可以支持足够的数据来满足人们对各种数据的查询,同时还要满足和支持各种大数据的计算。例如,在医院的医疗数据库中所保存的数据...

    ZJU_ACM_All_Anwer 搞编程的都知道的浙江大学A 题库.本书 集了所有经 Z 题解集,集合并附 Mathimaticsumerical algorithms 数值算法

    1080 Direct Subtraction 尚未解决,我过的程序是错的,想和您讨论~~~ 1229 Gift?! SRbGa的经典题…… 1238 Guess the Number SRbGa的经典题…… 1239 Hanoi Tower Troubles Again! SRbGa的经典题…… 字符串...

    数学建模导论:基于Python语言+源代码+文档说明

    现在对计算机1915班的前五名同学模电成绩想排个序,要求: - 输入成绩个数为5,用input()函数实现 - 将输入的五个数保存成列表,并进行冒泡排序 - 不允许使用list自带的sort()方法,必须自己设置冒泡排序 - 将五个...

    水淼单页网站生成系统 v1.8.0.0.zip

    有 一个常见的应用是:A君有一些学术文章想要集合在网页上给同学浏览,如果一篇篇发表在博客或自建网站程序上的话比较麻烦,因此用这个软件可以轻松将这些文 章串联起来,自动进行分页列表;每篇文章还有上下篇的...

    AngularJS 中文API参考手册

    所以我做了一些工作(你也可以觉得是小花招)来让浏览器做我想要的事。 通常,我们是通过以下技术来解决静态网页技术在构建动态应用上的不足: 类库 - 类库是一些函数的集合,它能帮助你写WEB应用。起主导作用的是你...

    matlab说话代码-math-802-course-materials:数学802的额外课程材料

    如果您不能(或不想)使用教学大纲中推荐的设置,请参考以下一些入门指南。 您可以选择其他IDE。 例如,Spyder是外观更传统的IDE,可以轻松地安装在Anaconda中。 您可以简化并简单地使用文本编辑器+命令提示符。 我...

    awesome-es6:对ES6启用的新功能的快速简单描述

    很棒-es6 ES6是JavaScript的重大更新,其中包括许多新功能。...“ ,这个README集合可能对您有用。内容11.符号12. ESLint的代码质量13. JavaScript模块和使用npm 14. ES6工具15.班级16.发电机17.代理18.集和弱

    C#微软培训资料

    <<page 1>> page begin==================== 目 目目 目 录 录录 ... 2000 年 6 月 22 日 不论对 Microsoft 还是对整个 IT 业界都将成为值得纪念的一天 这一天 微软公司正式推出了其下一代...

    编译原理 东南大学 64讲 视频.txt

    3.集合论的推演: 主要是一些闭包运算之类,数学基础不好的话,学起来也会感到吃力. 4.LR文法: 主要是又引入了自动机 不管哪本编译教材,即使是绝对经典”龙书”也不例外,都要涉及到这几个难点.由于这些内容本身不好...

    PHP 面向对象技术(全面讲解).txt

    上面讲过来,使用类是为了让它实例出对象来给我们用,这就要知道你想要的是什么样的对 象了,像上面我们讲的一个装机配置单上写什么,你装出来的机子就有什么。比如说,一个人就是 一个对象,你怎么把一个你看好的人...

    c#学习笔记.txt

    我觉得这样做未免有些太霸道了,如果你说这叫偏执狂我也不反对,虽然我是狮子座,可也不想被人这样看。 在C#刚刚推出的时候,大多数的程序员都不免吼上两句——不是因为高兴,而是因为又多了一种语言。他们觉得现在...

    IDA+Pro权威指南源码

    IDA+Pro权威指南part1+part2源码集合作为一名IDA用户,你可能想知道,如果遇到与IDA有关的问题,该从什么地方需求帮助。如果我们做的还不错的话,本文也许能够解决用户遇到的大多数问题。如果你需要额外的帮助,请...

    Java面试宝典2010版

    69、两个对象值相同(x.equals(y) == true),但却可有不同的hash code,这句话对不对? 70、TreeSet里面放对象,如果同时放入了父类和子类的实例对象,那比较时使用的是父类的compareTo方法,还是使用的子类的...

    正则表达式30分钟入门教程

    要想查找数字,字母或数字,空白是很简单的,因为已经有了对应这些字符集合的元字符,但是如果你想匹配没有预定义元字符的字符集合(比如元音字母a,e,i,o,u),应该怎么办? 很简单,你只需要在方括号里列出它们就行了...

Global site tag (gtag.js) - Google Analytics