常用的List,Set,Map容器以及比较器

一、简述:

List,Set接口属于集合类容器,Collection接口是它们所有的父接口;
与List,Set接口不同,Map接口是所有Map类容器的父接口,通过键值对(key-value)的映射关系,用键(key)来找值(value)

二、一些常用接口特点:

  • Collection接口下:
  • List接口:有序的 collection(也称为序列)。此接口的用户可以对列表中每个元素的插入位置进行精确地控制。用户可以根据元素的整数索引(在列表中的位置)访问元素,并搜索列表中的元素。
    • **ArrayList:List **接口的大小可变数组的实现。实现了所有可选列表操作,并允许包括 null 在内的所有元素。 除了实现 List 接口外,此类还提供一些方法来操作内部用来存储列表的数组的大小。
      每个 ArrayList 实例都有一个容量。该容量是指用来存储列表元素的数组的大小。它总是至少等于列表的大小。随着向 ArrayList 中不断添加元素,其容量也自动增长。
    • **LinkedList:List **接口的链接列表实现。实现所有可选的列表操作,并且允许所有元素(包括 null)。除了实现 List 接口外,LinkedList 类还为在列表的开头及结尾 get、remove 和 insert 元素提供了统一的命名方法。这些操作允许将链接列表用作堆栈、队列或双端队列。
  • Set接口:一个不包含重复元素的 collection。更正式地说,set 不包含满足 e1.equals(e2) 的元素对 e1 和 e2,并且最多包含一个 null 元素
    • HashSet:此类实现 Set 接口,由哈希表(实际上是一个 HashMap 实例)支持。它不保证 set 的迭代顺序;特别是它不保证该顺序恒久不变。此类允许使用 null 元素。需要重写hashcode()方法和equals()方法。
    • TreeSet:使用元素的自然顺序对元素进行排序,或者根据创建 set 时提供的 Comparator (临时性的)或使元素实现comparable接口进行排序。
  • Map接口下:
  • HashMap:基于哈希表的 Map 接口的实现。此实现提供所有可选的映射操作,并允许使用 null 值和 null 键。此类不保证映射的顺序。

三、常用接口的功能:

  • List的功能:List的基本用法相当简单。虽然绝大多数时候,你只是用add()加对象,用get()取对象,用iterator()获取这个序列的Iterator,但List还有一些别的很有用的方法。
    List的最重要的特征就是有序;它会确保以一定的顺序保存元素。List在Collection的基础上添加了大量方法,并使之能在序列中间插入和删除元素(只对LinkedList推荐使用)。
    List可以制造ListIterator对象,你除了能用它在List的中间插入和删除元素之外,还能用它沿两个方法遍历List。
  • ArrayList:一个用数组实现的List。能进行快速的随机访问,但是往列表中间插入和删除元素的时候比较慢。ListIterator只能用在反向遍历ArrayList的场合,不要用它来插入和删除元素,因为相比LinkedList,在ArrayList里面用ListIterator的系统开销比较高。
  • LinkedList:对顺序访问进行了优化。在List中间插入和删除元素的代价也不高。随机访问的速度相对较慢(这点用ArrayList吧)。此外它还有addFirst(),addLast(),getFirst(),getLast(),removeFirst()和removeLast()等方法,你能把它当成栈(stack),队列(queue)或双向队列(deque)来实现后进先出,先进先出。
  • Set的功能:加入Set的每个元素必须是唯一的;否则,Set是不会把它加进去的。要想加进Set,Object必须定义equals(),这样才能标明对象的唯一性。
    Set的接口和Collection的一摸一样,Set的接口不保证它会用哪种顺序来存储元素(乱序)。
  • HashSet:为优化查询速度而设计的Set。要放进HashSet里面的Object还得定义hashCode()。
  • TreeSet:是一个有序的Set,其底层是一颗树。这样你就能从Set里面提取一个有序序列了。
    但是这里的顺序不一定是你想要的顺序。因此,在写自己的类的时候,一定要记住,Set要有一个判断以什么顺序来存储元素的标准,也就是说对象必须实现Comparable接口,并且定义compareTo()方法。
    亦或当你需要一个特定顺序的时候,实现Comparator方法也可以,相对来说,这种方法就比较临时性。
  • Map(HashMap)的功能:维持键--值的关系(既pairs),这样就能用键来找值了。提供恒定的插入与查询,put(key,value),get(key)。·

  • 用法

  • 在各种Lists中,最好的做法是以ArrayList作为有限选择。当插入、删除频繁时,使用LinkedList()。
  • 在各种Sets中,HashSet通常优于TreeSet(插入、查找)。只有当需要产生一个经过排序的序列,才用TreeSet。 TreeSet存在的唯一理由:能够维护其内元素的排序状态。
  • 在各种Maps中:HashMap用于快速查找。
  • 当元素个数固定,用Array,因为Array效率是最高的。

这些即是最常用的容器。

Comparable和Comparator的区别:

Comparable & Comparator 都是用来实现集合中元素的比较、排序的,只是 Comparable 是在对象内部定义的方法实现的排序,Comparator 是在对象外部实现的排序,所以,如想实现排序,就需要在对象外定义 Comparator 接口的方法或在对象内实现 Comparable 接口的方法。

Collections的sort()方法有两个重载有参方法:

Collections.sort((List<T> list)
Collections.sort((List<T> list, Comparator<? super T> c)```
- #####Comparable:提前做好准备
Comparable 是一个对象本身就已经支持自比较所需要实现的接口
自定义的类要在加入list容器中后能够排序,可以实现Comparable接口,再用```Collections.sort((List<T> list)```方法,此时的顺序就是Comparable接口设定的排序方式。

import java.util.Arrays;
public class User implements Comparable {
private String id;
private int age;
public User(String id, int age) {
this.id = id;
this.age = age;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
//实现Comparable接口需要实现此方法,此例类中比较年龄
public int compareTo(Object o) {
return this.age - ((User) o).getAge();
}
}

List<User> userList=new ArrayList<>();
userList.add(user1);
userList.add(user2);
userList.add(user3);
......
Collection.sort(userList);

- ####Comparator:临时性
 Comparator 是一个专用的比较器,当这个对象不支持自比较或者自比较函数不能满足你的要求时,你可以写一个比较器来完成两个对象之间大小的比较。
可以说Comparable是对象自已完成比较,Comparator是外部程序实现比较的而已。

import java.util.Arrays;
import java.util.Comparator;
public class UserComparator implements Comparator {
public int compare(Object o1, Object o2) {
return ((User) o1).getAge() - ((User) o2).getAge();
}
}

当User类没有实现Comparable时

List<User> userList=new ArrayList<>();
userList.add(user1);
userList.add(user2);
userList.add(user3);
......
Collection.sort(userList,new UserComparator());



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

推荐阅读更多精彩内容

  • 3.3 集合 一方面, 面向对象语言对事物的体现都是以对象的形式,为了方便对多个对象的操作,就要对对象进行存储。另...
    闫子扬阅读 679评论 0 1
  • 本篇文章带你从Java源码深入解析关于Java容器的概念。 参考文献: Java容器相关知识全面总结 Java官方...
    Tsy远阅读 19,719评论 13 142
  • 1.Java集合框架是什么?说出一些集合框架的优点? 每种编程语言中都有集合,最初的Java版本包含几种集合类:V...
    Oneisall_81a5阅读 892评论 0 11
  • Collection接口 Collection接口是所有集合的祖先类。他有两个构造方法,一个无参构造,一个是带Co...
    夜幕繁华阅读 567评论 0 0
  • 文/月中山 上一章 / 简介+目录 / 下一章 一整节课下来,孟杰都心不在焉,她有时会想起那一日在溜冰场的时...
    月中山阅读 200评论 0 4