JAVA集合框架总结

前言

java的集合框架基本上是必备的知识,也感觉是面试的重灾区吧,,虽然我没有去面试过。集合框架确实是一个值得理解很多遍的东西,由于由Collection接口衍生出来的类特别多,以及Map(没有实现collection接口)。所以不经常用的话会生疏。这类知识到处都有,这里只是我自己的一些总结。最初学习这些知识的时候,并不会数据结构。对于数据的存储方式等等完全不了解。而现在学习了数据结构之后,感觉有些知识不用再去单纯的去背了。

图列

Collection

├List

│├LinkedList

│├ArrayList

│└Vector

│ └Stack

└Set

Map

├Hashtable

├HashMap

└WeakHashMap

Interface Collection

第一个就要提到Collection接口。java sdk不提供这个最基本的集合接口,而是只提供实现了Collection接口的set和list接口。所有实现Collection接口的类都必须提供两个标准的构造函数:无参数的构造函数用于创建一个空的Collection,有一个 Collection参数的构造函数用于创建一个新的Collection,这个新的Collection与传入的Collection有相同的元素。后 一个构造函数允许用户复制一个Collection。实现Collection里面接口的实现需要使用一种叫迭代器的东西(Iterator),方法:

Iterator it = collection.iterator(); // 获得一个迭代子
    while(it.hasNext()) {
      Object obj = it.next(); // 得到下一个元素
    }

Interface Set

set是一个不包含重复元素的实现了Collection接口的接口(e1.equals(e2) == false),最多含有一个Null元素。


Interface List

List接口是实现了Collection接口的一个接口,叫列表。它是一个有序的Collection,它可以准确的记录下每个元素在列表中的位置,并且可以通过索引(相当于数组的下标)来对元素进行操作。这个接口比较类似数组,可以有重复的元素存在。除了具有Collection接口必备的iterator()方法外,List还提供一个listIterator()方法,返回一个 ListIterator接口,和标准的Iterator接口相比,ListIterator多了一些add()之类的方法,允许添加,删除,设定元素, 还能向前或向后遍历。

Class ArrayList(非同步类,无同步方法)

我觉得应该是我们现在最常用的一个集合类,泛型数组,特点就是可以自动扩充大小,当元素数目大于当前数组大小的时候进行扩充,arraylist增长率为目前数组长度的50%。这个集合类实现了List接口,因为继承了List接口的一些特点,不用再多说了。当需要插入大量元素时,在插入前可以调用ensureCapacity方法(自己百度)来增加ArrayList的容量以提高插入效率。

Class LinkList(非同步类,无同步方法)

与Arraylist差别用法差别其实并不大,此外LinkedList提供额外的get,remove,insert方法在 LinkedList的首部或尾部。它与ArrayList的差别我们在总结里面提。


Class Vector(线程安全,同步)

Vector非常类似ArrayList,但是Vector是同步的。由Vector创建的Iterator,虽然和 ArrayList创建的Iterator是同一接口,但是,因为Vector是同步的,当一个Iterator被创建而且正在被使用,另一个线程改变了 Vector的状态(例如,添加或删除了一些元素),这时调用Iterator的方法时将抛出ConcurrentModificationException,因此必须捕获该异常。当元素数目大于当前数组大小的时候进行扩充,Vector增长率为目前数组长度的100%。

Class Stack

Stack继承自Vector,实现一个栈(先进后出)。Stack提供5个额外的方法使得Vector得以被当作堆栈使用。基本的push和pop 方法,还有peek方法得到栈顶的元素,empty方法测试堆栈是否为空,search方法检测一个元素在堆栈中的位置。Stack刚创建后是空栈。


Interface Map(映射)

Map这个接口你可以从最开始的那个图中看出来,她是没有实现Collection这个接口的,它是一种“键值对”的形式来存储元素。(key-value)Map接口实现的就是形成key到value的映射。不许有重复的key,因为它是一一对应的关系,value可以重复。Map的内容可以被当作一组key集合,一组value集合,或者一组key-value映射。

Class HashMap(同步)

    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);

HashMap里面元素的key和value都分别算作是一个个的对象,然后key对象不重复是通过它的hashcode不同,equals结果返回false来实现的,两者不可或缺,缺一不可。如图,String类是SDK提供的类,所以不用管它的hashcode(),equals()函数,但是如果这里是个Person类,Student类,你就需要重写它的hashcode()和equals()类,因为不同的对象的hashcode值可能是相同的!然后不同对象equals结果肯定是false,多以容易引起冲突,所以两个函数必须全部重写。

Class TreeMap(二叉树结构)

(实现SortMap接口)里面的元素也是不重复,并且是按照一种自然顺序或者是特定的自定义顺序来排序的映射类,并且顺序固定不变

Class WeakHashMap

WeakHashMap是一种改进的HashMap,它对key实行“弱引用”,如果一个key不再被外部所引用,那么该key可以被GC回收。

弱引用(WeakReference)和强引用(StrongReference)以及软引用(SoftReference)和虚引用(PhantomReference)的用法以及区别以后再谈吧


总结

1.如果需要快速插入,删除元素,应该使用LinkedList(链式存储结构),如 果需要快速随机访问元素,应该使用ArrayList(顺序存储结构)。至于原因,大家学了数据结构就会很清楚了。

2.如果程序在单线程环境中,或者访问仅仅在一个线程中进行,考虑非同步的类,其效率较高,如果多个线程可能同时操作一个类,应该使用同步的类。

3.要特别注意对哈希表的操作,作为key的对象要正确复写equals和hashCode方法。

4.尽量返回接口而非实际的类型,如返回List而非ArrayList,这样如果以后需要将ArrayList换成LinkedList时,客户端代码 不用改变。这就是针对抽象编程。

5.同步性:以Vector和ArrayList为列子,前者是同步的而后者是非同步的。浅而言之就是同步的集合类在多线程程序里面会很安全,然而如果在单线程程序里面我们自然就应该调用非同步的集合类,效率应该更高。

6.扩增性:Vector的扩增是每次100%,而ArrayList是每次50%,因此每次都扩增自己的这么多倍,所以到最后列表的大小永远都要比本身的元素大小要大。在这里我们处理大数据的时候用Vector比较合理。

7.ArrayList,LinkList,Vector:Vetcor和ArrayList采用的是数组数据结构在add和remove的时候都是把数组里面的元素分别按照索引往后移动一个位置,效率不高,然而LinkList则是采用的双链表数据结构,它在add的时候只需要用指针标记要插入位置的前后索引号就行了,效率高。因此,我们在进行大量数据的插入删除的时候就应该使用LinkList。然后ArrayList在get的时候却要比LinkList效率高。因为Arrayist在get的时候是通过索引来获取,但是LinkList则需要移动指针来实现。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 196,165评论 5 462
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 82,503评论 2 373
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 143,295评论 0 325
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,589评论 1 267
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,439评论 5 358
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,342评论 1 273
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,749评论 3 387
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,397评论 0 255
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,700评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,740评论 2 313
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,523评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,364评论 3 314
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,755评论 3 300
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,024评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,297评论 1 251
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,721评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,918评论 2 336

推荐阅读更多精彩内容

  • title: java集合框架学习总结 tags:集合框架 categories:总结 date: 2017-03...
    行径行阅读 1,667评论 0 2
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,514评论 18 399
  • Collection ├List │├LinkedList │├ArrayList │└Vector │└Stac...
    AndyZX阅读 861评论 0 1
  • 在我的老家,人们做饭跟简单,炒,炒,炒。蒸?焯?炸?只有大菜才需要那么"高深"的做法。以吃鸡为例,我是长大后才发现...
    小海绵X阅读 660评论 3 2
  • 一个人,因为无法被理解与被关怀,因为所得回应总是勉强且微小,所以变得无所不能,变得坚硬和满不在乎。一个人的冷漠里大...
    马小妮的自圆其说阅读 146评论 0 0