[转]Java集合详解

在Java中有一套设计优良的接口和类组成了Java集合框架,使程序员操作成批的数据或对象元素极为方便。所有的Java集合都在java.util包中。

在编写程序的过程中,使用到集合类,要根据不同的需求,来决定使用哪种集合类,比如,要经常遍历集合内元素,就要使用List,如果要保证集合中不存在重复的数据,就要用Set;如果要通过某一键来查找某一值,就要使用Map。

1)、列表  List接口(继承于Collection接口)及其实现类

List接口及其实现类是容量可变的列表,可按索引访问集合中的元素。

特点:集合中的元素有序、可重复

列表在数据结构中分别表现为:数组和向量、链表、堆栈、队列。

实现类:

ArrayList实现一个数组,它的规模可变并且能像链表一样被访问。它提供的功能类似Vector类但不同步,它是以Array方式实现的List,允许快速随机存取

LinkedList实现一个链表,提供最佳顺序存取,适合插入和移除元素。由这个类定义的链表也可以像栈或队列一样被使用。提供最佳顺序存取合插入和移除元素

2)、集 Set接口(继承于Collection接口)及其实现类

特点:集合中的元素不按特定方式排序,只是简单的把对象加入集合中,就像往口袋里放东西。

对Set中成员的访问和操作是通过Set中对象的引用进行的,所以集中不能有重复对象

Set也有多种变体,可以实现排序等功能,如TreeSet,它把对象添加到集中的操作将变为按照某种比较规则将其插入到有序的对象序列中。

它实现的是SortedSet接口,也就是加入了对象比较的方法。通过对集中的对象迭代,我们可以得到一个升序的对象集合。

实现类:

HashSet能够快速定位一个元素,要注意的是:存入HashSet中的对象必须实现HashCode()方法

TreeSet将放入其中的元素按序存放

3)、映射 Map接口及其实现类

Map是一个单独的接口,不继承于Collection。Map是一种把键对象和值对象进行关联的容器。

特点:key不允许重复

映射与集或列表有明显区别,映射中每个项都是成对的,Map是把键对象和值对象进行关联的容器。映射中存储的每个对象都有一个相关的关键字(Key)对象,关键字决定了对象在映射中的存储位置,检索对象时必须提供相应的关键字,就像在字典中查单词一样。关键字应该是唯一的,也就是说Map中的键对象不允许重复,这是为了保证查询结果的一致性。

关键字本身并不能决定对象的存储位置,它需要对过一种散列(hashing)技术来处理,产生一个被称作散列码(hash

code)的整数值,散列码通常用作一个偏置量,该偏置量是相对于分配给映射的内存区域起始位置的,由此确定关键字/对象对的存储位置。理想情况下,散列处理应该产生给定范围内均匀分布的值,而且每个关键字应得到不同的散列码。

实现类:

HashMap实现一个键到值映射的哈希表,通过键取得值对象,没有顺序,通过get(key)来获取value,允许存储空对象,而且允许键是空(由于键必须是唯一的,当然只能有一个);

HashTable实现一个映象,所有的键必须非空。为了能高效的工作,定义键的类必须实现hashcode()方法和equal()方法。这个类是前面java实现的一个继承,并且通常能在实现映象的其他类中更好的使用。

当元素的顺序很重要时选用TreeMap,当元素不必以特定的顺序进行存储时,使用HashMap。Hashtable的使用不被推荐,因为HashMap提供了所有类似的功能,并且速度更快。当你需要在多线程环境下使用时,HashMap也可以转换为同步的。

Properties一般是把属性文件读入流中后,以键-值对的形式进行保存,以方便读取其中的数据。

4)、Iterator接口

Iterator接口位于java.util包中,它是一个对集合进行迭代的迭代器。

集合容器(如:List、Set、Map等)本身提供了处理元素置入和取出的方式,但是单一选取元素的方法很受限制。所以我们要用Iterator去选取容器中的元素,它将容器转换成一个序列。

Iterator iter=Object.iterator();

while(iter.hasNext()){   }

以下是笔者总结的一些面试中经常会问的相关问题:

1.Collection、Set和List的区别?

Collection对象之间没有指定的顺序,允许有重复元素和多个null元素对象;它是Set和List接口的父类,是一种最通用型的集合接口;

Set各个元素对象之间没有指定的顺序,不允许有重复元素,最多允许有一个null元素对象;

List各个元素对象之间有指定的顺序,允许重复元素和多个null元素对象;

2.LinkedList,ArrayList,Vector,Stack,Queue区别?NodeList区别?

1)LinkedList链式访问,以指针相连,适合于在链表中间需要频繁进行插入和删除操作。

2)ArrayList类似数组的形式,按照序号存储,随机访问速度非常快。

3)Vector向量按照各元素序号存储,数组大小可以动态增长,对于大容量数据存储效率较高。

4)Stack堆栈,先进后出的数组。

这些类的对比与选择:

如果涉及到堆栈队列等操作,应该考虑List中的stack,queue

对于需要快速插入删除元素,应该使用linkedlist

如果需要快速随机访问元素,应该选用arraylist

如果程序在单线程环境中,选用非同步类

如果在多线程中,选用同步类vector、stack和hashtable以及其子类。

几个面试常见问题:

ArrayList和Vector有什么区别?HashMap和HashTable有什么区别?

Vector和HashTable是线程同步的(synchronized)。性能上,ArrayList和HashMap分别比Vector和Hashtable要好。

讲解java集合的体系结构

A:List、Set、Map是这个集合体系中最主要的三个接口。

其中List和Set继承自Collection接口。

Set不允许元素重复。HashSet和TreeSet是两个主要的实现类。

List有序且允许元素重复。ArrayList、LinkedList和Vector是三个主要的实现类。

Map也属于集合系统,但和Collection接口不同。Map是key对value的映射集合,其中key列就是一个集合。key不能重复,但是value可以重复。HashMap、TreeMap和Hashtable是三个主要的实现类。

SortedSet和SortedMap接口对元素按指定规则排序,SortedMap是对key列进行排序

Comparable和Comparator区别

A:调用java.util.Collections.sort(List list)方法来进行排序的时候,List内的Object都必须实现了Comparable接口。


java.util.Collections.sort(List list,Comparator c),可以临时声明一个Comparator 来实现排序。

Collections.sort(imageList, new Comparator() {

public int compare(Object a, Object b) {

int orderA = Integer.parseInt( ( (Image) a).getSequence());

int orderB = Integer.parseInt( ( (Image) b).getSequence());

return orderA - orderB;

}

});



如果需要改变排列顺序

改成return orderb - orderA即可。

简述equals()和hashCode()

heap和stack有什么区别

1.heap是堆,stack是栈。

2.stack的空间由操作系统自动分配和释放,heap的空间是手动申请和释放的,heap常用new关键字来分配。

3.stack空间有限,heap的空间是很大的自由区。

若只是声明一个对象,则先在栈内存中为其分配地址空间,

若再new一下,实例化它,则在堆内存中为其分配地址。

接下来看看什么是NodeList,NodeList跟arguments都不是普通的数组,他们有数组的一些基本属性但是又不完全是数组。由字面意思来看NodeList是DOM操作(getElementsByTagName等)取出来的集合,是集合而不是普通的数组,但是他们有数组的一些属性,例如length、下标索     引,但是他们也有自己的属性,例如item,另外NodeList最大的特点就是时效性(live)。关于NodeList网上相关的资源不是很多,如果有读者对这       块内容比较熟悉,欢迎评论或发我邮箱1029666181@qq.com。

3.HashMap,HashTable,TreeMap,WeakHashMap的区别?ConcurrentHashMap区别?

关于HashMap,HashTable,TreeMap,上面已经说的非常详细了;

WeakHashMap是一种改进的hashmap,他对key进行弱引用,如果一个key不再被外部引用,则被gc回收;                         有兴趣深入理解WeakHashMap的朋友可以查看这个帖ttp://mikewang.blog.51cto.com/3826268/880775

ConcurrentHashMap是Java 5中支持高并发、高吞吐量的线程安全HashMap实现。允许多个修改操作并发进行,其关键在于使用了锁分离技术。          有兴趣升入理解ConcurrentHashMap的朋友可以查看这个贴http://www.iteye.com/topic/344876

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

推荐阅读更多精彩内容

  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,567评论 18 399
  • Collection ├List │├LinkedList │├ArrayList │└Vector │└Stac...
    AndyZX阅读 869评论 0 1
  • java笔记第一天 == 和 equals ==比较的比较的是两个变量的值是否相等,对于引用型变量表示的是两个变量...
    jmychou阅读 1,483评论 0 3
  • http://www.cnblogs.com/jasonHome/p/5969574.html 结合框架体系应该最...
    shhdjjj阅读 1,204评论 0 0
  • 文/郴小洁 -1- 在堂哥的婚礼上,我一直偷偷地在抹眼泪。不是未婚女青年恨嫁的泪水,而是终于明白爱情不是刚刚好包装...
    郴洁阅读 3,054评论 26 46