集合

集合概述

集合是Java中提供的一种容器,可以用来存储多个数据。

集合和数组的区别

区别

  • 数组长度固定
    集合长度可变

  • 数组中存储的是同一种数据类型的元素,可以存储基本数据类型,也可以存储引用数据类型;
    集合存储的都是对象,而且对象的数据类型可以不一致。在开发当中一般当对象较多的时候,使用集合来存储对象。

集合的框架

集合根据其存储结构把他分为两大类:

  • 单列集合 java.util.Collection

  • 双列集合 java.util.Map

Collection集合

概述

它是单列集合的根接口,用于存储一系列符合某种规则的元素,他有两种重要的子接口,分别是java.util.List 和 java.util.Set。其中,List接口集合特点:元素有序,元素可重复,含有索引。Set接口特点:元素不重复,没有索引。List接口的主要实现类有:java.util.ArrayList和java.util.LinkedList,Set接口的主要实现类有:java.util.HashSet和java.util.TreeSet。
单列集合体系
备注:绿色的是底层实现类,蓝色的是接口类型

Collection集合常用功能

Collection集合是所有单列集合的父接口,在Collection集合当中定义所有单列集合的共性的API方法,这些方法适用于所有的单列集合。增删改查功能(crud操作)

  • public boolean add(E e): 把给定的对象添加到当前的集合当中。
  • public void clear(): 清空集合当中的所有的元素。
  • public boolean remove(E e): 把给定的对象从当前集合当中删除掉。
  • public boolean contains(E e): 判断当前集合当中是否包含给定的对象元素。
  • public booolean isEmpty(): 判断当前集合是否为空。
  • public int size(): 获取当前集合元素的个数 capacity() length()
  • public Objectp[] toArray(): 把当前集合中元素,存储到一个数组当中。

List集合

我们主要介绍java.util.List集合和java.util.Set集合

List接口介绍

java.util.List 接口继承自Collection接口,是单列集合的一个重要分支,在List集合当中允许出现重复的元素,所有的元素都是以一种线性方式进行存储的,在List集合当中基本上我们可以通过索引来访问集合当中的元素,另外List集合还有一个特点就是元素是有序的,指的是存取元素顺序相同。

List接口当中的常用API方法:增删改查

除了继承Collection接口当中的方法外,还增加了一些根据元素索引来操作集合的特定方法:

  • public void add(int index,E element): 将指定的元素,添加到给定集合中的指定位置上
  • public E get(int index): 根据指定的索引获取对那个位置上的元素
  • public E remove(int index): 通过索引删除索引对应位置上的元素
  • public E set(int index,E element): 在指定索引位置上替换成给定的数据元素,并且返回更新前的元素

代码如下:

嘿嘿,没有

List集合的子类

ArrayList集合

有索引,有序,元素可重复,长度可变的数组,可以存储null的数组,增删慢,查询快

效率低,不建议用

LinkedList集合

java.util.LinkedList 集合数据存储的结构采用的是链表结构,方便元素的添加和删除操作。此外【LinkedList是一个双向链表】,特点:增删快,查询慢,在LiskedList集合当中,封装了大量的关于首节点和尾节点的元素操作的方法。

方法如下

  • public void addFirst(E e): 将指定的元素插入到首节点位置。
  • public void addLast(E e): 将指定的元素插入到尾节点的位置上
  • public E getFirst(): 获取首节点的元素
  • public E getLast(): 获取尾节点的元素
  • public E removeFirst(): 删除首节点元素
  • public E removeLast(): 删除尾节点的元素
  • public E pop(): 从此列表所表示的堆栈中弹出一个元素
  • public void push(E e): 将元素推入到此列表所表示的堆栈当中
  • public boolean isEmpty(): 如果此列表不包含任何元素,则返回true。

Set接口

java.util.Set 接口和java.util.List 接口是一样的,都是继承自Collection接口,它与Collection接口中的方法基本一样,没有对Collection接口进行功能上的扩展,只是比Collection接口更加严格。与List接口不同的是,Set接口中的元素是无序的,并且都会以某种规则保证存入元素的不重复。

Set接口有很多个子类,我们主要介绍两个重要子类:java.util.HashSetjava.util.LinkedHashSet 集合

Set集合取出元素的方式可以采用:迭代器、增强for循环。

HashSet集合介绍

java.util.HashSet 是Set接口的一个实现类,它存储的元素是不可重复的,并且元素都是无序的(存取顺序不一致)。

java.util.HashSet 底层的实现其实是一个java.util.HashMap 支持的。

HashSet 是根据对象的哈希值来确定元素在集合当中的存储位置,因此它具有良好的存取和查找性能。保证元素唯一性的方式依赖于hashCodeequals 方法

HashSet集合存储数据的结构(哈希表)

什么是哈希表呢?

在JDK1.8之前,哈希表的底层采用的是数组+链表实现,即使用链表处理哈希冲突,同一哈希值的链表都存储在一个链表里,但是当位于一个链中的元素较多时,即hash值相等的元素较多时,通过key值依次查找的效率很低下。在JDK1.8中,哈希表存储结构采用数组+链表实现的,当链表的长度超过阈值(8)时,将链表转换成红黑树结构,这样的好处是大大减少了查找的时间

如图:
在这里插入图片描述
总而言之,JDK1.8之后引入了红黑数结构,大大优化的HashMap的性能,那么对于我们来讲保证HashSet元素唯一不重复,其实是根据对象的hashCode和equals方法来决定的。如果我们往集合当中存储的是自定义的对象,需要保证对象的唯一性,就必须重写HashCode和equals方法,来自定义当前对象的比较方式。

HashSet存储自定义类型的元素

一般需要重写对象当中的hashCode和equals方法,建立自己的比较方式。才能保证HashSet集合中元素的唯一性。

LinkedHashSet集合

我们知道HashSet保证元素的唯一,可是存进去的元素是没有顺序的,那么如何抱证存进去的元素是有序的呢?

java.util.HashSet 类的下面还有一个子类java.util.LinkedHashSet ,它是链表和哈希表的组合的一个数据存储结构

Map集合

概述

现实生活中,我们常会看到这样一种集合:IP地址和主机名,身份证号和个人,系统用户名与系统用户对象等,这种是一一对应的关系,我们把这种一一对应的关系称之为映射。Java当中提供了专门的集合类用来存放这种映射关系的对象。即java.util.Map 接口。

通过如下图发现Collection接口集合和Map接口集合存储数据的方式不一样
在这里插入图片描述

  • Collection中的集合,元素是孤立存在的(单身),向集合中存储元素采用一个一个元素存储的方式进行存储。
  • Map中的集合,元素是成对存在的(夫妻),每个元素由键和值两部分组成。通过键可以找到对应的值。
  • Collection中的集合我们称之为单列集合,Map中的集合我们称之为双列集合
  • 注意:Map中的集合不能包含重复的键,值可以重复,每个键对应唯一一个值。

Map中的常用子类

通过查看API帮助文档发现由很多个子类,我们主要介绍HashMap集合、LinkedHashMap集合、HashTable集合

  • HashMap: 存储数据采用的是哈希表结构,元素的存取顺序可能不一致,由于要保证键的唯一性,不重复,需要重写键的hashCode方法和equals方法。
  • LinkedHashMap:HashMap下面的子类,存储数据的方式也是采用哈希表+链表结构,通过链表结构可以证元素的存取顺序一致通过哈希表结构可以保证键的唯一、不重复,需要重写键的hashCode方法和equals方法

备注:Map接口当中,含有两个泛型变量,在使用时,要为两个泛型变量赋予数据类型,两个泛型变量的数据类型可以相同,也可以不同。

Map接口当中的常用API方法

常用方法如下:

  • public V put(K key,V value): 把指定的键与指定的值添加到Map集合当中
  • public V remove(Object key): 把指定的键所对应的键值对元素从Map集合当中删除,返回的是被删除元素的值
  • public V get(Object key): 根据指定的键 获得在Map集合当中对应的值
  • public Set keySet(): 获取Map集合当中的所有的key值,存储到Set集合当中
  • public Set<Map.Entry<K,V>> entrySet(): 获取到Map集合当中的所有的键值对对象的集合(Set集合)
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值