【Java笔记】集合(一)Collection接口、List接口及其实现类

    技术2023-12-31  81

    Collection接口、List接口及其实现类

    一.集合1.集合概述2.集合框架 二.Collection集合1.常用方法2.遍历2.1 迭代器遍历(Iterator接口)2.2增强for循环 三.List集合1.List接口特点2.常用方法3.遍历4.并发修改异常 四. List集合的实现类1.Arraylist集合2. LinkedList集合

    一.集合

    1.集合概述

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

    集合和数组既然都是容器,它们有啥区别呢?

    数组的长度是固定的。集合的长度是可变的。数组中存储的是同一类型的元素,可以存储基本数据类型值。集合存储的都是对象。而且对象的类型可以不一致。在开发中一般当对象多的时候,使用集合进行存储。

    2.集合框架

    JAVASE提供了满足各种需求的API,在使用这些API前,先了解其继承与接口操作架构,才能了解何时采用哪个类,以及类之间如何彼此合作,从而达到灵活应用。

    集合按照其存储结构可以分为两大类,分别是单列集合java.util.Collection和双列集合java.util.Map


    二.Collection集合

    Collection是所有单列集合的父接口,因此在Collection中定义了单列集合(List和Set)通用的一些方法,这些方法可用于操作所有的单列集合。

    1.常用方法

    public class Demo1Collection { public static void main(String[] args) { // 创建集合对象 // 使用多态形式 Collection<String> coll = new ArrayList<String>(); // 使用方法 // 添加功能 boolean add(String s) coll.add("小李广"); coll.add("扫地僧"); coll.add("石破天"); System.out.println(coll); // boolean contains(E e) 判断o是否在集合中存在 System.out.println("判断 扫地僧 是否在集合中"+coll.contains("扫地僧")); //boolean remove(E e) 删除在集合中的o元素 System.out.println("删除石破天:"+coll.remove("石破天")); System.out.println("操作之后集合中元素:"+coll); // size() 集合中有几个元素 System.out.println("集合中有"+coll.size()+"个元素"); // Object[] toArray()转换成一个Object数组 Object[] objects = coll.toArray(); // 遍历数组 for (int i = 0; i < objects.length; i++) { System.out.println(objects[i]); } // void clear() 清空集合 coll.clear(); System.out.println("集合中内容为:"+coll); // boolean isEmpty() 判断是否为空 System.out.println(coll.isEmpty()); } }

    2.遍历

    2.1 迭代器遍历(Iterator接口)

    在程序开发中,经常需要遍历集合中的所有元素。针对这种需求,JDK专门提供了一个接口java.util.Iterator。Iterator接口也是Java集合中的一员,但它与Collection、Map接口有所不同,Collection接口与Map接口主要用于存储元素,而Iterator主要用于迭代访问(即遍历)Collection中的元素,因此Iterator对象也被称为迭代器。

    想要遍历Collection集合,那么就要获取该集合迭代器完成迭代操作,下面介绍一下获取迭代器的方法:

    public Iterator iterator(): 获取集合对应的迭代器,用来遍历集合中的元素的。

    下面介绍一下迭代的概念:

    迭代:即Collection集合元素的通用获取方式。在取元素之前先要判断集合中有没有元素,如果有,就把这个元素取出来,继续在判断,如果还有就再取出出来。一直把集合中的所有元素全部取出。这种取出方式专业术语称为迭代。

    Iterator接口的常用方法如下:

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

    public boolean hasNext():如果仍有元素可以迭代,则返回 true。

    public class IteratorDemo { public static void main(String[] args) { // 使用多态方式 创建对象 Collection<String> coll = new ArrayList<String>(); // 添加元素到集合 coll.add("串串星人"); coll.add("吐槽星人"); coll.add("汪星人"); //遍历 //使用迭代器 遍历 每个集合对象都有自己的迭代器 Iterator<String> it = coll.iterator(); // 泛型指的是 迭代出 元素的数据类型 while(it.hasNext()){ //判断是否有迭代元素 String s = it.next();//获取迭代出的元素 System.out.println(s); } } }

    实现原理

    当遍历集合时,首先通过调用t集合的iterator()方法获得迭代器对象,然后使用hashNext()方法判断集合中是否存在下一个元素,如果存在,则调用next()方法将元素取出,否则说明已到达了集合末尾,停止遍历元素。

    在调用Iterator的next方法之前,迭代器的索引位于第一个元素之前,不指向任何元素,当第一次调用迭代器的next方法后,迭代器的索引会向后移动一位,指向第一个元素并将该元素返回,当再次调用next方法时,迭代器的索引会指向第二个元素并将该元素返回,依此类推,直到hasNext方法返回false,表示到达了集合的末尾,终止对元素的遍历。


    2.2增强for循环

    增强for循环(也称for each循环)是JDK1.5以后出来的一个高级for循环,专门用来遍历数组和集合的。它的内部原理其实是个Iterator迭代器,所以在遍历的过程中,不能对集合中的元素进行增删操作。

    格式:

    for(元素的数据类型 变量 : Collection集合or数组){ //写操作代码 }

    它用于遍历Collection和数组。通常只进行遍历元素,不要在遍历的过程中对集合元素进行增删操作。

    public class NBFor { public static void main(String[] args) { Collection<String> coll = new ArrayList<String>(); coll.add("小河神"); coll.add("老河神"); coll.add("神婆"); //使用增强for遍历 for(String s :coll){//接收变量s代表 代表被遍历到的集合元素 System.out.println(s); } } }

    三.List集合

    1.List接口特点

    它是一个元素存取有序的集合。例如,存元素的顺序是11、22、33。那么集合中,元素的存储就是按照11、22、33的顺序完成的)。它是一个带有索引的集合,通过索引就可以精确的操作集合中的元素(与数组的索引是一个道理)。集合中可以有重复的元素,通过元素的equals方法,来比较是否为重复的元素。

    2.常用方法

    List作为Collection集合的子接口,不但继承了Collection接口中的全部方法,而且还增加了一些根据元素索引来操作集合的特有方法,如下:

    public class ListDemo { public static void main(String[] args) { // 创建List集合对象 List<String> list = new ArrayList<String>(); // 往 尾部添加 指定元素 list.add("图图"); list.add("小美"); list.add("不高兴"); System.out.println(list); // add(int index,String s) 往指定位置添加 list.add(1,"没头脑"); System.out.println(list); // String remove(int index) 删除指定位置元素 返回被删除元素 // 删除索引位置为2的元素 System.out.println("删除索引位置为2的元素"); System.out.println(list.remove(2)); System.out.println(list); // String set(int index,String s) // 在指定位置 进行 元素替代(改) // 修改指定位置元素 list.set(0, "三毛"); System.out.println(list); // String get(int index) 获取指定位置元素 // 跟size() 方法一起用 来 遍历的 for(int i = 0;i<list.size();i++){ String s = list.get(i); System.out.println(s); } //还可以使用增强for for (String string : list) { System.out.println(string); } } }

    3.遍历

    List集合除了可以继承使用Collection集合的两种遍历方法, 还可以根据索引来遍历

    public class ListDemo2 { public static void main(String[] args) { List<String> list=new ArrayList<String>(); list.add("图图"); list.add("小美"); list.add("不高兴"); //1.增强for遍历 for (String string : list) { System.out.println(string); } //2.迭代器遍历 Iterator<String> it = list.iterator(); while(it.hasNext()){ //判断是否有迭代元素 String s = it.next();//获取迭代出的元素 System.out.println(s); } //3.索引遍历 for(int i = 0;i<list.size();i++){ String s = list.get(i); System.out.println(s); } } }

    4.并发修改异常

    public class Binfa { public static void main(String[] args) { List<String> list = new ArrayList<String>(); list.add("令狐冲"); list.add("岳灵珊"); list.add("东方不败"); //迭代器 // Iterator<String> it = list.iterator(); // while (it.hasNext()){ // String s=it.next(); // if(s.equals("东方不败")) // list.add("岳不群");//ConcurrentModificationException // } //解决方法 for (int i=0;i<list.size();i++){ String s=list.get(i); if(s.equals("东方不败")) list.add("岳不群"); System.out.println(s); } } }

    结论:迭代器遍历不能往里面添加元素


    四. List集合的实现类


    1.Arraylist集合

    java.util.ArrayList集合数据存储的结构是数组结构。元素增删慢,查找快,由于日常开发中使用最多的功能为查询数据、遍历数据,所以ArrayList是最常用的集合。

    ArrayList存储学生对象并遍历

    public class Student{ String name; String age; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getAge() { return age; } public void setAge(String age) { this.age = age; } } public class ArrayListDemo1 { public static void main(String[] args) { ArrayList<Student> array = new ArrayList<>(); addStudent(array); addStudent(array); for (int i=0;i<array.size();i++) { Student s = array.get(i); System.out.println(s.getName() + "," + s.getAge()); } } public static void addStudent(ArrayList<Student> array){ Scanner in=new Scanner(System.in); System.out.println("姓名:"); String n=in.nextLine(); System.out.println("年龄:"); String a=in.nextLine(); Student s=new Student(); s.setName(n); s.setAge(a); array.add(s); } }

    2. LinkedList集合

    java.util.LinkedList集合数据存储的结构是链表结构。方便元素添加、删除的集合。

    特有方法

    LinkedList是List的子类,List中的方法LinkedList都是可以使用,这里就不做详细介绍,我们只需要了解LinkedList的特有方法即可。在开发时,LinkedList集合也可以作为堆栈,队列的结构使用。(了解即可)

    public class LinkedListDemo { public static void main(String[] args) { LinkedList<String> link = new LinkedList<String>(); //添加元素 link.addFirst("abc1"); link.addFirst("abc2"); link.addFirst("abc3"); System.out.println(link); // 获取元素 System.out.println(link.getFirst()); System.out.println(link.getLast()); // 删除元素 System.out.println(link.removeFirst()); System.out.println(link.removeLast()); while (!link.isEmpty()) { //判断集合是否为空 System.out.println(link.pop()); //弹出集合中的栈顶元素 } System.out.println(link); } }

    【Java笔记】系列

    集合(一)Collection接口、List接口及其实现类集合(二)Set接口及其实现类、Collections集合(三)Map接口及其实现类
    Processed: 0.008, SQL: 9