Java基础-集合概述

面向对象语言对事物的体现都是以对象的形式,为了方便对多个对象的操作,就要对对象进行存储。另一方面,使用Array存储对象方面具有一些弊端,而Java 集合就像一种容器,可以动态地把多个对象的引用放入容器中。

数组的弊端

数组初始化以后,长度就确定了,不便于扩展;数组声明的类型,就决定了进行元素初始化时的类型,数组中提供的属性和方法少,不便于进行添加、删除、插入等操作, 且效率不高。

Java集合的组成

Java-base-collection-impl

图解:

  • Collection接口:单列集合,用来存储一个一个的对象。
  • List接口:存储有序的、可重复的数据。也称为“动态”数组。
  • Set接口:存储无序的、不可重复的数据 。高中讲的“集合”
  • Map接口:双列集合,用来存储一对(key - value)一对的数据 -->高中函数:y = f(x)

java集合Collection是一个接口类,它是ListSetMap的父接口,Collection接口中定义了许多方法,JDK中不提供该接口的任何直接实现,而是提供更具体的子接口的实现。在 Java5 之前, Java 集合会丢失容器中所有对象的数据类型,把所有对象都当成 Object 类型处理; 从 JDK 5.0 增加了泛型以后, Java 集合可以记住容器中对象的数据类型。

Collection的接口方法

方法签名 方法介绍
add(Object obj) 添加单个元素
addAll(Collection collection) 添加所给集合中的所有元素
clear() 清空集合
isEmpty() 判断是否是空集合
contains(Object obj) 判断集合中是否包含某个元素(通过元素的equal方法来判断是否是同一个对象)
containsAll(Collection col) 判断集合中是否包含给定集合中的元素(也是用equals来判断是否相等)
remove(Object obj) 移除某个元素(通过equals方法参照元素)
removeAll(Collection col) 取当前集合的差集
equals(Collection col) 判断与集合是否相等
toArray() 转换成对象数组
hashCode() 获取元素的哈希值
Iterator() 返回迭代器对象

Iterator迭代器

Collection接口也继承了Iterable,所以可以使用迭代器来遍历对象。

  • 内部方法包含hasNext()next()
  • 集合对象每次调用iterator()方法都得到一个全新的迭代器对象,默认游标都在集合的第一个元素之前。
  • 内部定义了remove(),可以在遍历的时候,删除集合中的元素。此方法不同于集合直接调用remove()
  // 创建集合
  Collection coll = new ArrayList();
  coll.add(123);
  coll.add(456); 
  coll.add(new String("Tom"));
  coll.add(false); 
    // 遍历集合
  iterator = coll.iterator();
  while (iterator.hasNext()){
    System.out.println(iterator.next());
  }

List接口

List接口是用来存储有序的、可重复的数据,我们常常用来当成“动态”数组。它有三个实现类,分别是ArrayListLinkedListVector,它们的实现方式和数据结构均有所不同,所以合适使用的的场景也不一样。

实现类 时间 描述
Vector JDK1.0 作为List接口的古老实现类;线程安全的,效率低;底层使用Object[] elementData存储
ArrayList JDK 1.2 作为List接口的主要实现类;线程不安全的,效率高;底层用Object[] elementData存储
LinkedList JDK1.2 对于频繁的插入、删除操作,使用此类效率比ArrayList高;底层使用双向链表存储

ArrayListLinkedListVector三者的异同?

​ 三个类都是实现了List接口,存储数据的特点相同:存储有序的、可重复的数据.不同点就是各自底层的数据结构不同,以及他们的多线程安全性也不同。

Set接口

Set接口是用来存储无序、不可重复的数据。它有三个实现类:HashSetLinkedHashSetTreeSet

实现类 时间 描述
HashSet JDK1.2 作为Set接口的主要实现类;线程不安全的;可以存储null值
LinkedHashSet JDK 1.2 作为HashSet的子类;遍历其内部数据时,可以按照添加的顺序遍历
TreeSet JDK1.2 可以按照添加对象的指定属性,进行排序或自定义排序。

HashSet特点:

  • 无序性:不等于随机性。存储的数据在底层数组中并非按照数组索引的顺序添加,而是根据数据的哈希值决定的。
  • 不可重复性:保证添加的元素按照equals()判断时,不能返回true.即:相同的元素只能添加一个。

Map接口

Map接口是用来存储键值对的,它是一个双列数据结构。

他的实现类有HashMapLinkedHashMapTreeMapHashtable以及Properties

实现类 时间 描述
Hashtable JDK1.0 作为古老的实现类;线程安全的,效率低;不能存储null的key和value
Properties JDK 1.0 作为Hashtable的子类;常用来处理配置文件。key和value都是String类型
HashMap JDK1.2 作为Map的主要实现类;线程不安全的,效率高;存储null的key和value
LinkedHashMap JDK 1.2 保证在遍历map元素时,可以按照添加的顺序实现遍历。原因:在原有的HashMap底层结构基础上,添加了一对指针,指向前一个和后一个元素。
TreeMap JDK 1.2 保证按照添加的key-value对进行排序,实现排序遍历。此时考虑key的自然排序或定制排序

Map中的key:无序的、不可重复的,使用Set存储所有的key ---> key所在的类要重写equals()和hashCode() (以HashMap为例)

  • Map中的value:无序的、可重复的,使用Collection存储所有的value --->value所在的类要重写equals()一个键值对:key-value构成了一个Entry对象。

  • Map中的entry:无序的、不可重复的,使用Set存储所有的entry

Collections工具类

Collections 是一个操作SetListMap 等集合的工具类,Collections 中提供了一系列静态的方法对集合元素进行排序、查询和修改等操作,还提供了对集合对象设置不可变、对集合对象实现同步控制等方法。

排序操作

方法名 方法简介
reverse(List) 反转 List 中元素的顺序
shuffle(List) 对 List 集合元素进行随机排序
sort(List) 根据元素的自然顺序对指定 List 集合元素按升序排序
sort(List, Comparator) 根据指定的 Comparator 产生的顺序对 List 集合元素进行排序
swap(List, int, int) 将指定 list 集合中的 i 处元素和 j 处元素进行交换

查找/替换

方法名 方法简介
Object max(Collection) 根据元素的自然顺序,返回给定集合中的最大元素
Object max(Collection, Comparator) 根据 Comparator 指定的顺序,返回给定集合中的最大元素
Object min(Collection) 根据元素的自然顺序,返回给定集合中的最小元素
Object min(Collection, Comparator) 根据 Comparator 指定的顺序,返回给定集合中的最小元素
int frequency(Collection, Object) 返回指定集合中指定元素的出现次数
void copy(List dest,List src) 将src中的内容复制到dest中
replaceAll(List list,Object oldVal,Object newVal) 使用新值替换List 对象的所有旧值

同步控制

Collections类中提供了多个 synchronizedXxx()方法,该方法可使将指定集合包装成线程同步的集合,从而可以解决多线程并发访问集合时的线程安全问题

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