ArrayList与顺序表——ArrayList的模拟实现(简单)

一、ArrayList简介

适合查找!!

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

【说明】

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

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

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

  4. 和Vector不同,ArrayList不是线程安全的,在单线程下可以使用,在多线程中可以选择Vector或者CopyOnWriteArrayList

二、ArrayList底层

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

三、ArrayList常用方法

方法功能
boolean add(E e)尾插 e
void add(int index, E element)将 e 插入到 index 位置
boolean addAll(Collection<? extends E> c)尾插 c 中的元素
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
public static void main(String[] args) { 
    List<String> list = new ArrayList<>(); 
    list.add("JavaSE"); 
    list.add("JavaWeb"); 
    list.add("JavaEE"); 
    list.add("JVM"); 
    list.add("测试课程"); 
    System.out.println(list); 

    // 获取list中有效元素个数 
    System.out.println(list.size()); 

    // 获取和设置index位置上的元素,注意index必须介于[0, size)间 
    System.out.println(list.get(1)); 
    list.set(1, "JavaWEB"); 
    System.out.println(list.get(1)); 

    // 在list的index位置插入指定元素,index及后续的元素统一往后搬移一个位置 
    list.add(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);
}

四、ArrayList遍历

三种方式:

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(); 

    //使用迭代器遍历
    Iterator<Integer> it = list.listIterator(); 
    while(it.hasNext()){ 
        System.out.print(it.next() + " "); 
    }
    System.out.println(); 

}

五、ArrayList模拟实现(简单)

public class ArraysNode {
    public int[] elem;//null
    public int usedSize;//0

    public ArraysNode() {
        this.elem = new int[10];
    }

    //方法的模拟实现

}
  • 新增元素,默认在数组最后新增
// 新增元素,默认在数组最后新增
    public void add(int data) {
        //1、判断是不是满的
        if(isFull()) {
            //扩容
            this.elem = Arrays.copyOf(this.elem,this.elem.length+(this.elem.length>>1));
        }
        this.elem[this.usedSize] = data;
        this.usedSize++;
    }
  • 判断是否为空满
//判断是否为满
    public boolean isFull() {
        if(this.usedSize == this.elem.length) {
            return true;//满的
        }
        return false;
    }
  • 打印顺序表
// 打印顺序表
    public void myToString() {
        for (int i = 0; i < this.usedSize; i++) {
            System.out.print(this.elem[i]+" ");
        }
        System.out.println();
    }
  • 在 pos 位置新增元素
// 在 pos 位置新增元素
    public void add(int pos, int data) {
        if(pos>usedSize){
            System.out.println("新增元素位置不合法!");
        }
        //1、不能是满的
        if(isFull()){
            this.elem=Arrays.copyOf(this.elem,this.elem.length+this.elem.length>>1);
        }
        //2、正常的插入
        for(int i= usedSize;i>pos;i--){
            elem[i]=elem[i-1];
        }
        elem[pos]=data;
        usedSize++;
    }
  • 判定是否包含某个元素
// 判定是否包含某个元素
    public boolean contains(int toFind) {
        for(int i=0;i<usedSize;i++){
            if(elem[i]==toFind){
                return true;
            }
        }
        return false;
    }
  • 查找某个元素对应的位置
// 查找某个元素对应的位置
    public int indexOf(int toFind) {
        for(int i=0;i<usedSize;i++){
            if(elem[i]==toFind){
                return i;
            }
        }
        return -1;
    }
  • 获取 pos 位置的元素
// 获取 pos 位置的元素
    public int get(int pos) {
        if(pos<0||pos>=usedSize){
            return -1;
        }
        return elem[pos];
    }
  • 给 pos 位置的元素设为 value
// 给 pos 位置的元素设为 value
    public void set(int pos, int value) {
        if(pos<0||pos>=usedSize){
            System.out.println("输入位置不合法!");
            return;
        }
        elem[pos]=value;
    }
  • 删除第一次出现的关键字key
//删除第一次出现的关键字key
    public void remove(int toRemove) {
        int index=indexOf(toRemove);
        for(int i=index;i<usedSize;i++){
            elem[i]=elem[i+1];
        }
        this.usedSize--;
    }
  • 获取顺序表长度
// 获取顺序表长度
    public int size() {
        return usedSize;
    }
  • 清空顺序表
// 清空顺序表
    public void clear() {
        this.usedSize=0;
    }
  • 测试及运行结果
class TestDemoArrayList{
    public static void main(String[] args) {
        ArraysNode myArrayList=new ArraysNode();
        myArrayList.add(1);
        myArrayList.add(2);
        myArrayList.add(3);
        myArrayList.add(4);
        myArrayList.add(5);
        myArrayList.myToString();    //12345
        myArrayList.add(2,9);
        myArrayList.myToString();//129345
        System.out.println(myArrayList.contains(4));    //true
        System.out.println(myArrayList.contains(8));    //false
        System.out.println(myArrayList.get(1));    //2
        System.out.println(myArrayList.size());    //6
        System.out.println(myArrayList.indexOf(9));    //2
        myArrayList.set(4,8);
        myArrayList.myToString();    //129385
        myArrayList.remove(3);
        myArrayList.myToString();    //12985
        myArrayList.clear();
        myArrayList.myToString();
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值