集合详解

本文详细介绍了Java集合框架,包括Collection、List、Set、Map等,以及它们的实现类如ArrayList、LinkedList、HashSet、TreeSet等。讨论了并发修改异常、ListIterator、泛型、可变参数和Map遍历等概念,给出了多种遍历和操作集合的示例,重点分析了ArrayList和LinkedList的优缺点以及在存储和遍历上的策略。同时,还涵盖了泛型、类型通配符和可变参数在集合操作中的应用,以及如何使用Collections工具类对集合进行排序和操作。
摘要由CSDN通过智能技术生成

集合

集合类的特点:提供一种存储空间可变的的存储模型。

集合只能存储引用类型的数据。
集合:
Collection(单列)和Map(双列)
​ Collection(单列): List(可重复) Set(不可重复)
Map(双列):HashMap TreeMap 等(实现类)
List(可重复):ArrayList LinkList (实现类)
Set(不可重复):HashSet LinkedHashSet TreeSet(实现类)

(上下是继承关系,父类有的方法,子类都有,还有自己的特有的方法)

1.Collection集合

常用方法:

  • public boolean add(E e): 把给定的对象添加到当前集合中 。
  • public void clear() :清空集合中所有的元素。
  • public boolean remove(E e): 把给定的对象在当前集合中删除。
  • public boolean contains(E e): 判断当前集合中是否包含给定的对象。
  • public boolean isEmpty(): 判断当前集合是否为空。
  • public int size(): 返回集合中元素的个数。
  • public Object[] toArray(): 把集合中的元素,存储到数组中。
  • public Iterator iterator():返回该集合的迭代器。

Iterator接口

集合的专用遍历方式

常用方法:

    • boolean hasNext() 如果迭代具有更多元素,则返回 true
      E next() 返回迭代中的下一个元素。

      使用集合遍历String类型数据

public class CollectionDemo {
   
    public static void main(String[] args) {
   
        Collection<String>  strArr = new ArrayList<>();

        strArr.add("Hello");
        strArr.add("Word");
        strArr.add("Java");
        strArr.add("J2ee");

        Iterator<String> strI = strArr.iterator();
        while (strI.hasNext()){
              //遍历
            String s = strI.next();
            System.out.println(s);
        }
    }
}

在进行集合元素取出时,如果集合中已经没有元素了,还继续使用迭代器的next方法,将会发生java.util.NoSuchElementException没有集合元素的错误。

使用集合遍历学生对象

import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;

public class Demo {
   
    public static void main(String[] args) {
   
        Collection<Student>  stuArr = new ArrayList<>();

        Student s1 = new Student("马瑞",21);
        Student s2 = new Student("张骞骞",21);
        Student s3 = new Student("谢祥",21);

        stuArr.add(s1);
        stuArr.add(s2);
        stuArr.add(s3);

        Iterator<Student> stuI = stuArr.iterator();
        while (stuI.hasNext()){
   
            Student s = stuI.next();
            System.out.println("姓名:"+s.getName()+"  年龄:"+s.getAge());
        }
    }
}

1.1List集合

List集合特点:

有序: 存储和取出的元素顺序一致

可重复: 存储的元素可以重复

有索引:可以通过整数索引访问元素

特有方法:

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集合存储学生对象并遍历

        List<Student> studentArr = new ArrayList<>();

        Student s4 = new Student("马",21);
        Student s5 = new Student("谢",21);
        Student s6 = new Student("张",21);

        studentArr.add(s4);
        studentArr.add(s5);
        studentArr.add(s6);

        Iterator<Student> ii = studentArr.iterator();
        while (ii.hasNext()){
   
            Student next = ii.next();
            System.out.println("姓名:"+next.getName()+"  年龄:"+next.getAge());
        }

并发修改异常

public class ErrorDemo {
   
    public static void main(String[] args) {
   
        List<String> strArr = new ArrayList<>();
        strArr.add("Hello");
        strArr.add("Word");
        strArr.add("Java");
        strArr.add("J2ee");

//        Iterator<String> strI = strArr.iterator();
//        while (strI.hasNext()){
   
//            String s = strI.next();//预期修改值和实际修改值不一致
//            if (s.equals("Java")){
   
//                strArr.add("Javaee");
//            }
//            System.out.println(s);
//        }
        for (int i = 0; i <strArr.size() ; i++) {
   
            String s = strArr.get(i);
            if (s.equals("Java")) {
   
                strArr.add("Javaee");
            }
            System.out.println(s);
        }
    }
}

Exception in thread “main” java.util.ConcurrentModificationException
at java.util.ArrayList I t r . c h e c k F o r C o m o d i f i c a t i o n ( A r r a y L i s t . j a v a : 909 ) a t j a v a . u t i l . A r r a y L i s t Itr.checkForComodification(ArrayList.java:909) at java.util.ArrayList Itr.checkForComodification(ArrayList.java:909)atjava.util.ArrayListItr.next(ArrayList.java:859)
at cn.taru.day02.time04.ErrorDemo.main(ErrorDemo.java:17)

ConcurrentModificationException并发修改异常

  • 当不允许这样的修改时,可以通过检测到对象的并发修改的方法来抛出此异常。

产生原因
迭代器遍历的过程中,通过集合对象修改了集合中元素的长度,造成了迭代器获取元素中判断预期修改值和实际修改值不一致
解决方率
用for循环遍历,然后用集合对象做对应的操作即可

ListIterator(List中特有的迭代器)extend Iterator

Listlterator: 列表迭代器

1.通过List集合的listlterator()方法得到,所以说它是List集合特有的迭代器
2.用于允许程序员沿任一方向遍历列表的列表迭代器,在迭代期间修改列表,并获取列表中迭代器的当前位置

Listlterator中的常用方法:

E next():返回迭代中的下一个元素

boolean hasNext():如果迭代具有更多元素,则返回trueE previous():返回列表中的上一个元素

boolean hasPrevious():如果此列表迭代器在相反方向遍历列表时具有更多元素,则返回true

void add(Ee):将指定的元素插入列表

不演试了

增强for循环

增强for:简化数组和Collection集合的遍历
实现lterable接口的类允许其对象成为增强型for语句的目标

它是JDK5之后出现的,其内部原理是一个lterator迭代器

int[] arr = {
   1,3,5,8};
for(int i:arr){
          //for(元素数据类型 变量名:数组或集合){}
    i.sout
}

public class Demo {
   
    public static void main(String[] args) {
   
        List<String> list = new ArrayList<>();

        list.add("Hello");
        list.add("Word");
        list.add("Java");

        for (String s : list){
       //举例
            System.out.println(s);
        }
    }
}

案例(三种遍历方式)

public class ListDemo {
   
    public static void main(String[] args) {
   
        List<Student> list = new ArrayList<>();

        Student s1 = new Student("马瑞",21);
        Student s2 = new Student("谢祥",22);
        Student s3 = new Student("张骞骞",21);

        list.add(s1);
        list.add(s2);
        list.add(s3);

        //第一种:迭代器
        ListIterator<Student> it = list.listIterator();
        while (it.hasNext()){
   
            Student stu1 = it.next();
            System.out.println("姓名:"+stu1.getName()+"  年龄:"+stu1.getAge());
        }
        System.out.println("-----------");

        //第二种:普通for循环
        for (int i = 0; i <list.size() ; i++) {
   
            Student stu2 = list.get(i);
            System.out.println("姓名:"+stu2.getName()+"  年龄:"+stu2.getAge());
        }
        System.out.println("-----------");

        //第三种:增强for循环
        for (Student stu3 : list){
   
            System.out.println("姓名:"+stu3.getName()+"  年龄:"+stu3.getAge());
        }

    }
}

数组和链表的优缺点(Arraylist, LinkedList)

数组是一种增删慢、查询快的一种数据模型

链表是一种增删快、查询慢的一种数据模型

Arraylist底层数据结构是数组

LinkedList底层数据结构是链表

1.1.1ArrayList

1.1.2LinkedList

案例LinkedList集合存储学生对象用三种方式遍历

public class ListDemo {
   
    public static void main(String[] args) {
   
        LinkedList<Student> list = new LinkedList<>();

        Student s1 = new Student("马瑞",21);
        Student s2 = new Student("谢祥",22
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python集合是一种无序且不重复的数据结构。它们类似于列表和元组,但是不允许有重复项。集合可以用于去重、交集、并集和差集等操作。下面是Python集合的详细介绍。 1. 创建集合 可以使用大括号{}或set()函数来创建一个空集合,也可以在大括号中直接输入元素来创建集合。例如: ```python # 创建空集合 set1 = set() print(set1) # set() # 创建有元素的集合 set2 = {1, 2, 3} print(set2) # {1, 2, 3} set3 = set([4, 5, 6]) print(set3) # {4, 5, 6} ``` 2. 集合操作 可以使用以下操作符和方法来操作Python集合: - 添加元素:add()方法、update()方法 - 删除元素:remove()方法、discard()方法、pop()方法 - 清空集合:clear()方法 - 特殊操作:交集&、并集|、差集-、对称差集^ 例如: ```python # 添加元素 set1.add(1) print(set1) # {1} set1.update([2, 3]) print(set1) # {1, 2, 3} # 删除元素 set1.remove(2) print(set1) # {1, 3} set1.discard(4) # 如果元素不存在,不会报错 print(set1) # {1, 3} set1.pop() # 随机删除一个元素 print(set1) # {3} # 清空集合 set1.clear() print(set1) # set() # 特殊操作 set2 = {1, 2, 3} set3 = {3, 4, 5} print(set2 & set3) # {3},交集 print(set2 | set3) # {1, 2, 3, 4, 5},并集 print(set2 - set3) # {1, 2},差集 print(set2 ^ set3) # {1, 2, 4, 5},对称差集 ``` 3. 集合方法 Python集合还有一些常用的方法,例如: - len()方法:返回集合中元素的个数 - in关键字:判断元素是否在集合中 - issubset()方法:判断一个集合是否是另一个集合的子集 - issuperset()方法:判断一个集合是否是另一个集合的超集 - union()方法:返回两个集合的并集 - intersection()方法:返回两个集合的交集 - difference()方法:返回两个集合的差集 - symmetric_difference()方法:返回两个集合的对称差集 例如: ```python set1 = {1, 2, 3} set2 = {3, 4, 5} print(len(set1)) # 3 print(2 in set1) # True print(4 in set1) # False print(set1.issubset(set2)) # False print(set2.issuperset(set1)) # False print(set1.union(set2)) # {1, 2, 3, 4, 5} print(set1.intersection(set2)) # {3} print(set1.difference(set2)) # {1, 2} print(set1.symmetric_difference(set2)) # {1, 2, 4, 5} ``` 总之,Python集合是一种非常实用的数据结构,可以用于去重、交集、并集和差集等操作。掌握集合的使用方法可以帮助你更加高效地处理数据。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值