【Java】—— 集合框架:List接口常用方法与List接口的实现类

目录

4. Collection子接口1:List

4.1 List接口特点

4.2 List接口方法

4.3 List接口主要实现类:ArrayList

4.4 List的实现类之二:LinkedList

4.5 List的实现类之三:Vector

4.6 练习


4. Collection子接口1:List

4.1 List接口特点

  • 鉴于Java中数组用来存储数据的局限性,我们通常使用java.util.List替代数组

  • List集合类中元素有序、且重复,集合中的每个元素都有其对应的顺序索引

    • 举例:List集合存储数据,就像银行门口客服,给每一个来办理业务的客户分配序号:第一个来的是“张三”,客服给他分配的是0;第二个来的是“李四”,客服给他分配的1;以此类推,最后一个序号应该是“总人数-1”。

  • JDK API中List接口的实现类常用的有:ArrayListLinkedListVector

4.2 List接口方法

List除了从Collection集合继承的方法外,List 集合里添加了一些根据索引来操作集合元素的方法。

  • 插入元素

    • void add(int index, Object ele):在index位置插入ele元素

    • boolean addAll(int index, Collection eles):从index位置开始将eles中的所有元素添加进来

  • 获取元素

    • Object get(int index):获取指定index位置的元素

    • List subList(int fromIndex, int toIndex):返回从fromIndex到toIndex位置的子集合

  • 获取元素索引

    • int indexOf(Object obj):返回obj在集合中首次出现的位置

    • int lastIndexOf(Object obj):返回obj在当前集合中末次出现的位置

  • 删除和替换元素

    • Object remove(int index):移除指定index位置的元素,并返回此元素

    • Object set(int index, Object ele):设置指定index位置的元素为ele

举例:

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

public class TestListMethod {
    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++){
            System.out.println(list.get(i));
        }
        //还可以使用增强for
        for (String string : list) {
            System.out.println(string);
        }
    }
}

注意:在JavaSE中List名称的类型有两个,一个是java.util.List集合接口,一个是java.awt.List图形界面的组件,别导错包了。

4.3 List接口主要实现类:ArrayList

  • ArrayList 是 List 接口的主要实现类

  • 本质上,ArrayList是对象引用的一个”变长”数组

  • Arrays.asList(…) 方法返回的 List 集合,既不是 ArrayList 实例,也不是 Vector 实例。 Arrays.asList(…) 返回值是一个固定长度的 List 集合

4.4 List的实现类之二:LinkedList

  • 对于频繁的插入或删除元素的操作,建议使用LinkedList类,效率较高。这是由底层采用链表(双向链表)结构存储数据决定的。

  • 特有方法:

    • void addFirst(Object obj)

    • void addLast(Object obj)

    • Object getFirst()

    • Object getLast()

    • Object removeFirst()

    • Object removeLast()

4.5 List的实现类之三:Vector

  • Vector 是一个古老的集合,JDK1.0就有了。大多数操作与ArrayList相同,区别之处在于Vector是线程安全的。

  • 在各种List中,最好把ArrayList作为默认选择。当插入、删除频繁时,使用LinkedList;Vector总是比ArrayList慢,所以尽量避免使用。

  • 特有方法:

    • void addElement(Object obj)

    • void insertElementAt(Object obj,int index)

    • void setElementAt(Object obj,int index)

    • void removeElement(Object obj)

    • void removeAllElements()

4.6 练习

练习1:

  • 定义学生类,属性为姓名、年龄,提供必要的getter、setter方法,构造器,toString(),equals()方法。

  • 使用ArrayList集合,保存录入的多个学生对象。

  • 循环录入的方式,1:继续录入,0:结束录入。

  • 录入结束后,用foreach遍历集合。

  • 代码实现,效果如图所示:

Student.java

package exer1;

import java.util.Objects;

/**
 * ClassName:IntelliJ IDEA
 * Description:
 *      定义学生类,属性为姓名、年龄,提供必要的getter、setter方法,构造器,toString(),equals()方法
 * @Author zyjstart
 * @Create:2024/10/2 16:13
 */
public class Student {
    private String name;
    private int age;

    public Student() {
    }

    public Student(String name, int age) {
        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;
    }

    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", age=" + 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);
    }

/*    @Override
    public int hashCode() {
        return Objects.hash(name, age);
    }*/
}

StudentTest.java

package exer1;

import java.util.ArrayList;
import java.util.Scanner;

/**
 * ClassName:IntelliJ IDEA
 * Description:
 *
 * @Author zyjstart
 * @Create:2024/10/2 16:17
 */
public class StudentTest {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        ArrayList list = new ArrayList();

        System.out.println("请录入学生信息:");

        while (true){
            System.out.println("1:继续录入,0:结束录入");
            int selection = sc.nextInt();

            if (selection == 0){    //输入是0,退出循环
                break;
            }

            System.out.print("请输入学生的姓名:");
            String name = sc.next();
            System.out.print("请输入学生的年龄:");
            int age = sc.nextInt();
            // 将输入的姓名和年龄封装到对象里边
            Student s = new Student(name,age);
            // 将对象添加到集合里边
            list.add(s);

        }

        //遍历集合中的学生信息
        System.out.println("遍历学生信息:");
        for (Object s : list){
            System.out.println(s.toString());
        }

        sc.close();
    }
}

练习2:

1、请定义方法public static int listTest(Collection list,char s)统计集合中指定元素出现的次数

2、创建集合,集合存放随机生成的30个小写字母

3、用listTest统计,a、b、c、x元素的出现次数

4、效果如下

ListTest.java
package exer2;

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

/**
 * ClassName:IntelliJ IDEA
 * Description:
 *
 * @Author zyjstart
 * @Create:2024/10/2 19:19
 */
public class ListTest {
    public static void main(String[] args) {

        // 需求1:随机生成30个字符,存放在ArrayList中
        ArrayList list = new ArrayList();

        for (int i=0;i<30;i++){
            // 'a' - 'z'  [97,122]
            list.add((char)(Math.random() * 26 + 97));//使用Math类产生随机数,Random方法的范围为[0,1)
        }
        System.out.println(list);

        // 调用方法,将该字符出现的次数返回
        int aCount = listTest(list, 'a');
        int bCount = listTest(list, 'b');
        int cCount = listTest(list, 'c');
        int xCount = listTest(list, 'x');

        // 输出结果
        System.out.println("a:" + aCount);
        System.out.println("b:" + bCount);
        System.out.println("c:" + cCount);
        System.out.println("x:" + xCount);

    }

    // 需求2:遍历ArrayList,查找指定的元素出现的次数
    public static int listTest(Collection list,char s){
        int count = 0;  // 用于统计该字符出现的次数
        for (Object obj : list){
            if (s == (char)obj){
                count++;
            }
        }
        return count;
    }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值