13.集合概述和相关数据结构(单列集合)

集合

集合 : 数据的合集 -> 容器

集合的特点:
    1. 长度可变 -> 集合的好处,也是集合取代数组的根本原因
    2. 只能存储引用数据类型元素(集合中装不了基本数据类型元素) -> 集合的弊端(弊端被解决了-> 包装类)
    3. 集合分为单列和双列集合
    4. 集合的本质 : 数组(可变数组是因为底层源码在帮助扩容) + 数据结构(如何存储数据)
        
学习容器的方法:
    1. 如何创建容器(如何连接数据库 -> JavaDataBaseCollect)
    2. CRUD -> 增删改查    
    3. 如何遍历容器

单列集合概述

单列集合的概述 : "长度可变的数组"
    
特点 :

    1. 长度可变 -> 集合的好处,也是集合取代数组的根本原因
    2. 只能存储引用数据类型元素(集合中装不了基本数据类型元素) -> 集合的弊端(弊端被解决了-> 包装类)
    3. 集合分为单列和双列集合
    4. 集合的本质 : 数组(可变数组是因为底层源码在帮助扩容) + 数据结构(如何存储数据)
    5. 单列 : 元素以一列的形式存储

单列集合的体系结构

Collection<E>接口

Collection<E>接口 : 单列集合的根节点 

特点 :
    1. 长度可变
    2. 元素只能是引用数据类型
    3. 一个容器中的元素类型必须一致
    
1. 创建对象(创建容器)    

//利用多态创建Collection对象
Collection<E> 集合名 = new 具体的实现类<>();
格式解释 :
      <E> : 泛型 --> E的类型决定了集合中元素的数据类型(约束)
      如何使用 : 在具体创建一个集合对象时,拿具体的引用数据类型类名替换E即可 (当E是什么类型,集合中的元素必须是此类型的对象) 
            //注意 : E 只能拿引用数据类型类名替换 
            //注意 : 等号右边的<>内,在JDK7之后可以省略E类型
            //注意 : 没有写<E> , E : 默认是 Object
       举例 : Collection<String> col = new ArrayList<>(); 
       举例 : Collection<Integer> col = new HashSet<>(); 

2. 增删改查四类操作
增 : add

boolean add(E e)  : 
        //如果等号右边new是ArrayList : 往集合中依次添加元素,永远返回true
        //如果等号右边new是HashSet : 往集合中添加元素,返回添加是否成功
boolean addAll(Collection<? extends E> c)  : 把实参集合中的所有元素全部添加到调用方法集合中

删 : remove

boolean remove(Object o)  : 根据传入的元素删除集合中的该元素,返回删除是否成功
void clear() 清空集合中的所有元素

改 :因为没有索引,所以Collection集合没有set方法
查 : get 

因为没有索引,所以Collection集合没有get方法
int size() : 返回集合的长度和集合中元素的个数
        
boolean contains(Object o) : 查询集合中是否包含传入的o对象
boolean isEmpty() : 查询集合是否为空集合 (size = 0)

3. 遍历容器
    1. 转数组 Object[] toArray()  
    2. 普通迭代器 Iterator<E> iterator()  
    3. 增强for

Iterator<E>迭代器

Iterator<E>迭代器 : 专门用来遍历的对象类型

boolean hasNext() : 判断是否有下一个元素
E next() : 获取下一个元素

步骤:
    1. 获取迭代器对象
    2. 通过while循环的条件判断语句 判断集合中是否还有下一个元素
    3. 如果有 通过迭代器对象获取下一个元素
    
    ConcurrentModificationException : 并发修改异常
        产生的原因 : 在使用迭代器对象遍历集合时,使用集合对象对原集合进行修改(增,删,改),就会发生这个异常
            //只要迭代器对象产生了,使用原集合对象对集合进行修改就会出并发修改异常
       
 并行 : 一个时刻,多个事情发生了
 并发 : 一段时间,多个事情发生了

增强for

增强for : 新的循环格式,此循环的作用用来遍历 单列集合 和 数组的

格式 :

    for(元素类型 变量名: 单列集合对象/数组对象){
        //操作变量名 --> 变量在依次接收集合/数组中的元素
    }

   增强for的底层原理 : 看不见的迭代器对象帮助你遍历

好处 : 格式简单
弊端 : 因为会产生并发修改异常,所以不能在增强for循环内对原集合进行修改

细节 :
        当增强for循环遍历单列集合的时候,底层是迭代器
        当增强for循环遍历数组的时候,底层是 fori

List<E>接口

List<E>接口 : 元素可重复,元素有索引,元素存取有序的单列集合根节点

1. 创建对象(创建容器)    

//利用多态创建List<E>对象
List<E> 集合名 = new 具体的实现类<>();
举例 : List<String> list = new ArrayList<>(); 
举例 : List<Integer> list = new LinkedList<>(); 

2. 增删改查四类操作 //List相较于Collection 新增了关于索引的操作
增 : add

boolean add(E e)  : 依次添加元素,永远返回true
void add(int index, E element) : 在指定的索引位置插入元素
boolean addAll(Collection<? extends E> c)  : 把实参集合中的所有元素全部添加到调用方法集合中

 删 : remove

boolean remove(Object o)  : 根据传入的元素删除集合中的该元素,返回删除是否成功
E remove(int index) : 根据传入的索引,删除指定索引位置上的元素,并把被删除的元素返回
void clear() 清空集合中的所有元素

改 : 

E set(int index, E element) : 修改指定索引位置上的元素,并返回被修改的元素 
             int index : 被修改元素的索引
             E element : 替换的值
             返回值 E : 被修改的元素

查 : 

E get(int index) : 获取指定索引位置上的元素
int size() : 返回集合的长度和集合中元素的个数
        
boolean contains(Object o) : 查询集合中是否包含传入的o对象
boolean isEmpty() : 查询集合是否为空集合 (size = 0)
int indexOf(Object o) : 查询o元素第一次出现在集合中的索引位置,不存在返回-1
int lastIndexOf(Object o)  : 查询o元素最后一次出现在集合中的索引位置,不存在返回-1    

3. 遍历容器
    1. 转数组 Object[] toArray()  
    2. 普通迭代器 Iterator<E> iterator()  
    3. 增强for
    4. 普通for 
    5. 列表迭代器 (List集合的专属迭代器) ListIterator<E> listIterator()  

ListIterator<E>列表迭代器

ListIterator<E>列表迭代器  --> List集合的专属迭代器

步骤:
    1. 获取迭代器对象
    2. 通过while循环的条件判断语句 判断集合中是否还有下一个元素
    3. 如果有 通过迭代器对象获取下一个元素
    
ListIterator<E>列表迭代器 : 解决了并发修改异常 
    并发修改异常 : 在使用迭代器对象遍历集合时,使用原集合对象对集合进行修改,导致了镜像和原集合的内容不一致,所以报并发修改异常
    解决并发修改异常的方法:
        1. 不修改
        2. 使用列表迭代器操作 -> 先修改镜像内容,再同步到原集合中

ArrayList<E>集合

ArrayList<E>集合 : 最常用的元素可以重复,元素有索引,元素存取有序的单列集合

创建对象 :
    ArrayList<E> 集合名 = new ArrayList<E>();

增删改查四类功能 :
增 : add

boolean add(E e) : 依次添加,永远返回true
void add(int index,E e) : 插入添加

删 : remove

boolean remove(Object obj): 按照元素值删,返回删除是否成功
E remove(int index) : 按照索引值删除指定元素,返回被删除的元素
void clear(): 清空集合内容

改 : set

E set(int index,E element) : 修改指定索引位置的元素,返回被修改的元素

查 : get

E get(int index) : 获取指定索引位置的元素
int size(): 获取集合中的元素个数和长度
        
boolean contains(Object obj) : 查询是否包含传入的元素
boolean isEmpty(): 查询集合是否为空
int indexOf(Object obj) : 查询传入的元素第一次出现在集合的索引位置,不存在返回-1
int lastIndexOf(Object obj) : 查询传入的元素最后一次出现在集合的索引位置,不存在返回-1

遍历 :
    1. 转数组 Object[] toArray()
    2. 普通迭代器 Iterator<E> iterator()
    3. 增强for -> 集合名.for
    4. 普通for -> 集合名.fori
    5. 列表迭代器 -> ListIterator<E> listIterator()

ArrayList<E>的底层原理分析

例:往ArrayList<E>中添加第1024个元素,请问ArrayList<E>集合的底层数组的长度是多少 ?  1234
    
集合 = 数组 + 数据结构;   

原理 :
    1. 在创建ArrayList<E>集合,底层源码会创建一个长度为0的数组;
    2. 当第一次添加元素时,重新创建一个长度为10的数组,并把这个元素添加到数组索引0的位置
    3. 当添加第十一个元素时,重新创建一个长度为15的数组,把原数组中的所有元素复制到新数组中并把这个新元素添加到数组索引10的位置 
    4. 每当底层数组的容量不够用时,都会扩容老数组 --> 新数组的长度 = 老数组长度 + (老数组长度 >> 1);    
            
//新数组的长度老数组的长度 的 1.5倍
    5. 当集合底层数组长度无法再扩容1.5倍时:
        如果现在的集合底层数组长度没有超过(int最大值 - 8),那么新数组的长度就是 int最大值 - 8
        如果现在的集合底层数据组长度超过了(int最大值 - 8),那么新数组的长度就是 int最大值

数据结构

数据结构 : 数据在容器中的存储逻辑(算法)

数据结构的分类 :
    栈和队列
    数组和链表
    哈希表
    红黑树
    ..
        
集合的命名方式 : 数据结构 + 集合类型  

数据结构之栈和队列

数据结构之数组结构

数据结构之单向链表

数据结构之双向链表

LinkedList<E>集合

LinkedList<E>集合 底层数据结构是双向链表的单列集合实现

因为它是List<E>接口下的实现集合,所以它具备所有List接口的方法

特殊行为 : 

void addFirst(E e) 
void addLast(E e)     
E    removeFirst()  
E    removeLast()  
E    getFirst()  
E    getLast()   

节点的类型 : 证明LinkedList底层使用的是双向链表

    private static class Node<E> {
        //成员变量 : 属性
        E item;//节点对象存储的元素值
        Node<E> next;//绑定下一个node对象的地址值
        Node<E> prev;//绑定上一个node对象的地址值

        //构造方法
        Node(Node<E> prev, E element, Node<E> next) {
            this.item = element;
            this.next = next;
            this.prev = prev;
        }
    }

Vector<E>集合

Vector<E>集合 : 最早的单列集合 出生于JDK1.0
    从JDK1.2板块并入到集合的体系,被ArrayList取代;

    Vector<E>集合 是同步的,所以是线程安全的; 如果在多线程场景下,单列集合推荐使用Vector<E>

Set<E>集合

Set<E>集合 : 元素唯一,元素无索引,元素存取无序的单列集合的根节点 --> 接口

构造方法:

//以多态的形式创建Set集合
Set<E> 集合名 = new 具体的实现类集合<>(); //HashSet,TreeSet

增删改查:
增 : add

boolean add(E e) : 添加元素,返回元素添加是否成功 (元素唯一)

删 : remove

boolean remove(Object obj) : 按照元素值删除元素,返回删除是否成功
void clear(): 清空集合

改 : set 因为没有索引所以不能修改指定位置的元素
    
查 : get 因为没有索引所以不能获取指定位置的元素    

int size() : 获取长度
boolean isEmpty() : 判断集合是否为空
boolean contains(Object obj) : 判断传入的元素是否存在于集合中

遍历:
    1. 转数组
         Object[] toArray()
    2. 普通迭代器
         Iterator<E> iterator() 
    3. 增强for (Iterable)
         集合名.for

HashSet<E>集合

HashSet<E>集合 : 底层数据结构是hash表结构的set集合实现
    hash表结构完成 : 元素去重逻辑,元素存储位置的逻辑
    
构造方法:

HashSet<E> 集合名 = new HashSet<>(); 

增删改查:
    增 : add

boolean add(E e) : 添加元素,返回元素添加是否成功 (元素唯一)

删 : remove

boolean remove(Object obj) : 按照元素值删除元素,返回删除是否成功
void clear(): 清空集合

改 : set 因为没有索引所以不能修改指定位置的元素
    
查 : get 因为没有索引所以不能获取指定位置的元素    

int size() : 获取长度
boolean isEmpty() : 判断集合是否为空
boolean contains(Object obj) : 判断传入的元素是否存在于集合中

遍历:
    1. 转数组
         Object[] toArray()
    2. 普通迭代器
         Iterator<E> iterator() 
    3. 增强for (Iterable)
         集合名.for    

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值