Collection

本文介绍了Java集合框架,包括Collection接口、List接口及其特点和子类ArrayList、LinkedList,Set接口中的HashSet、LinkedHashSet、TreeSet,以及Map接口的使用,强调了并发修改异常及其解决方案,并探讨了各种集合的数据结构和操作效率。
摘要由CSDN通过智能技术生成

集合类的特点:提供一种存储空间可变的存储模型,存储的数据容量可以随时发生改变

在集合中使用泛型的类型的都是用引用类型,基本数据类型会报错
大致结构图
集合
Colletcion 单列
Map 双列
List 可重复
ArrayList
LinkkedList
....
Set 不可重复
HashSet
TressSet
...
HashMap
...

红色是接口
蓝色是实现类

collection集合概述

  • 是单例集合的顶层接口,它表示一组对象,这些对象也称为Collection元素
  • JDK不提供此接口的任何直接实现,它提供更具体的子接口(如Set和List)实现
  • 创建Collection集合的对象
    • 使用 多态的方式

List集合概述和特点

  • List集合概述
    • 有序集合(也称为序列),用户可以精确控制列表中每一个元素的插入位置。用户可以通过调整索引访问元素,并搜索列表的元素
    • 与Set集合不同,列表通常允许允许重复的元素
  • List集合特点
    • 有序:存储和取出的元素顺序一致
    • 可重复:存储的元素可以重复
List集合特有的方法
  • void add(int index, E element) ,在此集合中的指定位置插入指定的元素
  • E remove (int index), 删除指定索引处的元素,返回被删除的元素
  • E set(int index, E element) 修改指定索引处的元素,返回被修改的元素
  • E get(int index) 返回指定索引处的元素
并发修改异常
  • ConcurrentModificException
  • 产生原因:
    • 迭代器遍历的过程中,通过集合对象修改了集合中元素的长度,造成了迭代器获取元素中判断预期修改值和实际修改值不一致
  • 解决方案
    • 用for循环遍历,然后用集合对象做对应的操作即可
      示例:
public class IteratorDemo {
    public static void main(String[] args) {
        List<Student> s = new ArrayList<>();
        s.add(new Student("zhangsan",23,"游泳"));
        s.add( new Student("lisi",29,"打篮球"));
        Iterator<Student> iterator = s.iterator();
        while(iterator.hasNext()){
            Student st = iterator.next();
            if (st.getName().equals("lisi")){
                s.add(new Student("王五",23,"户外运动"));
            }
        }
    }
}

执行结果就是引发了一个异常
在这里插入图片描述
解决问题之后的代码

public class IteratorDemo {
    public static void main(String[] args) {
        List<Student> s = new ArrayList<>();
        s.add(new Student("zhangsan",23,"游泳"));
        s.add( new Student("lisi",29,"打篮球"));
        Iterator<Student> iterator = s.iterator();
/*
        while(iterator.hasNext()){
            Student st = iterator.next();
            if (st.getName().equals("lisi")){
                s.add(new Student("王五",23,"户外运动"));

            }

        }
*/
        for (int i = 0; i < s.size(); i++) {
            Student st = s.get(i);
            if (st.getName().equals("lisi")){
                s.add(new Student("王五",23,"户外运动"));
            }
            System.out.println(st.getName()+","+st.getAge()+","+st.getHobby());
        }
    }
}

结果
在这里插入图片描述

  • 通过解读源码知道Iterator的next方法会比对 每一次的长度而 ArrayList的get方法不会进行比对所以能添加成功

  • 有个List 特有的 listIterator()迭代器使用hasPrevious()、prervious()方法可以反向遍 历元素输出

  • 上述的异常情况也可以使用listlierator() 这个迭代器来解决

  • 示例:

        List<Student> s = new ArrayList<>();
        s.add(new Student("zhangsan",23,"游泳"));
        s.add( new Student("lisi",29,"打篮球"));

        //Iterator<Student> iterator = s.iterator();
        ListIterator<Student> iterator = s.listIterator();
        while(iterator.hasNext()){
            Student st = iterator.next();
            if (st.getName().equals("lisi")){
                //使用iterator的add方法来添加对象
                iterator.add(new Student("王五",23,"户外运动"));
                System.out.println("添加成功!");
            }
        }
        while(iterator.hasPrevious()){
            Student st = iterator.previous();
            System.out.println(st.getName()+","+st.getAge()+","+st.getHobby());
        }

执行结果
在这里插入图片描述

  • foreach(增强for)内部实现机制就是使用Iterator迭代器来实现的
  • 哪么如何来验证呢?
    上述说过了使用Iterator来增加一个元素会报一个并发修改的异常ConcurrentModificException 而foreach的内部机制就是iterator来实现的只要我们也添加一个元素测试看是否会报错
    在这里插入图片描述
    结果如我们所料验证了foreach是iterator来实现的
    在这里插入图片描述

数据结构

  • 数据结构之栈是:一种数据先进后出的模型
  • 数据结构之队列:是先进先出模型
  • 数组是查询快,增删慢的模型
  • 链表是查询慢,增删快的模型

List集合子类特点

  • List集合常用子类:ArrayList、LinkList
  • ArrayList:底层数据结构是数组,查询快,增删慢
  • LinkedList:底层数据结构是链表,查询慢,增删快

Set集合特点

  • 不包含重复元素的集合
  • 没有带索引的方法,所以不能使用普通for循环遍历
  • hashSet集合特点
    • 底层数据结构是哈希表
    • hashSet 是Set的其中一种实现类
    • 对集合的迭代顺序不作任何保证,也就是说不保证存储和取出的元素顺序一致
    • 没有带索引的方法,所以不能使用普通 for循环遍历
    • 不可存储重复元素
  • LinkedHashSet集合特点
    • 哈希表和链表实现的Set接口,具有可预测的迭代次序
    • 由链表保证元素有序,也就是说元素的存储和取出顺序是一致的
    • 由哈希表保证元素唯一,没有重复的元素
  • TreeSet集合特点
    • 元素有序,这里的顺序不是指存储和取出的顺序 ,而是按照一定的规则进行排序,具体排序方式取决于构造方法
      • TreeSet() 根据其元素的自然排序进行排序
      • TreeSet(Comarator comparator) 根据指定的比较其进行排序
    • 没有带索引的方法,所以不能使用普通for循环遍历
    • 由于是Set集合,所以不包含重复元素的集合

Map集合的使用

  • Interface Map<k,v> k: 键的使用 ; v: 值的类型
  • 将键映射到值得对象,不能包含重复的键;每一个键可以映射到最多一个值
  • 创建Map集合的对象
    • 多态的方式
    • 具体的实现类HashMap
Map集合的基本功能
方法名说明
V put(K key,V value)添加元素
V remove(Objeect key)根据键删除值对元素
void clear()移除所有的键值对元素
boolen containsKey(Object key)判断集合是否包含指定的键
boolen containsValue(Object value)判断集合是否包含指定的值
boolen isEmpty()判断集合是否为空
int size()集合的长度,也就是集合中键值对的个数
Map集合的获取功能
方法名说明
V get(Object key)根据键获取值
Set keySet()获取所有键的集合
Collection value()获取所有值的集合
Set <Map.Entry <K ,V>> entrySet()获取所有键值的对象的集合
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值