Java中的ArrayList和线性表用法及说明

 更新时间:2025年12月26日 09:04:05   作者:月下清融析愿  
文章介绍了线性表及其常见实现方式,包括顺序表和链表,重点讨论了顺序表的实现细节,如接口实现、增删查改操作、内存管理等,同时,文章还简要介绍了ArrayList的概念及其在Java集合框架中的应用,包括ArrayList的构造、常见方法和遍历方式

一、线性表

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

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

二、顺序表

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

接口的实现

注意事项:

  • 接口里的抽象方法一定要重写
  • 接口里的默认方法可选重写
  • 接口里的空接口不用重写
  • 不是接口方法不用重写
  • 快捷重写键: ctrl + o

使用方法

现在我们通过数据结构来使用这些方法

数据结构与以往我们练习有最大的不同就是,可以实现自己造轮子

1.display方法

我们来写一个遍历

display可以遍历数据表中的所有元素

这样可以遍历所有数据表中的有效数据

不可以用for each来遍历,因为所有数据都是零,无法区分是否为有效数据

正常来讲,因为现在数据表里没有任何有效数据,所以分割线下面应该是没有数据打印的,但是打印了许多的零是因为用for each来遍历的话所有数据都是零,无法区分是否为有效数据

2.add方法

这里有两个add方法

  • 第一个add方法 默认将数据放在数组最后
  • 第二个add方法 指定将数据放在数组中某位置
第一个add方法

如果满了,那我们就使用grow来进行扩容,这里使用的是二倍扩容,这里的grow用的是private修饰符,毕竟使用者也无需触碰到扩容

输出结果:

第二个add方法

这个比较抽象,我们先讲一下思路:

  • 要将数据插入数组某一位置,那么我们就要把在原先在这个位置上的数据移动到下一个位置,
  • 但是有个问题,如果该数据所在的下一个位置上还有数据,就会导致两个数据重叠,
  • 因此我们要首先移动最后一个有效数据,
  • 在技术上可以实现为 将i下标的数据定义为 有效数据-1 ,即 usedSize-1(有零下标) ,再将i下标的值赋值给i+1 ,直到 i== 插入数据位置,(即pos位置)也要挪动
i = usedSize - 1;
[i+1] = [i];//直到挪动完 i==pos

然后将要插入的数据放到pos位置,最终让usedSize++(插入了一个数据就多了一个有效数据)就可以了,但是涉及到数组,我们还要判断是否会溢出.

代码:

看似代码一切正常,但有同学可能会问:

  • 如果插入的下标位置是负数怎么办?
  • 如果插入的下标位置大于 usedSize 怎么办?

数据结构规定 每次插入数据的位置 不能有空隙 即前驱必须存在 也就是说 插入位置的前一个位置不能是空的

现在我们要实现:

  • pos < 0 不可以插入
  • pos > usedSize 不可以插入
  • pos == usedSize 可以插入

代码:

这一块前面都提到过就不解释了

3.contains 与 indexof 方法

为了能更好的理解这两个方法,请大家依据中间红色字体的要求来编写一段代码

代码:

那如果是引用类型怎么办,那就不能这样比较了,应该用equals来比较

因此不是说数据表只能放整型

4.get方法

如果数据表是空的怎么办

当然也可以再写一个空异常

5.set方法

这个方法的作用是更新,或者说是覆盖旧的数据

因此pos(数据的下标)必须在0到usedSize - 1之间

6.remove方法

这个方法的作用是删除

注意必须是usedSize-1,如果不减一,在数据放满的情况下array[i+1]会越界

7.clear方法

这个方法很简单,就是清空数组,因为之前我们将data全部存放于usedSzie中

如果usedSize = 0,那么就相当于把数据全部清空了

上面的写法适用于基本数据类型

如果是引用数据类型,如何使用这个方法?

如果是引用数据类型,那么存储的是地址,这种情况下我们需要遍历这些地址,把他们全部置为空,否则会引起内存泄漏

什么是内存泄漏,简单来说内存泄漏就是我已经不使用某个对象了,但是有个引用数据类型一直在引用这个对象,那么这个对象就不能被回收,因此会一直浪费内存

因为是基本类型所以会报错,把基本类型换为应用类型就不会报错了

顺序表的优点与缺点

  • 优点:给定下标的情况下,查询速度非常快 O(1)
  • 缺点:如果要删除或增添数据,非常慢 O(N)

三、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底层是一段连续的空间,并且可以动态扩容,是一个动态类型的顺序表

四、ArrayList的使用

ArrayList的构造

ArrayList常见方法

ArrayList常用遍历方法

可大致分为

for         for-each       Interator迭代器

其中Interator可以延伸出其他用法,ListInterator是Interator用法的延伸

二维数组

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Springboot+MybatisPlus实现带验证码的登录

    Springboot+MybatisPlus实现带验证码的登录

    本文主要介绍了Springboot+MybatisPlus实现带验证码的登录,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-05-05
  • 详解在spring中使用JdbcTemplate操作数据库的几种方式

    详解在spring中使用JdbcTemplate操作数据库的几种方式

    这篇文章主要介绍了详解在spring中使用JdbcTemplate操作数据库的几种方式,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-07-07
  • springboot使用com.github.binarywang包实现微信网页上的支付和退款

    springboot使用com.github.binarywang包实现微信网页上的支付和退款

    最近做项目需要实现在pc端需要实现微信的支付,本文主要介绍了springboot使用com.github.binarywang包实现微信网页上的支付和退款,具有一定的参考价值,感兴趣的可以了解一下
    2024-05-05
  • Java常用 Date 时间格式化、Calender日历、正则表达式的用法小结

    Java常用 Date 时间格式化、Calender日历、正则表达式的用法小结

    SimpleDateFormat 是Java中用于格式化和解析日期的类,它允许你将日期对象转换为特定格式的字符串,或者将特定格式的字符串转换为日期对象,这篇文章主要介绍了Java常用 Date 时间格式化、Calender日历、正则表达式的用法,需要的朋友可以参考下
    2024-12-12
  • 详解如何在Java8中创建和使用线程池

    详解如何在Java8中创建和使用线程池

    在 Java 8 中,线程池(Thread Pool)是一种管理线程资源的机制,能够有效地控制并发执行的线程数量,减少线程创建和销毁的开销,提高系统的性能,本篇文章将详细介绍如何在 Java 8 中创建和使用线程池,需要的朋友可以参考下
    2024-06-06
  • java后端访问https证书的问题及解决

    java后端访问https证书的问题及解决

    这篇文章主要介绍了java后端访问https证书的问题及解决,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-10-10
  • drools规则动态化实践解析

    drools规则动态化实践解析

    这篇文章主要为大家介绍了drools规则动态化实践解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-02-02
  • Java 利用栈来反转链表和排序的操作

    Java 利用栈来反转链表和排序的操作

    这篇文章主要介绍了Java 利用栈来反转链表和排序的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-02-02
  • 详解JAVA 反射机制

    详解JAVA 反射机制

    这篇文章主要介绍了JAVA 反射机制的相关知识,文中讲解的非常细致,代码帮助大家更好的理解学习,感兴趣的朋友可以了解下
    2020-06-06
  • springboot @Async 注解如何实现方法异步

    springboot @Async 注解如何实现方法异步

    这篇文章主要介绍了springboot @Async 注解如何实现方法异步,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-11-11

最新评论