当前位置: 代码网 > it编程>编程语言>Java > Java中ArrayList与顺序表示例详解

Java中ArrayList与顺序表示例详解

2025年12月04日 Java 我要评论
前言这篇文章来和大家分享一下java集合框架与最基础的arraylist的使用.老话说,读书百遍其义自见.这是我第二次学习一些新的心得与理解.我将从java集合框架到顺序表再到官方的arraylist

前言

这篇文章来和大家分享一下java集合框架与最基础的arraylist的使用.老话说,读书百遍其义自见.这是我第二次学习一些新的心得与理解.我将从java集合框架到顺序表再到官方的arraylist进行分享~

一、java集合框架

  • java 集合框架是 java 中用于存储和操作一组对象的体系,核心分为 collection(单列集合)和map(双列集合)

核心接口与分类

  • collection(单列集合)

    • 是所有单列集合的根接口,定义了集合的基本操作(增删改查、遍历等)。
    • 子接口:list(有序可重复)、set(无序不可重复)、queue(队列)。
  • map(双列集合)

    • 存储键值对(key-value),key 唯一、value 可重复。
    • 子接口:sortedmap(键有序)。
  • 有小伙伴说哎哎哎这都是啥?不用大家都记住,以后我会在数据结构这个合集和大家一点一点掰扯~ 咱们现在就只需要知道存储和操作数据的体系,我们在数据结构中学的一些结构与方法被java官方封装好啦,通过一些接口连接成了上面的集合结构.咱们今天就先看看arraylist

arraylist

  • arraylist是 java 集合框架中list接口的动态数组实现类
    • 底层结构:基于动态数组(默认初始容量为 10,当元素满时自动扩容)。
    • 有序性:元素按插入顺序存储,支持通过索引(get(int index))快速访问。
    • 可重复性:允许存储重复元素、null值。
    • 线程不安全:多线程环境下操作会有并发问题(需手动加锁或用copyonwritearraylist替代)。

我们接下来会详细介绍一下它~

二、顺序表

  • 在数据结构中,顺序表是用连续的存储单元存储元素的线性表,而 java 中的arraylist就是顺序表的具体实现,下面从数据结构方面介绍:

数据结构中的顺序表

  • 定义:用一段地址连续的存储单元(如数组)依次存储线性表的元素,元素的逻辑顺序与物理存储顺序一致。
  • 核心特点:
    • 支持随机访问:通过索引直接定位元素,时间复杂度o(1)。
    • 存储连续:插入 / 删除中间元素时,需移动后续元素,时间复杂度o(n)。
    • 容量固定(原生顺序表):数组容量一旦确定无法动态调整(但arraylist做了动态扩容优化)。

三、常用代码手动实现

  • 这一部分的逻辑是较为简单的,小伙伴们如果是第一次接触,非常建议大家上手实现一下~
    我就都分成一个一个小的代码块了 大家在学习的时候也可以分成基本成员变量,成员方法,**辅助方法(在成员方法中被调用的小方法)**进行学习

基本方法

import java.util.arrays;

public class myarraylist implements ilist{

    //基本成员方法

     public int [] element ;
     public int usedside;
     public static final int default_capacity =10;

     public myarraylist(){
        this.element = new int[default_capacity];
     }



    @override
    public void add(int data) {
         //判断是不是满  -- 扩容后进行添加元素
        if (isfull()){
            grow();
        }
        this.element[this.usedside] = data;
        usedside++;

    }

    public boolean isfull(){
         return usedside == this.element.length;
    }

    public void grow(){
        this.element = arrays.copyof(this.element,
                 2*element.length);
    }
    public void checkposadd(int pos,string mag) {
        if (pos < 0 || pos > usedside) {
            throw new posillegalityexception(mag);
        }
    }

    @override
    public void add(int pos, int data) {
         //判断满没有
        if (isfull()){
            grow();
        }
        // 下表是不是合法的
        checkposadd(pos,"pos位置不合法");
        //交换数据
        for (int i = usedside-1;i >= pos;i--){
            element[i] = element[i+1];
        }
        element[pos] = data;
        usedside++;
    }

    @override
    public boolean contains(int tofind) {

         for (int i = 0 ;i < usedside ; i ++){
             if (this.element[i] == tofind){
                 return true;
             }
         }
        return false;
    }

    @override
    public int indexof(int tofind) {
        for (int i = 0 ;i < usedside ; i ++){
            if (this.element[i] == tofind){
                return i;
            }
        }
        return -1;
    }

    @override
    public int get(int pos) {
         if (isempty()){
             throw new emptyillegalityexception
                     ("空列表异常");
         }
         checkpos(pos,"get方法的pos越界异常");
         return element[pos];
    }

    //检查越界异常
    public void checkpos(int pos,string mag){
         if (pos < 0 || pos >= usedside){
             throw new posillegalityexception(mag); //调用异常
         }
    }


    public boolean isempty(){
         return this.usedside == 0;
    }



    @override
    public void set(int pos, int value) {
         checkpos(pos, "upset方法pos位置违法");
         //是不是空
        if(isempty()){
            throw new emptyillegalityexception("set方法空指针异常");
        }
         this.element[pos] = value;


    }


    @override
    public void remove(int toremove) {
         //判断是不是空
        if (isempty()){
            throw new emptyillegalityexception("空链表异常");
        }

        int pos = indexof(toremove);
        if (pos < 0){
            throw new posillegalityexception("删除位置异常");
        }
        //核心逻辑进行
        for (int i = pos; pos < usedside-1 ;i++ ){
            //在进行add会将最后那个覆盖
            this.element[i] = element[i+1];
        }
        usedside--;



    }

    @override
    public int size() {
     //判断是不是空
        if(isempty()){
            throw new emptyillegalityexception("set方法空指针异常");
        }
        return this.usedside;

    }

    @override
    public void clear() {
         for (int i = 0;i < usedside ;i++){
             this.element[i] = 0;
             //是引用类型是就要给到null
         }
         usedside =0;
    }

    @override
    public void display() {
         for (int i = 0 ; i < usedside ;i++){
             system.out.println(element[i]+" ");
         }
        system.out.println();
    }
}

异常类

在上面会有一点异常的处理,在这两个类中啦,要是对异常不太清楚了,也可以看看我的计算机异常文章,可以对你有帮助~

public class posillegalityexception extends runtimeexception {
    //构造方法

    public posillegalityexception() {
    }

    public posillegalityexception(string message) {
        super(message);
    }
}

public class emptyillegalityexception extends runtimeexception {
    public emptyillegalityexception() {
    }

    public emptyillegalityexception(string message) {
        super(message);
    }
}

四、arraylist使用

我们看一下java官方包中的方法

构造方法

官方提供了三个构造方法,分别是无参数,指定容量,给予已有集合的,我们一个一个看.

无参构造方法 arraylist()

public arraylist() {
    this.elementdata = defaultcapacity_empty_elementdata;
}
  • 核心细节:
    • 初始化时,底层数组elementdata会被赋值为空数组. (defaultcapacity_empty_elementdata是一个静态空数组常量).
    • 延迟初始化:第一次调用add()方法时,才会将数组扩容至默认初始容量 10.
    • 目的:避免创建空 arraylist 时占用不必要的内存(空数组仅占极小空间)。

指定初始容量的构造方法 arraylist(int initialcapacity)

public arraylist(int initialcapacity) {
    if (initialcapacity > 0) {
        this.elementdata = new object[initialcapacity];
    } else if (initialcapacity == 0) {
        this.elementdata = empty_elementdata; // 另一个静态空数组常量
    } else {
        throw new illegalargumentexception("illegal capacity: " + initialcapacity);
    }
}
  • 核心细节:
    • 参数initialcapacity是期望的初始容量,需≥0。
    • 分三种情况:
      - initialcapacity > 0:直接创建一个容量为initialcapacity的object[]数组。
      - initialcapacity == 0:底层数组赋值为empty_elementdata(与无参构造的defaultcapacity_empty_elementdata是不同的空数组常量,用于区分 “用户指定容量 0” 和 “默认空数组”)。
      -initialcapacity < 0:抛出illegalargumentexception非法参数异常。
  • 适用场景:已知集合大致大小,提前指定容量可避免后续多次扩容,提升性能。

基于已有的集合的构造方法arraylist(collection<? extends e> c)

public arraylist(collection<? extends e> c) {
    elementdata = c.toarray();
    if ((size = elementdata.length) != 0) {
        // c.toarray()可能返回的不是object[]类型(如某些自定义集合),需转换
        if (elementdata.getclass() != object[].class) {
            elementdata = arrays.copyof(elementdata, size, object[].class);
        }
    } else {
        // 集合c为空,赋值为空数组
        this.elementdata = empty_elementdata;
    }
}
  • 参数c是一个实现了collection接口的集合(如linkedlist、hashset等),用于初始化 arraylist。

官方常用方法

  • 需要注意的就是每个方法的返回类型+方法名+形参
  • 一定要动手操作一下

五、arraylist的遍历

直接打印

system.out.println(list);

for循环

 for(int i = 0; i <= list.size()-1; i++{
        integer ii = list.get(i);
       system.out.print(" "+ ii);
 }

    for (int x :list){
            system.out.print(x + " ");
        }

迭代器

介绍

在 java 集合框架中,迭代器(iterator) 是用于遍历集合元素的统一接口,它提供了一种不依赖集合底层结构的遍历方式,核心作用是 “解耦集合与遍历逻辑”。

方法

  • 接口位置:java.util.iterator
  • 核心方法:
    • boolean hasnext():判断是否还有下一个元素(无元素时返回false)。
    • e next():返回下一个元素(无元素时抛出nosuchelementexception)。
迭代器
     iterator<integer> it = list.iterator();
     while (it.hasnext()) {
          system.out.println(it.next()+ " ");
      }

        //迭代器
        listiterator<integer> it = list.listiterator();
        while (it.hasnext()){
            system.out.print(it.next()+ " ");
        }
        system.out.println();
//指定位置后开始
        listiterator<integer> it2 = list.listiterator(1);
        while (it2.hasnext()){
            system.out.print(it2.next()+ " ");
        }
        system.out.println();
//指定位置前开始
        listiterator<integer> it3 = list.listiterator(list.size());
        while (it3.hasprevious()){   //返回值bool
            system.out.print(it3.previous()+ " ");
        }

总结

  • 到这里我的分享就先结束了~,希望对你有帮助
  • 我是dylan 下次见~
    • 无限进步

到此这篇关于java中arraylist与顺序表示的文章就介绍到这了,更多相关java arraylist与顺序表内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com