JAVA中Collection集合

本文深入讲解Java集合框架的由来、特点与应用。包括数组与集合的区别、集合的基本功能及特有功能演示、集合遍历的方法如迭代器遍历与集合转数组遍历等。此外还介绍了List集合的不同实现类及其适用场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

集合的由来及集合继承体系图

  • A:集合的由来
    • 数组长度是固定,当添加的元素超过了数组的长度时需要对数组重新定义,太麻烦,java内部给我们提供了集合类,能存储任意对象,长度是可以改变的,随着元素的增加而增加,随着元素的减少而减少
  • B:数组和集合的区别
    • 区别1 :
      • 数组既可以存储基本数据类型,又可以存储引用数据类型,基本数据类型存储的是值,引用数据类型存储的是地址值
      • 集合只能存储引用数据类型(对象)集合中也可以存储基本数据类型,但是在存储的时候会自动装箱变成对象
    • 区别2:
      • 数组长度是固定的,不能自动增长
      • 集合的长度的是可变的,可以根据元素的增加而增长
  • C:数组和集合什么时候用
    * 1,如果元素个数是固定的推荐用数组
    * 2,如果元素个数不是固定的推荐用集合
  • D:集合继承体系图

Collection集合的基本功能测试

  • A:案例演示
  • 基本功能演示
    
    boolean add(E e)
    boolean remove(Object o)
    void clear()
    boolean contains(Object o)
    boolean isEmpty()
    int size()
    
  • B:注意:


  • collectionXxx.java使用了未经检查或不安全的操作.
    注意:要了解详细信息,请使用 -Xlint:unchecked重新编译.
    java编译器认为该程序存在安全隐患
    温馨提示:这不是编译失败,所以先不用理会,等学了泛型你就知道了

集合的遍历之集合转数组遍历

  • A:集合的遍历
    • 其实就是依次获取集合中的每一个元素。
  • B:案例演示

    • 把集合转成数组,可以实现集合的遍历
    • toArray()
      *

      Collection coll = new ArrayList();
      coll.add(new Student("张三",23));     //Object obj = new Student("张三",23);
      coll.add(new Student("李四",24));
      coll.add(new Student("王五",25));
      coll.add(new Student("赵六",26));
      
      Object[] arr = coll.toArray();              //将集合转换成数组
      for (int i = 0; i < arr.length; i++) {
          Student s = (Student)arr[i];            //强转成Student
          System.out.println(s.getName() + "," + s.getAge());
      }
      

Collection集合的带All功能测试

  • 带All的功能
  • boolean addAll(Collection c)
    boolean removeAll(Collection c)
    boolean containsAll(Collection c)
    boolean retainAll(Collection c)
    

集合的遍历之迭代器遍历

  • A:迭代器概述
    • 集合是用来存储元素,存储的元素需要查看,那么就需要迭代(遍历)
  • B:案例演示

    • 迭代器的使用

      Collection c = new ArrayList();
      c.add("a");
      c.add("b");
      c.add("c");
      c.add("d");
      
      Iterator it = c.iterator();                     //获取迭代器的引用
      while(it.hasNext()) {                           //集合中的迭代方法(遍历)
          System.out.println(it.next());
      }
      

Collection存储自定义对象并遍历

  • A:案例演示

    • Collection存储自定义对象并用迭代器遍历
    • Collection c = new ArrayList();
      
      c.add(new Student("张三",23));
      c.add(new Student("李四",24));
      c.add(new Student("王五",25));
      c.add(new Student("赵六",26));
      c.add(new Student("赵六",26));
      
      for(Iterator it = c.iterator();it.hasNext();) {
          Student s = (Student)it.next();                     //向下转型
          System.out.println(s.getName() + "," + s.getAge()); //获取对象中的姓名和年龄
      }
      System.out.println("------------------------------");
      Iterator it = c.iterator();                             //获取迭代器
      while(it.hasNext()) {                                   //判断集合中是否有元素
          //System.out.println(((Student)(it.next())).getName() + "," + ((Student)(it.next())).getAge());
          Student s = (Student)it.next();                     //向下转型
          System.out.println(s.getName() + "," + s.getAge()); //获取对象中的姓名和年龄
      }
      

迭代器的原理及源码解析

  • A:迭代器原理
    • 迭代器原理:迭代器是对集合进行遍历,而每一个集合内部的存储结构都是不同的,所以每一个集合存和取都是不一样,那么就需要在每一个类中定义hasNext()和next()方法,这样做是可以的,但是会让整个集合体系过于臃肿,迭代器是将这样的方法向上抽取出接口,然后在每个类的内部,定义自己迭代方式,这样做的好处有二,第一规定了整个集合体系的遍历方式都是hasNext()和next()方法,第二,代码有底层内部实现,使用者不用管怎么实现的,会用即可
  • B:迭代器源码解析
    • 1,在eclipse中ctrl + shift + t找到ArrayList类
    • 2,ctrl+o查找iterator()方法
    • 3,查看返回值类型是new Itr(),说明Itr这个类实现Iterator接口
    • 4,查找Itr这个内部类,发现重写了Iterator中的所有抽象方法

List集合的特有功能概述和测试

  • A:List集合的特有功能概述
    • void add(int index,E element)
    • E remove(int index)
    • E get(int index)
    • E set(int index,E element)

List集合存储学生对象并遍历

  • A:案例演示

    • 通过size()和get()方法结合使用遍历。

      List list = new ArrayList();
      list.add(new Student("张三", 18));
      list.add(new Student("李四", 18));
      list.add(new Student("王五", 18));
      list.add(new Student("赵六", 18));
      
      for(int i = 0; i < list.size(); i++) {
          Student s = (Student)list.get(i);
          System.out.println(s.getName() + "," + s.getAge());
      }
      

并发修改异常产生的原因及解决方案

  • A:案例演示

    • 需求:我有一个集合,请问,我想判断里面有没有”world”这个元素,如果有,我就添加一个”javaee”元素,请写代码实现。

      List list = new ArrayList();
      list.add("a");
      list.add("b");
      list.add("world");
      list.add("d");
      list.add("e");
      
      /*Iterator it = list.iterator();
      while(it.hasNext()) {
          String str = (String)it.next();
          if(str.equals("world")) {
              list.add("javaee");         //这里会抛出ConcurrentModificationException并发修改异常
          }
      }*/
      
  • B:ConcurrentModificationException出现

    • 迭代器遍历,集合修改集合
  • C:解决方案

    • a:迭代器迭代元素,迭代器修改元素(ListIterator的特有功能add)
    • b:集合遍历元素,集合修改元素

      ListIterator lit = list.listIterator();     //如果想在遍历的过程中添加元素,可以用ListIterator中的add方法
      while(lit.hasNext()) {
          String str = (String)lit.next();
          if(str.equals("world")) {
              lit.add("javaee");  
              //list.add("javaee");
          }
      }
      

ListIterator

  • boolean hasNext()是否有下一个
  • boolean hasPrevious()是否有前一个
  • Object next()返回下一个元素
  • Object previous();返回上一个元素

Vector的特有功能

  • A:Vector类概述
  • B:Vector类特有功能
    • public void addElement(E obj)
    • public E elementAt(int index)
    • public Enumeration elements()
  • C:案例演示

    • Vector的迭代

      Vector v = new Vector();                //创建集合对象,List的子类
      v.addElement("a");
      v.addElement("b");
      v.addElement("c");
      v.addElement("d");
      
      //Vector迭代
      Enumeration en = v.elements();          //获取枚举
      while(en.hasMoreElements()) {           //判断集合中是否有元素
          System.out.println(en.nextElement());//获取集合中的元素
      }
      

数据结构之数组和链表

  • A:数组
    • 查询快修改也快
    • 增删慢
  • B:链表
    • 查询慢,修改也慢
    • 增删快

List的三个子类的特点

  • A:List的三个子类的特点
  • ArrayList:
        底层数据结构是数组,查询快,增删慢。
        线程不安全,效率高。
    Vector:
        底层数据结构是数组,查询快,增删慢。
        线程安全,效率低。
    Vector相对ArrayList查询慢(线程安全的)
    Vector相对LinkedList增删慢(数组结构)
    LinkedList:
        底层数据结构是链表,查询慢,增删快。
        线程不安全,效率高。
    
    Vector和ArrayList的区别
        Vector是线程安全的,效率低
        ArrayList是线程不安全的,效率高
    共同点:都是数组实现的
    ArrayList和LinkedList的区别
        ArrayList底层是数组结果,查询和修改快
        LinkedList底层是链表结构的,增和删比较快,查询和修改比较慢
    共同点:都是线程不安全的
    
  • B:List有三个儿子,我们到底使用谁呢?
    查询多用ArrayList
    增删多用LinkedList
    如果都多ArrayList
<think>嗯,用户问的是Java中的Collection单列集合。首先,我需要回忆一下Java集合框架的基础知识。记得Java集合框架主要分为Collection和Map两大类,而Collection是单列集合,Map是双列的键值对。用户可能想了解Collection的体系结构、常用接口和实现类,以及它们的使用场景。 首先,应该从Collection的顶层接口开始介绍,说明它继承了Iterable接口,所以所有Collection的实现类都支持迭代。然后,Collection分为List、Set和Queue三个子接口,每个子接口有不同的特性。 List部分,需要提到有序、可重复的特点,常用的实现类有ArrayList、LinkedList和Vector。要比较它们的底层实现,比如ArrayList基于数组,查询快,增删慢;LinkedList基于链表,增删快,查询慢;Vector是线程安全的,但性能较差,现在可能不常用了。 接下来是Set,强调元素唯一且无序。常用的实现类有HashSet、LinkedHashSet和TreeSet。HashSet基于哈希表,LinkedHashSet维护插入顺序,TreeSet可以排序。可能需要提到TreeSet是基于红黑树实现的,自然排序或者通过Comparator定制排序。 然后是Queue,队列,常用的有LinkedList、PriorityQueue,还有线程安全的ArrayBlockingQueue等。需要说明队列的先进先出特性,以及优先级队列的特殊之处。 用户可能还想知道如何选择不同的集合类,比如需要快速访问用ArrayList,需要频繁插入删除用LinkedList,需要唯一性用HashSet,需要排序用TreeSet,需要线程安全的话考虑使用Collections工具类或者并发包下的类。 另外,可能需要提到集合的遍历方式,比如for-each循环、迭代器、Java8的Stream API等。还要注意集合的线程安全问题,比如ArrayList不是线程安全的,多线程环境下应该用CopyOnWriteArrayList或者同步包装类。 用户可能的疑问还包括如何正确实现对象的equals和hashCode方法,特别是当使用HashSet或HashMap的时候。这也是确保集合正确行为的关键点。 最后,总结一下Collection的层次结构,以及各个实现类的适用场景,帮助用户在实际开发中做出合适的选择。可能还需要提醒一些常见错误,比如在遍历集合时修改导致的ConcurrentModificationException异常,以及如何避免。</think>Java中的Collection单列集合是存储一组对象的容器,属于Java集合框架的核心部分。以下从体系结构、常用接口和实现类进行分步解析: 1. **Collection顶层接口** - 继承自`Iterable`接口,支持迭代遍历 - 核心方法: ```java boolean add(E e); // 添加元素 boolean remove(Object o); // 删除元素 int size(); // 元素数量 boolean contains(Object o); // 判断包含 Iterator<E> iterator(); // 获取迭代器 ``` 2. **三大子接口** $$\begin{array}{|c|c|c|} \hline \text{接口} & \text{特点} & \text{常用实现类} \\ \hline \text{List} & \text{有序、可重复} & ArrayList, LinkedList, Vector \\ \text{Set} & \text{无序、唯一} & HashSet, LinkedHashSet, TreeSet \\ \text{Queue} & \text{队列结构} & LinkedList, PriorityQueue \\ \hline \end{array}$$ 3. **List接口详解** - **ArrayList**(数组实现): - 查询效率高($O(1)$随机访问) - 增删效率较低(需要移动元素) - **LinkedList**(双向链表实现): - 增删效率高($O(1)$头尾操作) - 查询效率低($O(n)$顺序访问) - **Vector**(线程安全数组): - 已被`Collections.synchronizedList()`取代 4. **Set接口详解** - **HashSet**(哈希表实现): - 基于`HashMap`实现 - 要求元素正确实现`hashCode()`和`equals()` - **LinkedHashSet**: - 维护插入顺序的HashSet - **TreeSet**(红黑树实现): - 支持自然排序或`Comparator`定制排序 - 元素必须实现`Comparable`接口 5. **Queue接口特性** - **PriorityQueue**: - 基于堆结构实现优先级队列 - 元素按自然顺序或Comparator排序 - **LinkedList**: - 可同时作为List和Deque使用 6. **使用示例** ```java // ArrayList示例 List<String> list = new ArrayList<>(); list.add("Java"); list.add("Python"); System.out.println(list.get(0)); // 输出:Java // HashSet示例 Set<Integer> set = new HashSet<>(); set.add(1); set.add(1); // 重复元素不会添加 System.out.println(set.size()); // 输出:1 // TreeSet排序示例 Set<String> sortedSet = new TreeSet<>(); sortedSet.add("Banana"); sortedSet.add("Apple"); System.out.println(sortedSet); // 输出:[Apple, Banana] ``` 7. **选择策略** - 需要快速随机访问 → ArrayList - 频繁插入删除 → LinkedList - 元素唯一性 → HashSet - 需要排序 → TreeSet - 线程安全需求 → 使用`Collections.synchronizedCollection()`包装或改用并发集合 8. **遍历方式** - 传统for循环(仅List) - 增强for循环 - Iterator迭代器 - Java8 Stream API: ```java list.stream().forEach(System.out::println); ``` 理解Collection体系需要掌握: 1. 各实现类的底层数据结构 2. 时间空间复杂度差异 3. 特定场景下的最佳实践 4. 线程安全问题的处理方式 建议通过实际编码练习加深理解,特别注意不同集合对元素相等性的判断机制,以及排序集合对元素可比性的要求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值