ArrayList与顺序表

发布于:2025-02-11 ⋅ 阅读:(55) ⋅ 点赞:(0)

1.线性表(linear list) 是n个具有相同特性的数据元素的有序数列.线性表是一种在实际中广泛使用的数据结构,常见的线性表:顺序表,链表,栈,队列...

线性表在逻辑上是线性结构的,也就是说是一条连续的直线.但是在物理结构上并不一定是连续的,线性表在物理上存储时,通常以数组和链式结构的形式储存

2.顺序表

顺序表是用一段物理地址连续的储存单元依次存储数据的线性结构,一般情况下采用的数组储存.在数组上完成增删改查

2.1接口的实现

public class SeqList {
    private int[] array;
    private int size;
    //默认构造方法
    public SeqList(){
    }
    //把顺序表的底层容量设为initcapacity
    SeqList(int initcapacity){
    }
    //新增加元素,默认在数组最后新增元素
    public void add(int data){
    }
    //在指定位置(pos) 位置新增元素
    public void add(int pos,int data){
    }
    //判断是否包含某个元素,如果包含这个元素就返回true,否则就返回false
    public boolean contains(int toFind){
        return true;
    }
    //查找某个元素对应的位置,如果找到对应元素,就返回其元素的下标,如果没有找到元素,就返回-1;
    public int indexOf(int toFind){
        return -1;
    }
    //获取pos的位置的元素
    public int get(int pos){
        return -1;
    }
    //给pos的位置的元素设为 value
    public void set(int pos,int value){
    }
    //删除第一次出现的关键字key
    public void remove(int toRemove){
    }
    //获取顺序表的长度
    public int size(){
        return 0;
    }
    //清空顺序表
    public void clear(){
    }
    //打印顺序表
    public void display(){}
}

ArrayList简介

在集合框架中,ArrayList是一个普通的类,实现了List接口

说明:

ArrayList是以泛型方式实现的,使用的时候必须先实例化.

ArrayList实现了RandomAccess接口,表明ArraList支持随机访问

ArraList实现了Cloneable接口,表明ArrayList是可以clone的

ArrayList实现了Serialiable接口,表明ArrayList是支持序列化的

ArrayList底层是一段连续的空间,并且可以动态扩容,是一个动态类型的顺序表

4.ArrayList的使用

4.1ArrayList的构造

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

public class Main {
    public static void main(String[] args) {
        //ArrayList 创建,推荐写法
        //构造一个空的列表
        List<Integer> list1 = new ArrayList<>();
        //构造一个具有10个容量的列表
        List<Integer> list2 = new ArrayList<>(10);
        list2.add(1);
        list2.add(2);
        list2.add(3);
        //类型不匹配发生报错
//        list2.add("hello");
        //如果我们要输入类似 list2.add("hello")这样的类型的内容,是不允许的.
        //我们在前面已经限定了泛型的类型是 Integer,类型不匹配就会报错.
        //我们可以通过创建 String 类型的 ArrayList 来存储 String 类型的数据
        List<String> list3 = new ArrayList<>();
        list3.add("hello");
        list3.add("world");
        //打印输出的内容是以数组的形式打印出来的
        System.out.println(list2);
        //我们在创建泛型的时候应该去避免出现,不指定存放元素类型这样的写法.
        //这样会导致顺序表中存放的内容的数据类型不明确,容易出现错误
    }
}

4.2ArrayList常见的操作方法

import java.util.ArrayList;
import java.util.InputMismatchException;
import java.util.List;
import java.util.Scanner;

public class Main2 {
    public static void main(String[] args) {
        //创建了一个存放 String 类型的 ArrayList
        List<String> list = new ArrayList<String>();
        //我们向 ArrayList 中添加元素
        list.add("JavaSE");
        list.add("JavaWeb");
        list.add("JavaEE");
        list.add("JVM");
        list.add("测试");
        //先打印一下 ArrayList 查看一下里面的元素
        System.out.println(list);
        //我们下面使用不同的方法
        //获取 list 中的有效元素的个数
        System.out.println(list.size());
        //获取和设置 index 位置上的元素,注意的是 index 必须要介于[0,size)之间
        //简单的获取的 index 位置上的元素
        System.out.println(list.get(1));
        //我们可以加上一些判断,来确保发生数组越界的情况发生
        //通过try{} 来抛出异常
//        Scanner scanner = new Scanner(System.in);
//        System.out.println("请输入要获取的 index 位置:");
//        int index = scanner.nextInt();
//        try{
//            if(index < 0 || index > list.size() - 1){
//                //通过 throw 来抛出异常
//                throw new InputMismatchException();
//            }
//            System.out.println(list.get(index));
//        }//通过 catch{}来捕获异常并处理异常
//        catch (InputMismatchException e){
//            System.out.println("输入的 index 位置,发生数组越界的情况发生");
//        }
        //我们通过 set() 方法来修改 index 位置上的元素
        list.set(1,"Java数据结构");
        //修改完毕后我们再次进行一次打印
        System.out.println(list);
        //删除自定元素,如果我们找到就删除,把该元素之后的元素同一向前搬移一个单位
        list.remove("JVM");
        System.out.println(list);
        //删除 list 中的 index 位置上的元素,注意 index 不要超过 list 中的有效元素的个数,否则会抛出下标异常
        //这里是删除了最后一个元素.
        list.remove(list.size() - 1);
        System.out.println(list);
        //检测 list 中是否包含某一个元素,如果存在返回 true,否则返回 false
        if(list.contains("测试")){
            list.add("测试");
        }
        //查找指定元素第一次出现的位置:indexOf() 从前向后找,lastIndexOf() 从后向前找
        list.add("JavaSE");
        System.out.println(list.indexOf("JavaSE"));
        System.out.println(list.lastIndexOf("JavaSE"));
        //使用 list 中[0,4)之间的元素构成一个新的SubList返回,但是和ArrayList共用一个elementData数组
//        List<String> ret = new list.subList(0,4);
        //清空数组
        list.clear();
        System.out.println(list);
        System.out.println(list.size());
    }
}

4.3ArrayList的遍历

ArrayList可以使用三种方式进行遍历: for循环 + 下标,foreach,使用,迭代器

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

public class Main3 {
    public static void main(String[] args) {
        List<Integer> list = new ArrayList<Integer>();
        list.add(1);
        list.add(2);
        list.add(3);
        list.add(4);
        list.add(5);
        System.out.println(list);
        //使用 for 循环来遍历
        for (int i = 0; i < list.size(); i++){
            System.out.println(list.get(i));
        }
        //借助 foreach 遍历
        for (Integer i : list){
            System.out.println(i + "");
        }
        System.out.println();
        //使用迭代器
        Iterator<Integer> it = list.listIterator();
        while(it.hasNext()){
            System.out.println(it.next() + " ");
        }
    }
}

注意的是:

ArrayList最常用的遍历的方式是:for循环+下标 以及foreach

2.迭代器是设计模式的一种方式,在后面才会使用

4.4ArrayList的扩容机制

ArrayList是一个动态类型的顺序表,即:在插入元素的过程中会自动扩容 

 


网站公告

今日签到

点亮在社区的每一天
去签到