黑马程序员--Java集合框架(一)

本文深入探讨Java集合框架的概念、特点、结构、方法及应用,包括数组与集合的区别、集合的继承体系、Collection方法演示、集合遍历方式、存储自定义对象与遍历、常见数据结构等核心知识点。

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

——- android培训java培训、期待与您交流! ———-

集合框架

集合的由来
我们学习的Java是一种面向对象的语言,而在我们使用的过程中,我们的很多操作都是通过对象来实现的,为了方便对多个对象进行操作,我们就要对着多个对象进行存储,存储自然需要容器,那么这个容器是什么呢?Java就给我们提供了集合来供我们使用。

集合和数组的区别

1.长度区别
数组:长度固定
集合:长度可变

2.内容区别
数组:可以是基本类型,也可以是引用类型

3.元素内容
数组:只能存储同一种类型
集合:可以存储不同类型(一般存储的是同一种类型)

集合的继承体系结构

在说集合的详细内容前,我们先来看看集合的继承体系结构
这里写图片描述

Collection
Collection集合是整个继承体系结构的顶层,是所有集合的头儿,它的子体系有重复的,有唯一的,有有序的,有无序的。

Collection方法演示

public class CollectionDemo {
    public static void main(String[] args) {
        // 测试不带All的方法

        // 创建集合对象
        // Collection c = new Collection(); //错误,因为接口不能实例化
        Collection c = new ArrayList();

        // boolean add(Object obj):添加一个元素
        // System.out.println("add:"+c.add("hello"));
        c.add("hello");
        c.add("world");
        c.add("java");

        // void clear():移除所有元素
        // c.clear();

        // boolean remove(Object o):移除一个元素
        // System.out.println("remove:" + c.remove("hello"));
        // System.out.println("remove:" + c.remove("javaee"));

        // boolean contains(Object o):判断集合中是否包含指定的元素
        // System.out.println("contains:"+c.contains("hello"));
        // System.out.println("contains:"+c.contains("android"));

        // boolean isEmpty():判断集合是否为空
        // System.out.println("isEmpty:"+c.isEmpty());

        //int size():元素的个数
        System.out.println("size:"+c.size());

        System.out.println("c:" + c);
    }
}

Collection中测试带All的方法

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

/*
 * boolean addAll(Collection c):添加一个集合的元素
 * boolean removeAll(Collection c):移除一个集合的元素(是一个还是所有)
 * boolean containsAll(Collection c):判断集合中是否包含指定的集合元素(是一个还是所有)
 * boolean retainAll(Collection c):两个集合都有的元素?思考元素去哪了,返回的boolean又是什么意思呢?
 */
public class CollectionDemo2 {
    public static void main(String[] args) {
        // 创建集合1
        Collection c1 = new ArrayList();
        c1.add("abc1");
        c1.add("abc2");
        c1.add("abc3");
        c1.add("abc4");

        // 创建集合2
        Collection c2 = new ArrayList();
        //c2.add("abc1");
        //c2.add("abc2");
        //c2.add("abc3");
        //c2.add("abc4");
        c2.add("abc5");
        c2.add("abc6");
        c2.add("abc7");

        // boolean addAll(Collection c):添加一个集合的元素
        // System.out.println("addAll:" + c1.addAll(c2));

        //boolean removeAll(Collection c):移除一个集合的元素(是一个还是所有)
        //只要有一个元素被移除了,就返回true。
        //System.out.println("removeAll:"+c1.removeAll(c2));

        //boolean containsAll(Collection c):判断集合中是否包含指定的集合元素(是一个还是所有)
        //只有包含所有的元素,才叫包含
        // System.out.println("containsAll:"+c1.containsAll(c2));

        //boolean retainAll(Collection c):两个集合都有的元素?思考元素去哪了,返回的boolean又是什么意思呢?
        //假设有两个集合A,B。
        //A对B做交集,最终的结果保存在A中,B不变。
        //返回值表示的是A是否发生过改变。
        System.out.println("retainAll:"+c1.retainAll(c2));

        System.out.println("c1:" + c1);
        System.out.println("c2:" + c2);
    }
}

集合的遍历

第一种方式
Object[] toArray():把集合转成数组,可以实现集合的遍历

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

public class CollectionDemo3 {
    public static void main(String[] args) {
        // 创建集合对象
        Collection c = new ArrayList();

        // 添加元素
        c.add("hello"); // Object obj = "hello"; 向上转型
        c.add("world");
        c.add("java");

        // 遍历
        // Object[] toArray():把集合转成数组,可以实现集合的遍历
        Object[] objs = c.toArray();
        for (int x = 0; x < objs.length; x++) {
            // System.out.println(objs[x]);
            // 我知道元素是字符串,我在获取到元素的的同时,还想知道元素的长度。
            // System.out.println(objs[x] + "---" + objs[x].length());
            // 上面的实现不了,原因是Object中没有length()方法
            // 我们要想使用字符串的方法,就必须把元素还原成字符串
            // 向下转型
            String s = (String) objs[x];
            System.out.println(s + "---" + s.length());
        }
    }
}

第二种方式:迭代器遍历(集合特有的遍历方式)

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

public class IteratorDemo {
    public static void main(String[] args) {
        // 创建集合对象
        Collection c = new ArrayList();

        // 创建并添加元素
        // String s = "hello";
        // c.add(s);
        c.add("hello");
        c.add("world");
        c.add("java");

        // Iterator iterator():迭代器,集合的专用遍历方式
        Iterator it = c.iterator(); // 实际返回的肯定是子类对象,这里是多态

        while (it.hasNext()) {
            // System.out.println(it.next());
            String s = (String) it.next();
            System.out.println(s);
        }
    }
}

存储自定义对象并遍历
上面是存储基本类型的集合的遍历方式,下面是存储引用类型的集合的遍历方式
首先写一个自定义学生对象类

public class Student {
    // 成员变量
    private String name;
    private int age;

    // 构造方法
    public Student() {
        super();
    }

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

    // 成员方法
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}

写一个学生测试类

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

public class StudentDemo {
    public static void main(String[] args) {
        // 创建集合对象
        Collection c = new ArrayList();

        // 创建学生对象
        Student s1 = new Student("周杰伦", 30);
        Student s2 = new Student("王力宏", 27);
        Student s3 = new Student("林俊杰", 33);
        Student s4 = new Student("刘德华", 45);
        Student s5 = new Student("罗志祥", 22);

        // 把学生添加到集合
        c.add(s1);
        c.add(s2);
        c.add(s3);
        c.add(s4);
        c.add(s5);

        // 把集合转成数组
        Object[] objs = c.toArray();
        // 遍历数组
        for (int x = 0; x < objs.length; x++) {
            // System.out.println(objs[x]);

            Student s = (Student) objs[x];
            System.out.println(s.getName() + "---" + s.getAge());
        }
    }
}

思考:迭代器为什么不定义成一个类,而是定义成一个接口?
其主要原因是因为迭代器是依赖于集合存在的。假设迭代器定义的是一个类,这样我们就可以创建该类的对象,调用该类的方法来实现集合的遍历。但是Java中有很多的集合类,而这些集合类的数据结构是不同的,那么最终的存储方式和遍历方式也是不同的,进而他们的遍历方式也应该是不一样的,所以最终,就没有定义迭代器类。而无论你使用哪种集合,你都应该具备对元素的操作,最好再有判断功能来辅助,这样就比较符合先判断再获取的逻辑。也就是说,判断和获取这两个功能应该是一个集合遍历所具备的,但是每种集合的方式又不太一样,所以就把这两个功能提取出来,并不提供具体实现,这就是接口。真正的具体实现类则是以内部类的方式体现的。

List

List是Collection的子接口,其特点是有序(存储顺序和取出顺序一致);可重复。

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

public class ListDemo {
    public static void main(String[] args) {
        // 创建集合对象
        List list = new ArrayList();

        // 创建字符串并添加字符串
        list.add("hello");
        list.add("world");
        list.add("java");

        // 遍历集合
        Iterator it = list.iterator();
        while (it.hasNext()) {
            String s = (String) it.next();
            System.out.println(s);
        }
    }
}

List的特有功能

import java.util.ArrayList;
import java.util.List;

/*
 * List集合的特有功能:
 * A:添加功能
 *      void add(int index,Object element):在指定位置添加元素
 * B:获取功能
 *      Object get(int index):获取指定位置的元素
 * C:列表迭代器
 *      ListIterator listIterator():List集合特有的迭代器
 * D:删除功能
 *      Object remove(int index):根据索引删除元素,返回被删除的元素
 * E:修改功能
 *      Object set(int index,Object element):根据索引修改元素,返回被修饰的元素
 */
public class ListDemo {
    public static void main(String[] args) {
        // 创建集合对象
        List list = new ArrayList();

        // 添加元素
        list.add("hello");
        list.add("world");
        list.add("java");

        // void add(int index,Object element):在指定位置添加元素
        // list.add(1, "android");//没有问题
        // IndexOutOfBoundsException
        // list.add(11, "javaee");//有问题
        // list.add(3, "javaee"); //没有问题
        // list.add(4, "javaee"); //有问题

        // Object get(int index):获取指定位置的元素
        // System.out.println("get:" + list.get(1));
        // IndexOutOfBoundsException
        // System.out.println("get:" + list.get(11));

        // Object remove(int index):根据索引删除元素,返回被删除的元素
        // System.out.println("remove:" + list.remove(1));
        // IndexOutOfBoundsException
        // System.out.println("remove:" + list.remove(11));

        // Object set(int index,Object element):根据索引修改元素,返回被修饰的元素
        System.out.println("set:" + list.set(1, "javaee"));

        System.out.println("list:" + list);
    }
}

List集合的特有遍历功能
存储字符串并遍历

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

public class ListDemo2 {
    public static void main(String[] args) {
        // 创建集合对象
        List list = new ArrayList();

        // 存储元素
        list.add("hello");
        list.add("world");
        list.add("java");
        list.add("javaee");
        list.add("android");
        list.add("javaee");
        list.add("android");

        // 遍历集合
        Iterator it = list.iterator();
        while (it.hasNext()) {
            String s = (String) it.next();
            System.out.println(s);
        }
    }
}

存储自定义对象并遍历
自定义学生类

public class Student {
    // 成员变量
    private String name;
    private int age;

    // 构造方法
    public Student() {
        super();
    }

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

    // 成员方法
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}

学生对象遍历测试类

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

public class ListDemo {
    public static void main(String[] args) {
        // 创建集合对象
        List list = new ArrayList();

        // 创建学生对象
        Student s1 = new Student("孙悟空", 30);
        Student s2 = new Student("猪八戒", 40);
        Student s3 = new Student("沙悟净", 27);

        // 把学生对象添加到集合对象中
        list.add(s1);
        list.add(s2);
        list.add(s3);

        // 遍历
        Iterator it = list.iterator();
        while (it.hasNext()) {
            Student s = (Student) it.next();
            System.out.println(s.getName() + "---" + s.getAge());
        }
    }
}

常见数据结构

特点:先进后出,例如子弹夹,第一次发射的是最后一颗压入弹夹的子弹,那么最后一个发射的就是压入的第一颗子弹
这里写图片描述

队列
特点:先进先出。例如排队打饭,第一个排队的第一个吃上饭,最后一个排队的最后才能吃饭。
这里写图片描述

数组

特点:存储同一种类型的多个元素的容器,有索引,方便获取
这里写图片描述

链表
由一个链子把多个结点连起来组成的数据
结点:由数据早(数据域)和地址(指针域)组成

这里写图片描述

——- android培训java培训、期待与您交流! ———-

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值