1. Collection集合

1. 数组和集合的区别【理解】

  • 相同点

    都是容器,可以存储多个数据

  • 不同点

    • 数组的长度是不可变的,集合的长度是可变的

    • 数组可以存基本数据类型和引用数据类型

      集合只能存引用数据类型,如果要存基本数据类型,需要存对应的包装类

public class Demo1 {
    public static void main(String[] args) {

        //1.数组存储基本数据类型和引用数据类型
        int[] arr1 = {1, 2, 3};
        String[] arr2 = {"a", "b", "c"};

        System.out.println(Arrays.toString(arr1));
        System.out.println(Arrays.toString(arr2));

        //2.集合存储引用数据类型,要存储基本数据类型,则存储他们对应的包装类

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

        list.add(1);
        list.add(2);
        list.add(3);
        System.out.println(list);
    }
}

运行结果

image-20221229212512293

2. 集合类体系结构

image-20221229212930720

3. Collection 集合概述和使用

  • Collection集合概述

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

    • 多态的方式
    • 具体的实现类ArrayList
  • Collection集合常用方法

    方法名说明
    boolean add(E e)添加元素
    boolean remove(Object o)从集合中移除指定的元素
    boolean removeIf(Object o)根据条件进行移除
    void clear()清空集合中的元素
    boolean contains(Object o)判断集合中是否存在指定的元素
    boolean isEmpty()判断集合是否为空
    int size()集合的长度,也就是集合中元素的个数
public class Demo2 {
    public static void main(String[] args) {

        Collection collection = new ArrayList();

        //1.添加元素
        collection.add("社会龙");
        collection.add("三藏哥");
        collection.add("七头哥");
        System.out.println(collection);

        //2.从集合中移除指定元素
        collection.remove("社会龙");
        System.out.println(collection);

        //3.清空集合中的元素
//        collection.clear();
//        System.out.println(collection);

        //4.判断集合中是否存在指定元素
        boolean result = collection.contains("社会龙");
        System.out.println("集合中是否存在社会龙这个元素:"+result);
        //5.判断集合是否为空
        boolean isEmpty = collection.isEmpty();
        System.out.println("集合是否为空:"+isEmpty);

        //6.集合的长度

        int size = collection.size();
        System.out.println("集合的长度是:"+ size);

    }
}

运行结果
image-20221229214126889

4. Collection集合的遍历

4. 1迭代器遍历
  • 迭代器,集合的专用遍历方式

  • Iterator iterator(): 返回此集合中元素的迭代器,通过集合对象的 iterator() 方法得到

  • Iterator中的常用方法

    boolean hasNext(): 判断当前位置是否有元素可以被取出
    ​ E next(): 获取当前位置的元素,将迭代器对象移向下一个索引位置

public class Demo3 {
    public static void main(String[] args) {
        Collection collection = new ArrayList();

        //1.添加元素
        collection.add("社会龙");
        collection.add("社会姐");
        collection.add("三藏哥");
        collection.add("七头哥");

        //2.用集合对象的iterator()方法获取集合元素的迭代器
        Iterator iterator = collection.iterator();

        while (iterator.hasNext()){//判断当前位置是否有元素可以被取出

            String element = (String) iterator.next();//获取当前位置的元素,将迭代器对象移向下一个索引位置
            System.out.println(element);
        }
    }
}

运行结果

image-20221229214906557
4.2 增强for循环
  • 介绍

    • 它是JDK5之后出现的,其内部原理是一个Iterator迭代器
    • 实现Iterable接口的类才可以使用迭代器和增强for
    • 简化数组和Collection集合的遍历
  • 格式

    for(集合/数组中元素的数据类型 变量名 : 集合/数组名) {

    // 已经将当前遍历到的元素封装到变量中了,直接使用变量即可

    }

public class Demo4 {
    public static void main(String[] args) {
        Collection collection = new ArrayList();
        String[] names = {"社会龙","社会姐","三藏哥","七头哥"};
        //1.添加元素
        collection.add("社会龙");
        collection.add("社会姐");
        collection.add("三藏哥");
        collection.add("七头哥");

        //2.增强for遍历集合
        //数据类型一定是集合或者数组中元素的类型
        for (Object elemenet : collection) {
            System.out.println(elemenet);
        }

        System.out.println("===============================================");
        //3.增强for遍历数组
        for (String name : names) {
            //name仅仅是一个变量名而已,在循环的过程中,依次表示集合或者数组中的每一个元素
            //names就是要遍历的集合或者数组
            System.out.println(name);
        }

    }
}

运行结果

image-20221229215745385
5. List集合的特有方法【应用】
  • 方法介绍

    方法名描述
    void add(int index,E element)在此集合中的指定位置插入指定的元素
    E remove(int index)删除指定索引处的元素,返回被删除的元素
    E set(int index,E element)修改指定索引处的元素,返回被修改的元素
    E get(int index)返回指定索引处的元素

5. List集合的实现类

5.1 List集合子类的特点
  • ArrayList集合

    ​ 底层是数组结构实现,查询快、增删慢

  • LinkedList集合

    ​ 底层是链表结构实现,查询慢、增删快

5.2 LinkedList集合的特有功能【应用】
  • 特有方法

    方法名说明
    public void addFirst(E e)在该列表开头插入指定的元素
    public void addLast(E e)将指定的元素追加到此列表的末尾
    public E getFirst()返回此列表中的第一个元素
    public E getLast()返回此列表中的最后一个元素
    public E removeFirst()从此列表中删除并返回第一个元素
    public E removeLast()从此列表中删除并返回最后一个元素

public class Demo5 {
    public static void main(String[] args) {
        LinkedList<String> linkedList = new LinkedList<>();
        //1.添加元素
        linkedList.add("社会龙");
        linkedList.add("社会姐");
        linkedList.add("三藏哥");
        linkedList.add("七头哥");

        //2.在该列表开头插入指定的元素
        linkedList.addFirst("霍景良");
        System.out.println(linkedList);

        System.out.println("==================================================");
        //3.讲指定的元素追加到此列表的末尾
        linkedList.addLast("坤坤");
        System.out.println(linkedList);

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

        //4.获取列表的第一个元素
        String first = linkedList.getFirst();
        System.out.println("集合的第一个元素:"+first);

        System.out.println("==================================================");
        
        //5.获取列表的最后一个元素
        String last = linkedList.getLast();
        System.out.println("集合的最后一个元素:"+first);

        System.out.println("==================================================");
       
        //6.删除列表的第一个元素,并返回
        String removeFirst = linkedList.removeFirst();
        System.out.println(linkedList);

        System.out.println("==================================================");
        
        //7.删除列表的最后一个元素并返回
        String removeLast = linkedList.removeLast();
        System.out.println(removeLast);


    }
}

运行结果

image-20221229223331392

6. Set集合

6.1 Set集合概述和特点
  • 不可以存储重复元素
  • 没有索引,不能使用普通for循环遍历
package com.zhang.collection.set;

import java.util.Iterator;
import java.util.Set;
import java.util.TreeSet;

/**Set集合概述和特点
 * 不可以存储重复元素
 * 存取顺序不一致
 *  没有索引,不能使用普通for循环遍历
 */
public class SetDemo1 {

    public static void main(String[] args) {
        Set<String> set = new TreeSet<>();

        //1.添加元素
        set.add("社会龙");
        set.add("社会姐");
        set.add("三藏哥");
        set.add("七头哥");
        set.add("七头哥");

        System.out.println(set);


        //1.迭代器遍历set集合
        Iterator<String> iterator = set.iterator();
        while (iterator.hasNext()){
            String next = iterator.next();
            System.out.println(next);
        }
        System.out.println("============================================================");
        //2.增强for遍历
        for (String s : set) {
            System.out.println(s);
        }

    }
}

运行结果

image-20230101212119319
6.2 TreeSet集合概述和特点
  • 不可以存储重复元素

  • 没有索引

  • 可以将元素按照规则进行排序

    • TreeSet():根据其元素的自然排序进行排序

    • TreeSet(Comparator comparator) :根据指定的比较器进行排序

      存储Integer类型的整数并遍历

      package com.zhang.collection.set.treeset;
      
      import java.util.TreeSet;
      
      public class TreeSetDemo1 {
          public static void main(String[] args) {
              TreeSet<Integer> treeSet = new TreeSet<>();
              treeSet.add(90);
              treeSet.add(10);
              treeSet.add(70);
              treeSet.add(70);
              treeSet.add(80);
              System.out.println(treeSet);
      
          }
      }
      
      

      运行结果

image-20230101212359346
6.3 自然排序Comparable的使用
  • 案例需求

    • 存储学生对象并遍历,创建TreeSet集合使用无参构造方法
    • 要求:按照年龄从小到大排序,年龄相同时,按照姓名的字母顺序排序
  • 实现步骤

    1. 使用空参构造创建TreeSet集合
      • 用TreeSet集合存储自定义对象,无参构造方法使用的是自然排序对元素进行排序的
    2. 自定义的Student类实现Comparable接口
      • 自然排序,就是让元素所属的类实现Comparable接口,重写compareTo(T o)方法
    3. 重写接口中的compareTo方法
      • 重写方法时,一定要注意排序规则必须按照要求的主要条件和次要条件来写
  • 代码实现;

自定义Student类

package com.zhang.collection.set.domain;

public class Studentimplements Comparable<Student> {

    private  String name;
    private int age;
    ...空参构造,满参构造,geterseter方法,toString方法
        
        @Override
        public int compareTo(Student o) {

         //按照对象的年龄进行排序
        //主要判断条件: 按照年龄从小到大排序
        //次要判断条件: 年龄相同时,按照姓名的字母顺序排序
            int result = this.age - o.age;
            result = result == 0 ?this.name.compareTo(o.name):result;
            return result;
        }
}

demo

package com.zhang.collection.set.treeset;

import com.zhang.collection.set.domain.Student;

import java.util.TreeSet;

/**
 * 案例需求
 *
 * - 存储学生对象并遍历,创建TreeSet集合使用无参构造方法
 * - 要求:按照年龄从小到大排序,年龄相同时,按照姓名的字母顺序排序
 */
public class SetDemo2 {

    public static void main(String[] args) {

        /**
         * 自然排序Comparable的使用步骤
         * 使用空参构造创建TreeSet集合
         * 自定义的Student类实现Comparable
         * 接口重写里面的compareTo方法
         *
         * 做完以上步骤,treeset集合就可以按照Student类里面的规则排序
         */

        TreeSet<Student> students = new TreeSet<>();

        Student student1 = new Student("zhangsan", 10);
        Student student2 = new Student("lisi",30);
        Student student3 = new Student("wangwu",20);
        Student student4 = new Student("zhaoliu",20);


        students.add(student1);
        students.add(student2);
        students.add(student3);


        students.add(student4);
        System.out.println(students);


    }

}

运行结果

image-20230101221132222

自然排序原理

image-20230101213958093
6.4 比较器排序Comparator的使用
  • 案例需求

    • 存储老师对象并遍历,创建TreeSet集合使用带参构造方法
    • 要求:按照年龄从小到大排序,年龄相同时,按照姓名的字母顺序排序
  • 实现步骤

    • 用TreeSet集合存储自定义对象,带参构造方法使用的是比较器排序对元素进行排序的
    • 比较器排序,就是让集合构造方法接收Comparator的实现类对象,重写compare(T o1,T o2)方法
    • 重写方法时,一定要注意排序规则必须按照要求的主要条件和次要条件来写

老师类

package com.zhang.collection.set.domain;

public class Teacher {

    private String name;
    private int age ;
    ....
无参、满参构造,get、setter方法。tostring方法
    
}

demo

package com.zhang.collection.set.treeset;

import com.zhang.collection.set.domain.Teacher;

import java.util.Comparator;
import java.util.TreeSet;

public class TreeSetDemo2 {
    public static void main(String[] args) {


        /**
        01表示现在要存入的那个元素
        02表示已经存入到集合中的元素
        **/
        TreeSet<Teacher> teachers = new TreeSet<>(new Comparator<Teacher>() {
            @Override
            public int compare(Teacher o1, Teacher o2) {
                //主要条件
                int result = o1.getAge() - o2.getAge();
               //次要条件
                result = result == 0 ?o1.getName().compareTo(o2.getName()):result;

               return result;
            }
        });

        Teacher teacher1 = new Teacher("zhangsan",19);
        Teacher teacher2 = new Teacher("lisi",18);
        Teacher teacher3 = new Teacher("wangwu",20);
        Teacher teacher4 = new Teacher("zhaoliu",20);


        teachers.add(teacher1);
        teachers.add(teacher2);
        teachers.add(teacher3);
        teachers.add(teacher4);

        System.out.println(teachers);


    }
}

运行结果

image-20230101224335212

6.5 两种比较方式总结【理解】
  • 两种比较方式小结
    • 自然排序: 自定义类实现Comparable接口,重写compareTo方法,根据返回值进行排序
    • 比较器排序: 创建TreeSet对象的时候传递Comparator的实现类对象,重写compare方法,根据返回值进行排序
    • 在使用的时候,默认使用自然排序,当自然排序不满足现在的需求时,必须使用比较器排序
  • 两种方式中关于返回值的规则
    • 如果返回值为负数,表示当前存入的元素是较小值,存左边
    • 如果返回值为0,表示当前存入的元素跟集合中元素重复了,不存
    • 如果返回值为正数,表示当前存入的元素是较大值,存右边
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

糖分你俩颗~~~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值