1、线性表

定义

线性表是最基本、最简单、也是最常用的一种数据结构。线性表(linear list)是数据结构的一种,一个线性表是n个具有相同特性的数据元素的有限序列。

常见的线性表:顺序表、链表、栈、队列...

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

特征

  • 集合中必存在唯一的一个“第一元素”。
  • 集合中必存在唯一的一个 “最后元素” 。
  • 除最后一个元素之外,均有唯一的后继(后件)。
  • 除第一个元素之外,均有唯一的前驱(前件)。

2、顺序表

定义

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

实现

首先我们需要创建一个数组来存放数据。

备注:因为我为了方便就先创建的整形数组,为了能更好的适应各种类型,大家可以创建泛型的数组,我这里就没写了。

接下来就是对顺序表的各种操作。例如:基本的CURD,打印顺序表,获取顺序表长度,清空顺序表等等。

打印数组

因为是数组,所以直接遍历数组打印就好了

新增元素

增加元素的时候需要考虑到数组是否满状态的问题,所以我们需要判断,要死数组空间已满,我们还需要进行扩容。另外,我们还需要判断在这个pos位置是否合法。

判断空间是否已满方法

这里我们简化代码为:

如果要扩容的话,在扩容完成之后,因为顺序表是连续的结构,所以在pos位置新增元素的话,那么pos位置之后的元素就要依次往后挪。这样才能把元素新增进去。

 注意:在扩容之后我们需要更改CAPACITY和usedSize的大小。

判断是否包含某个元素

在这我们需要考虑到此时数组是否为空的情况。

之后还是直接遍历数组的操作。

查找元素

在这里也需要一次判空操作。

获取pos位置的元素

这里可能会出现数组为空的情况和pos不合法的情况,所以需要判断。

我这里是手动抛出的异常,没有另外写了。

更改pos位置的值

删除操作

删除某个位置上的元素,这里是直接从这个元素开始,让其后面的元素覆盖掉他前一个元素,以达到删除的目的。

获取顺序表长度

清空顺序表

后面这几个操作比较简单就不多叙述了。

3、ArrayList

简介:

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

[说明]

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

使用

 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"); // 编译失败,List<Integer>已经限定了,list2中只能存储整形元素
        // list3构造好之后,与list中的元素一致
        ArrayList<Integer> list3 = new ArrayList<>(list2);
 
        // 避免省略类型,否则:任意类型的元素都可以存放,使用时将是一场灾难
        List list4 = new ArrayList();
        list4.add("111");
        list4.add(100);
    }

 一些常见方法

方法 解释
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

 ArrayList的遍历

循环遍历

foreach遍历

迭代器

        System.out.println("======迭代器1=========");
 
        ElementObservableListDecorator<Object> list;
        Iterator<String> it =  list.iterator();
        while (it.hasNext()) {
            System.out.println(it.next());
        }
        System.out.println("======迭代器2=========");
        ListIterator<String> it2 =  list.listIterator();
        while (it2.hasNext()) {
            System.out.println(it2.next());
        }

顺序表和数组的区别:

上面说,顺序表的底层可以理解为一个数组,但是相比于数组,更加的高级。

顺序表可以自己扩容;

顺序表严格区分数组容量和元素的个数。

所以数组其实就是一种不完备的顺序表。

顺序表中的注意点:

  • 我们需要区分顺序表中的两个概念:容量(capacity)和元素个数(size)。
  • 容量可以理解为数组的大小(长度),元素个数是size中记录的有效元素个数。
  • 顺序表中,数据的存储是需要连续的,不可以元素和元素之间存在“空隙”,当进行插入、删除等操作时,操作完成后,也要保证顺序表的连续。

总结

到此这篇关于Java中ArrayList与顺序表的定义与实现的文章就介绍到这了,更多相关Java ArrayList与顺序表内容请搜索Devmax以前的文章或继续浏览下面的相关文章希望大家以后多多支持Devmax!

Java中ArrayList与顺序表的定义与实现方法的更多相关文章

  1. android – 如何在ViewPager中使用cursorLoader?

    解决方法我无法评论,所以我正在写一个答案..您有一个实现LoaderCallbacks的活动.加载数据时,您的活动会收到onLoadFinished回调.在此方法中,您有一个应该在ViewPager中显示的Cursor.要显示Cursor中的数据,请在适配器上调用swapCursor方法.因此,每次加载数据时都不要创建适配器.创建一次,然后只需调用swapCursor即可.此外,每次都找不到ViewPager–findViewById是一个繁重的操作,它应该在创建视图层次结构后执行.所以,你的onLoad

  2. android – 在onRestoreInstanceState中发生ClassCastException

    ClassCastException随机发生以恢复onRestoreInstanceState()中的Vector.通常恢复向量很好,但有时会发生异常.我认为它发生在活动进入后台并被破坏但我不确定.有任何想法吗?谢谢.添加:我忘了附上异常日志.那是解决方法我使用下一个代码来恢复Vector:它会阻止java.lang.classCastException并保存元素顺序.要恢复Stack,您可以使用

  3. android – 如何在活动中调用非活动类的方法

    我有一个Activity和非Activity类.如何从非Activity类调用Activity类中的方法解决方法只需在DateClass中创建一个回调接口.

  4. 是否有可能在android中创建一个Bitmap数组

    我想创建一个位图数组.可能吗?如果是,那是声明Bitmap数组的方法.以及如何初始化它?谢谢解决方法你可以使用Arraylist:或者只是一个位图数组,如:不过要小心你的图像大小.如果你试图存储很多大图像,你可能会遇到一些麻烦.

  5. Realm.io Android从表中获取最后20个项目的最佳方法

    在一个表中说100项,这是获得最后20个对象的最佳方法.我能想到的一种方法是加载所有对象,反转数组,创建一个新数组并从结果循环20次,填充新数组并返回它.如下所示:有没有更好的方法在Android中使用realm.io做到这一点?更新到目前为止这是如何处理的..解决方法另请注意,Realm表是无序的.将它们视为放置数据的包.这意味着如果您想要插入最后20个项目,则需要添加一个字段以包含插入时间.这样做还可以让您非常有效地实现您想要的结果:

  6. 如何在Android中处理ConcurrentModificationException

    我试图从ArrayList中删除项目.有时它会弹出一个异常,“java.util.ConcurrentModificationException”.首先我尝试通过array_list_name.remove(i)删除它们,但它失败了,有些人被要求使用Iterator.所以我目前的代码如下.我在视图中的onDraw()函数中调用“array_list_name”.我的观点是SurfaceView.任

  7. android – 用于osmdroid错误的RoadManager

    我在这里遵循https://code.google.com/p/osmbonuspack/wiki/Tutorial_1教程,但我遇到一个错误,它没有正确显示正确的路由.它只显示从A点到B点的直线.我想要实现的是从这些点显示正确的路线.我猜错误是它无法识别任何节点.一个类似的问题也被问到,如果我没有很好地解释我的问题,我假设我有同样的问题.类似的问题可以在这里找到:OSMDroidRoutingp

  8. android – 自动值 – 包裹 – 适配器可以应对另一个自动值类的Typed Set吗?

    我正在调查自动值和它的扩展,即我的Android应用程序中的auto-value-parcel和auto-value-parcel-adapter.我有这些模型类:–和我的类型适配器是我的问题出现的地方我需要传递给readTypedArray的CREATOR在Autovalue_Amoeba中声明.我的错误在哪里?对自动价值包裹的误解?解决方法Autovalue:Parcel扩展无法处理集合,但如果将属性转换为List,则无需自定义适配器即可开箱即用.如果你想把它当成一个集合你就可以做到这一点.请记住,您

  9. android – 保存ArrayList内容的最佳方法是什么?

    我想保存一个ArrayList,以便它是持久的.内容可以改变.在android中接近这个的最佳方法是什么?.不知道“东西”是什么,我们不能轻易回答这个问题.您的一般选择是使用数据库或持久化到文件.一般来说,sqlite数据库具有优势,因为它使用事务并且通常比仅编写自己的文件更健壮.但是,您的ArrayList可能存储的内容在数据库中可能无法正常工作.当然,您的ArrayList可能存储的内容甚至可能根本不能保留.

  10. android – 在ActivityGroup中暂停和恢复子活动

    我正在尝试创建一个自定义的ActivityGroup.除了组子活动的活动生命周期方法之外,我正在使一切正常工作.当我们的子活动进入/退出焦点时如何调用onResume/onPause方法?我知道tabactivity这样做但我在查看代码时无法找到.提前致谢!

随机推荐

  1. 基于EJB技术的商务预订系统的开发

    用EJB结构开发的应用程序是可伸缩的、事务型的、多用户安全的。总的来说,EJB是一个组件事务监控的标准服务器端的组件模型。基于EJB技术的系统结构模型EJB结构是一个服务端组件结构,是一个层次性结构,其结构模型如图1所示。图2:商务预订系统的构架EntityBean是为了现实世界的对象建造的模型,这些对象通常是数据库的一些持久记录。

  2. Java利用POI实现导入导出Excel表格

    这篇文章主要为大家详细介绍了Java利用POI实现导入导出Excel表格,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  3. Mybatis分页插件PageHelper手写实现示例

    这篇文章主要为大家介绍了Mybatis分页插件PageHelper手写实现示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

  4. (jsp/html)网页上嵌入播放器(常用播放器代码整理)

    网页上嵌入播放器,只要在HTML上添加以上代码就OK了,下面整理了一些常用的播放器代码,总有一款适合你,感兴趣的朋友可以参考下哈,希望对你有所帮助

  5. Java 阻塞队列BlockingQueue详解

    本文详细介绍了BlockingQueue家庭中的所有成员,包括他们各自的功能以及常见使用场景,通过实例代码介绍了Java 阻塞队列BlockingQueue的相关知识,需要的朋友可以参考下

  6. Java异常Exception详细讲解

    异常就是不正常,比如当我们身体出现了异常我们会根据身体情况选择喝开水、吃药、看病、等 异常处理方法。 java异常处理机制是我们java语言使用异常处理机制为程序提供了错误处理的能力,程序出现的错误,程序可以安全的退出,以保证程序正常的运行等

  7. Java Bean 作用域及它的几种类型介绍

    这篇文章主要介绍了Java Bean作用域及它的几种类型介绍,Spring框架作为一个管理Bean的IoC容器,那么Bean自然是Spring中的重要资源了,那Bean的作用域又是什么,接下来我们一起进入文章详细学习吧

  8. 面试突击之跨域问题的解决方案详解

    跨域问题本质是浏览器的一种保护机制,它的初衷是为了保证用户的安全,防止恶意网站窃取数据。那怎么解决这个问题呢?接下来我们一起来看

  9. Mybatis-Plus接口BaseMapper与Services使用详解

    这篇文章主要为大家介绍了Mybatis-Plus接口BaseMapper与Services使用详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

  10. mybatis-plus雪花算法增强idworker的实现

    今天聊聊在mybatis-plus中引入分布式ID生成框架idworker,进一步增强实现生成分布式唯一ID,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

返回
顶部