Java集合(Collection)

概述

概念:集合类(Collection)存放于java.util包中,是用来管理一组对象的单一对象。

集合类存放的都是对象的引用(即地址信息),而非对象本身,出于表达上的便利,我们称集合中的对象就是指集合中对象的引用。

集合内的对象被称之为元素(elements)。
通常,集合可以处理很多种类型的对象,这些对象都有一个共同的父类Object

分类

java的集合框架可以简化为如下图所示(本图来自于《Java核心编程技术(第二版)》):
在这里插入图片描述
再细化:
在这里插入图片描述
可以看出java集合框架主要提供三种类型的集合(Set,List,Map)和一个迭代器。
集合类型主要有3种:Set(集)、List(列表)和Map(映射)。

(1)集(Set)

集(set)的对象无排列顺序,只是简单的把对象加入集合中,就像往口袋里放东西。

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

Set判断集合中两个对象相同不是使用"=="运算符,而是根据equals方法。每次加入一个新对象时,如果这个新对象和当前Set中已有对象进行equals方法比较都返回false时,则允许添加对象,否则不允许。

Set集合的主要实现类:

  1. HashSet:按照哈希算法来存储集合中的对象,速度较快。
  2. LinkedHashSet:不仅实现了哈希算法,还实现了链表的数据结构,提供了插入和删除的功能。当遍历LinkedHashSet集合里的元素时,LinkedHashSet将会按元素的添加顺序来访问集合里的元素。
  3. TreeSet:实现了SortedSet接口(此接口主要用于排序操作,即实现此接口的子类都属于排序的子类)也就是加入了对象比较的方法。通过对集中的对象迭代,我们可以得到一个升序的对象集合。
  4. EnumSet:专门为枚举类设计的有序集合类,EnumSet中所有元素都必须是指定枚举类型的枚举值,该枚举类型在创建EnumSet时显式、或隐式地指定。

(2)列表(List)

列表(List)的主要特征是其对象以线性方式存储,默认按元素的添加顺序设置元素的索引,没有特定顺序,只有一个开头和一个结尾。
List中的对象按照索引的顺序排序,可以有重复的对象。List与数组相似。

List集合的主要实现类:

  1. ArrayList:可以理解为长度可变的数组。可以对集合中的元素快速随机访问,但是做插入或删除操作时效率较低。
  2. LinkedList:使用链表的数据接口。
    与ArrayList相反,插入或删除操作时速度快,但是随机访问速度慢。
    同时实现List接口和Deque接口,能对它进行队列操作,即可以根据索引来随机访问集合中的元素,也能将LinkedList当作"双端队列"使用,自然也可以被当作"栈"来使用(可以实现“FIFO先进先出,FILO后入先出”)。

(3)映射(Map)

映射与集或列表有明显区别,映射中每个项都是成对的。

Map是一种把键对象(key)和值对象(value)进行映射的集合(k-v)。k相当于v的索引,v仍然可以是Map类型(k-v)。
key和value都可以是任何引用类型的数据。
Map的key不允许重复,即同一个Map对象的任何两个key通过equals方法比较结果总是返回false。
key集的存储形式和Set集合完全相同(即key不能重复)
value集的存储形式和List非常类似(即value可以重复、根据索引来查找)

映射中存储的每个对象都有一个相关的关键字(Key)对象,关键字决定了对象在映射中的存储位置,检索对象时必须提供相应的关键字,就像在字典中查单词一样。并且,关键字应该是唯一的。

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

Map集合的主要实现类:

  1. HashMap:按照哈希算法来存取key,有很好的存取性能,和HashSet一样,要求覆盖equals()方法和hasCode()方法,同时也不能保证集合中每个key-value对的顺序。
  2. LinkedHashMap:使用双向链表来维护key-value对的次序,该链表负责维护Map的迭代顺序,与key-value对的插入顺序一致。
  3. TreeMap:一个红黑树数据结构,每个key-value对即作为红黑树的一个节点。实现了SortedMap接口,能对key进行排序。TreeMap可以保证所有的key-value对处于有序状态。同样,TreeMap也有两种排序方式(自然排序、定制排序)

Set,List,Map的比较

在这里插入图片描述
在这里插入图片描述
1、Set(无序、不能重复)
Set里存放的对象是无序,不能重复的,集合中的对象不按特定的方式排序,只是简单地把对象加入集合中。

2、List(有序、可重复)
List里存放的对象是有序的,同时也是可以重复的,List关注的是索引,拥有一系列和索引相关的方法,查询速度快。因为往List集合里插入或删除数据时,会伴随着后面数据的移动,所有插入删除数据速度慢。

3、Map(键值对、键唯一、值不唯一)
Map集合中存储的是键值对,键不能重复,值可以重复。根据键得到值,对Map集合遍历时先得到键的Set集合,对Set集合进行遍历,得到相应的值。

集合底层数据结构和基本性质

List集合(有序,元素可以重复)

        1.ArrayList集合:
              1)底层数据结构是数组,查找快,增删慢。
              2)线程不安全,效率高

        2.Vector集合:
               1) 底层数据结构是数组,查询快,增删慢
               2)线程安全,效率低

        3.LinkedList集合:
               1) 底层数据结构是链表,查询慢,增删快
               2)线程不安全,效率高

Set集合(元素不可重复,元素唯一)

          1.Hashset集合:
               1) 底层数据结构是哈希表,哈希表依赖两个方法hascode ()和equals()方法                  
             
               2)两个方法的执行顺序:
             	 	 首先判断hascode()值是否相同
                   			 相同:继续执行equals()方法,看其返回值
                      	  			true: 说明元素重复,不添加
      								false:就直接添加元素
 							 不相同:就直接添加到集合
 							 
          2.Treeset集合:
               1)底层数据结构是二叉树

Map集合

   1.  java中的Map集合是双列的,Map集合是Map集合家族的根接口,它有HashMap和TreeMap集合两个子类。

   2. Map集合中只对键有效,而对值是无效的。

   3.子类的数据结构:
   		 Hashmap:底层数据结构是哈希表
  		 Treemap:底层数据结构是二叉树。其性质和Set的底层数据结构一样。

集合和数组

在这里插入图片描述
相同点:
都是存储数据的容器,存储Object类型时,其实存储的都是对象的引用(地址)
不同点:
(1)数组可以存储基本数据类型,集合不可以;
(2)数组的长度固定,对象数量未知时不适合使用,
集合的长度可变,适用性比较广。

使用集合

Lists:
最好的做法是以ArrayList作为缺省选择。
当插入、删除频繁时,使用LinkedList()

Sets:
HashSet通常优于TreeSet(插入、查找)。只有当需要产生一个经过排序的序列,才用TreeSet。TreeSet能够维护其内元素的排序状态。

在各种Maps中HashMap用于快速查找。

当元素个数固定,用Array,因为Array效率是最高的。

结论:最常用的是ArrayList,HashSet,HashMap,Array。

集合的简单应用:

在这里插入图片描述

List和Map的区别

存储结构不同:
List是存储单列的集合
Map存储的是双列(key-value键值对)的集合

元素是否可重复:
List允许元素重复
Map不允许key重复,value可以重复

是否有序:
List集合是有序的(存储有序)
Map集合是无序的(存储无序)

ArrayList和LinkedList的区别

ArrayList的底层是数组,LinkedList的底层是双向链表(一个元素内同时存储了上一个元素和下一个元素的地址) 。

优缺点:
ArrayList它支持以角标位置进行索引出对应的元素(随机访问),而LinkedList则需要通过移动指针,遍历整个链表来获取对应的元素。因此一般来说ArrayList的随机访问速度是要比LinkedList快的。

对于删除和修改而言,ArrayList由于是数组,消耗是比较大,它要通过复制和移动数组实现。而LinkedList是双向链表,删除和修改只需要修改对应的指针即可,消耗是很小的。因此一般来说LinkedList的增删速度是要比ArrayList要快的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值