Day09-Java进阶-集合体系&通用遍历方式&List集合&数据结构ArrayList-LinkedList

发布于:2024-04-26 ⋅ 阅读:(29) ⋅ 点赞:(0)

1. 集合体系结构

1.1 集合体系结构介绍

1.2 Collection 的使用

package com.itheima.domain;

import java.util.Objects;

public class Student {
    private String name;
    private int age;

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Student student = (Student) o;
        return age == student.age && Objects.equals(name, student.name);
    }


    public Student() {
    }

    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }

    /**
     * 获取
     * @return name
     */
    public String getName() {
        return name;
    }

    /**
     * 设置
     * @param name
     */
    public void setName(String name) {
        this.name = name;
    }

    /**
     * 获取
     * @return age
     */
    public int getAge() {
        return age;
    }

    /**
     * 设置
     * @param age
     */
    public void setAge(int age) {
        this.age = age;
    }

    public String toString() {
        return "Student{name = " + name + ", age = " + age + "}";
    }
}
package com.itheima.collection;

import com.itheima.domain.Student;

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

public class CollectionTest1 {
    /*
        Collection的常用方法:

              public boolean add(E e) : 把给定的对象添加到当前集合中
              public void clear() : 清空集合中所有的元素
              public boolean remove(E e) : 把给定的对象在当前集合中删除
              public boolean contains(object obj) : 判断当前集合中是否包含给定的对象
              public boolean isEmpty() : 判断当前集合是否为空
              pubic int size() : 返回集合中元素的个数(集合的长度)
     */
    public static void main(String[] args) {

        Collection<Student> c = new ArrayList<>();

        c.add(new Student("张三", 23));
        c.add(new Student("李四", 24));
        c.add(new Student("王五", 25));

        System.out.println(c.contains(new Student("李四", 24)));

        System.out.println(c);
    }

    private static void method() {
        // 以多态的形式创建集合对象, 调用单列集合中的共有方法
        Collection<String> c = new ArrayList<>();

        c.add("张三");
        c.add("李四");
        c.add("王五");

        boolean b = c.contains("李四");
        System.out.println(b);

        System.out.println(c.size());
    }
}

2. 集合的通用遍历方式

2.1 迭代器遍历

2.2 增强 for 循环

package com.itheima.collection;

import com.itheima.domain.Student;

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

public class CollectionTest2 {
    /*
         public Iterator<E> iterator() : 获取遍历集合的迭代器
         public E next() : 从集合中获取一个元素
         public boolean hasNext() : 如果仍有元素可以迭代,则返回 true

         注意: 如果next()方法调用次数过多, 会出现NoSuchElementException
     */
    public static void main(String[] args) {
        Collection<Student> c = new ArrayList<>();

        c.add(new Student("张三", 23));
        c.add(new Student("李四", 24));
        c.add(new Student("王五", 25));

        // 1. 获取迭代器 (左边是接口的引用, 右边返回的是实现类对象)
        Iterator<Student> it = c.iterator();

        // 2. 循环判断, 集合中是否还有元素
        while(it.hasNext()){
            // 3. 调用next方法, 将元素取出
            Student stu = it.next();
            System.out.println(stu.getName() + "---" + stu.getAge());
        }

        System.out.println("----------------------");

        // 使用增强for循环遍历集合
        for (Student stu : c) {
            System.out.println(stu);
        }
    }
}

2.3 foreach 方法

package com.itheima.collection;

import com.itheima.domain.Student;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.NoSuchElementException;
import java.util.function.Consumer;

public class CollectionTest2 {
    /*
         public Iterator<E> iterator() : 获取遍历集合的迭代器
         public E next() : 从集合中获取一个元素
         public boolean hasNext() : 如果仍有元素可以迭代,则返回 true

         注意: 如果next()方法调用次数过多, 会出现NoSuchElementException
     */
    public static void main(String[] args) {
        Collection<Student> c = new ArrayList<>();

        c.add(new Student("张三", 23));
        c.add(new Student("李四", 24));
        c.add(new Student("王五", 25));

        // 1. 获取迭代器 (左边是接口的引用, 右边返回的是实现类对象)
        Iterator<Student> it = c.iterator();

        // 2. 循环判断, 集合中是否还有元素
        while(it.hasNext()){
            // 3. 调用next方法, 将元素取出
            Student stu = it.next();
            System.out.println(stu.getName() + "---" + stu.getAge());
        }

        System.out.println("----------------------");

        // 使用增强for循环遍历集合
        for (Student stu : c) {
            System.out.println(stu);
        }

        System.out.println("-----------------------");

        //foreach方法遍历集合
        c.forEach(stu -> System.out.println(stu));
    }
}

3. List集合

package com.itheima.collection.list;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.ListIterator;

public class ListDemo3 {
    /*
        并发修改异常 : ConcurrentModificationException

            场景: 使用[迭代器]遍历集合的过程中, 调用了[集合对象]的添加, 删除方法, 就会出现此异常

            解决方案: 迭代器的遍历过程中, 不允许使用集合对象的添加或删除, 那就使用迭代器, 自己的添加或删除方法.

                删除方法 : 普通的迭代器有
                添加方法 : 普通迭代器没有, 需要使用List集合特有的迭代器
     */
    public static void main(String[] args) {

        List<String> list = new ArrayList<>();

        list.add("眼瞅着你...");
        list.add("温油");
        list.add("离开俺们这...");
        list.add("伤心的人别扭秧歌...");
        list.add("私奔到东北...");

        ListIterator<String> it = list.listIterator();
        while(it.hasNext()){
            String s = it.next();
            if("温油".equals(s)){
                it.add("哈哈");
            }
        }
        System.out.println(list);

    }
}

4. 数据结构-ArrayLiat-LinkedList

4.1 数据结构介绍

4.2 ArrayList类和LinkedList类

4.2.1 ArrayList类

添加方法源码剖析:

"数值 m >> 1": 意思是数值m向右移动一位, 相当于m/2, 如 : 8 >> 1 = 4. 

4.2.2 LinkedList 类

package com.itheima.collection.list;

import java.util.LinkedList;

public class LinkedListDemo {
    /*
        LinkedList 特有方法 :

            public void addFirst(E e) : 头部添加
            public void addLast(E e) : 尾部添加
            public E getFirst() : 获取第一个
            public E getLast() : 获取最后一个
            public E removeFirst() : 删除第一个
            public E removeLast() : 删除最后一个
     */

    /*
        LinkedList集合, 底层是双向链表结构, 查找元素的时候会从头, 或者尾部逐步查找
        但是它属于List系统中的集合, 也可以使用get方法, 根据索引直接获取元素.
     */
    public static void main(String[] args) {

        LinkedList<String> list = new LinkedList<>();

        list.add("张三");
        list.add("李四");
        list.add("王五");

        String s = list.get(1);
        System.out.println(s);


    }

    private static void method2() {
        LinkedList<String> list = new LinkedList<>();

        list.add("张三");
        list.add("李四");
        list.add("王五");
        list.add("赵六");

        System.out.println(list.getFirst());
        System.out.println(list.getLast());

        list.removeFirst();
        list.removeLast();

        System.out.println(list);
    }

    private static void method1() {
        LinkedList<String> list = new LinkedList<>();

        list.addFirst("张三");
        list.addFirst("李四");
        list.addFirst("王五");
        list.addFirst("赵六");

        System.out.println(list);
    }
}