Java集合框架

Java集合框架(Java Collections Framework)是存放大量对象的容器,被广泛使用。Java里包含这四种集合类:Vector, Stack, Hashtable, Array
集合中存放的是对象的引用。

Java1.2开始提供集合框架,这包括:

  • 接口
    所有集合类都得实现java.util.Collection。这个接口的方法(文档)包括:

    1. 基本操作:
      int size(), boolean isEmpty(), boolean contains(Object element), boolean add(E element), boolean remove(Object element), and Iterator<E> iterator()
    2. 对整个集合类的操作:
      boolean containsAll(Collection<?> c), boolean addAll(Collection<? extends E> c), boolean removeAll(Collection<?> c), boolean retainAll(Collection<?> c), and void clear()
    3. Array操作:
      Object[] toArray() and <T> T[] toArray(T[] a)

    java.util.List, java.util.Set, java.util.Queuejava.util.Map接口也是集合框架的一部分。(Map没用继承自Collection接口)

  • 实现类
    重要的集合类有ArrayList, LinkedList,HashMap, TreeMap, HashSet, TreeSet。(java.util包)
    线程安全的类有 CopyOnWriteArrayList, ConcurrentHashMap, CopyOnWriteArraySet。(java.util.concurrent包)

  • 算法
    如查询、排序、打乱

Iterator接口

取代了Enumeration,可以简单地理解为遍历,提供了一个标准化遍历各类容器里面的所有对象的设计模式。方法:

  • Object next():返回迭代器刚越过的元素的引用,返回值是 Object
  • boolean hasNext():判断容器内是否还有可供访问的元素
  • void remove():删除迭代器刚越过的元素
Iterator it = collection.iterator(); // 获得一个迭代起点
while(it.hasNext()) {
  Object obj = it.next(); // 得到下一个元素
}

ListIterator是Iterator的子接口,区别在于,只能用于List及其子类型;有add方法;可以实现逆向(顺序向前)遍历;可以定位当前索引的位置;可以实现对象的修改。(参考:JAVA中ListIterator和Iterator详解与辨析

List接口

有序,允许相同元素,有索引
除了具有Collection接口必备的iterator()方法外,List还有一个listIterator()方法,返回一个 ListIterator接口。
实现List接口的常用类有LinkedList,ArrayList,Vector和Stack。

  • ArrayList类
    类似数组的形式进行存储,随机访问速度快。
    线程不同步。
    内部的元素直接通过get与set方法进行访问。
    当ArrayList中的元素超过它的初始大小时,ArrayList只增加50%的大小。

  • LinkedList类
    双链表,在添加和删除元素时具有比ArrayList更好的性能,但在get与set方面弱于ArrayList。
    线程不同步。

  • Vector类
    和ArrayList类似,但线程同步
    当Vector中的元素超过它的初始大小时,Vector会将它的容量翻倍

  • Stack 类
    Stack继承自Vector,实现一个后进先出的堆栈。
    基本的push和pop 方法,还有peek方法得到栈顶的元素,empty方法测试堆栈是否为空,search方法检测一个元素在堆栈中的位置。Stack刚创建后是空栈。

Set接口

无序
不包含重复元素
取出只能是Iterator

  • HashSet
    一个按着Hash算法来存储集合中的元素,其元素值可以是NULL。它不能保证元素的排列顺序。

  • LinkedHashList
    HashSet的子类

  • TreeSet
    红黑树,线程不安全
    提供有序的 Set 集合( 实现SortedSet接口),储存的类需要实现需要实现Comparable接口

  SortedSet<Item> sortByDescription = new TreeSet<Item>(new
         Comparator<Item>()
         {  
            public int compare(Item a, Item b)
            {  
               String descrA = a.getDescription();
               String descrB = b.getDescription();
               return descrA.compareTo(descrB);
            }
         });

Queue接口

无null
方法:add,addall, remove, clearelement

  • PriorityQueue优先队列
    非线程安全
    PriorityQueue是基于优先堆的一个无界队列,这个优先队列中的元素可以默认自然排序或者通过提供的Comparator比较器在队列实例化的时排序。

Map接口

没有继承Collection接口
提供key到value的映射。一个Map中不能包含相同的key,每个key只能映射一个 value。
put(Object key, Object value) 将指定值与指定键相关联
entrySet()返回 Map 中所包含映射的 Set 视图。Set 中的每个元素都是一个 Map.Entry 对象,可以使用 getKey() 和 getValue() 方法(还有一个 setValue() 方法)访问后者的键元素和值元素
keySet()返回 Map 中所包含键的 Set 视图。删除 Set 中的元素还将删除 Map 中相应的映射(键和值)
values()返回 map 中所包含值的 Collection 视图。删除 Collection 中的元素还将删除 Map 中相应的映射(键和值)

  • Hashtable类
    Hashtable继承Map接口,实现一个key-value映射的哈希表。任何非空的对象都可作为key或者value。
    添加数据使用put(key, value),取出数据使用get(key),这两个基本操作的时间开销为常数。
    Hashtable通过initial capacity和load factor两个参数调整性能。通常缺省的load factor 0.75较好地实现了时间和空间的均衡。增大load factor可以节省空间但相应的查找时间将增大,这会影响像get和put这样的操作。
    由于作为key的对象将通过计算其散列函数来确定与之对应的value的位置,因此任何作为key的对象都必须实现hashCode和equals方法。
    Hashtable是同步的。

  • HashMap类
    HashMap和Hashtable类似,不同之处在于HashMap是非同步的,并且允许null,即null value和null key。
    但是将HashMap视为Collection时(values()方法可返回Collection),其迭代子操作时间开销和HashMap 的容量成比例。因此,如果迭代操作的性能相当重要的话,不要将HashMap的初始化容量设得过高,或者load factor过低。

  • TreeMap类
    通关红黑树实现, 继承 自AbstractMap(即一个key-value集合)。 非线程安全 。
    实现了NavigableMap接口,意味着它支持一系列的导航方法。比如返回有序的key集合。
    实现了Cloneable接口,意味着它能被克隆。
    实现了java.io.Serializable接口,意味着它支持序列化。
    基本操作 containsKey、get、put 和 remove 的时间复杂度是 log(n)
    按自然顺序或自定义顺序遍历键,TreeMap比HashMap要好;在Map 中插入、删除和定位元素,HashMap 是最好的选择。

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

集合对象排序接口Comparator

实现此接口的类可以进行排序,需要实现compare方法。
基本数据类型实现了这个接口,调用Collections.sort(list)进行排序;
如果Comparator只用一次,可使用匿名类。

参考:

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

推荐阅读更多精彩内容

  • title: java集合框架学习总结 tags:集合框架 categories:总结 date: 2017-03...
    行径行阅读 1,670评论 0 2
  • shell脚本 shell脚本执行 chmod +x xx.sh ;./xx.sh注意点:最好使用第一种 注释...
    帅碧阅读 994评论 1 2
  • 孟夏日西斜,闲行晚至家。凉风生竹荫,早月坠桐桠。树树群芳尽,枝枝绿叶嘉。欲寻春老处,独坐赏蓬花。 注:蓬花是蒲公英...
    小木山庄的溜溜阅读 381评论 0 6
  • 有些人,是注定要分开的,我不知道,如果我知道了结局,会不会选择再经历一遍过程。 有一个爱你,想你,念你的人,多不容...
    霞儿iiizzz文字控阅读 243评论 0 0
  • 我觉得没必要买kindle。使用手机在软件商城里面下载kindle我觉得就够用了。现在用手机下载kindle手机...
    爱冰的夏天阅读 6,316评论 1 1