ArrayLiat与顺序表

目录

1.线性表

2.顺序表

2.1顺序表中接口的实现

3.ArrayList简介

3.1 ArrayList的常见操作

3.2ArrayList的遍历

3.2ArrayList的扩容机制


1.线性表

线性表 linear list n 个具有相同特性的数据元素的有限序列。 线性表是一种在实际中广泛使用的数据结构,常见的线性表:顺序表、链表、栈、队列...
线性表在逻辑上是线性结构,也就说是连续的一条直线。但是在物理结构上并不一定是连续的,线性表在物 理上存储时,通常以数组和链式结构的形式存储。

2.顺序表

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

2.1顺序表中接口的实现

顺序表的一些基本方法

public class SeqList {
    public int[] elem;//创建一个数组
    public int usedSize;//用来记录数据的元素

    public static final int DEAUFAL_CAPACITY = 2;

    public SeqList() {
        this.elem = new int [DEAUFAL_CAPACITY];//不带参数的构造方法用来初始化数组的长度
    }

    //打印元素
    public void disPlay(){
        for(int i = 0;i < usedSize;i++){
            System.out.print(elem[i]+ "  ");
        }
        System.out.println();
    }

    //新增一个元素
    public void Add(int data){
        if(ifFull()){
            //进行数组扩容
            elem = Arrays.copyOf(elem,elem.length*2);
        }
        this.elem[usedSize] = data;
        usedSize++;//计数器++
    }
    //判断数组是否满了
    public boolean ifFull(){
        return elem.length == usedSize;
    }

    //在pos位置新增元素
    public void add(int pos,int data){
        //判段pos位置的下标是否合法
        if(pos < 0 || pos > elem.length){
            throw new RuntimeException("pos下标不合法");
        }
        //判断数组是否满了
        if(ifFull()){
            //数组扩容
            elem = Arrays.copyOf(elem,elem.length*2);
        }
        //挪数据
        for (int i = this.usedSize - 1; i >= pos ; i--) {
            this.elem[i + 1] = elem[i];
        }
        //新增元素
        this.elem[pos] = data;
        usedSize++;
    }
    //判定是否包含某个元素
    public boolean contains(int toFind){
        //遍历数组并判断
        for (int i = 0; i < usedSize; i++) {
            if(this.elem[i] == toFind){
                return  true;
            }
        }
        return false;
    }
    //查找某个元素对应的位置
    public int indexOf(int toFind){
        //遍历数组并判断
        for (int i = 0; i < usedSize; i++) {
            if(this.elem[i] == toFind){
                return  i;
            }
        }
        return -1;
    }
    //获取pos位置的元素
    public int get (int pos){
        //判断pos下表是否合法
        if(pos < 0 || pos > elem.length){
            throw new RuntimeException("pos下标不合法");
        }
        return this.elem[pos];
    }
    //给pos位置的元素设为value
    public void set(int pos,int value){
        //判断pos下表是否合法
        if(pos < 0 || pos > elem.length){
            throw new RuntimeException("pos下标不合法");
        }
        for(int i = 0; i < usedSize;i++){
            if(i == pos){
                this.elem[i] = value;
            }
        }
    }

    //删除第一次出现的关键字key
    public void remove(int toRemove){
        if(usedSize == 0){
            throw new RuntimeException("数组长度为0!");
        }
        //判断是否有你要删除的元素
        int index = indexOf(toRemove);
        if(index == -1){
            System.out.println("不存在你要删除的元素!!!");
            return;
        }
        //将数据往前挪
        for (int i = index; i < usedSize ; i++) {
            this.elem[i] = elem[i+1];
        }
        //删除数据
        usedSize--;
    }
   //记录顺序表的长度
   public int size(){
       return usedSize;
   }

   //清空顺序表
    public void clear(){
        this.usedSize =0;
    return;
    }
}

3.ArrayList简介

在集合框架中, ArrayList 是一个普通的类,实现了 List 接口,具体框架图如下:

1. ArrayList 是以泛型方式实现的,使用时必须要先实例化
2. ArrayList 实现了 RandomAccess 接口,表明 ArrayList 支持随机访问
3. ArrayList 实现了 Cloneable 接口,表明 ArrayList 是可以 clone
4. ArrayList 实现了 Serializable 接口,表明 ArrayList 是支持序列化的
5. Vector 不同, ArrayList 不是线程安全的,在单线程下可以使用,在多线程中可以选择 Vector或者 CopyOnWriteArrayList
6. ArrayList 底层是一段连续的空间,并且可以动态扩容,是一个动态类型的顺序表

3.1 ArrayList的常见操作

方法解释
boolean add(E e)尾插 e
void add(int index, E element)                                      将 e 插入到 index 位置
E remove(int index)        删除 index 位置元素
boolean remove(Object o) 删除遇到的第一个 o
E get(int index)获取下标 index 位置元素
E set(int index, E element)将下标 index 位置元素设置为 element
void clear()清空
boolean contains(Object o)判断 o 是否在线性表中
int indexOf(Object o)返回第一个 o 所在下标
int lastIndexOf(Object o)返回最后一个 o 的下标
List<E> subList(int fromIndex, int toIndex)
截取部分 list

3.2ArrayList的遍历

public static void main(String[] args) {
List<Integer> list = new ArrayList<>();
list.add(1);
list.add(2);
list.add(3);
list.add(4);
list.add(5);
// 使用下标+for遍历
for (int i = 0; i < list.size(); i++) {
System.out.print(list.get(i) + " ");
}
System.out.println();
// 借助foreach遍历
for (Integer integer : list) {
System.out.print(integer + " ");
}
System.out.println();

3.2ArrayList的扩容机制

ArrayList的底层是一组动态数组,会根据数据的多少来判断是否需要扩容(1.5倍扩容)

ArrayList是如何动态扩容的_arraylist的加载因子-CSDN博客

  • 15
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

毕业我要开挖机

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

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

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

打赏作者

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

抵扣说明:

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

余额充值