【Java 数据结构】顺序表(中)

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

2.5 indexOf 方法

// 查找某个元素对应的位置
public int indexOf(int toFind) {
    //1.遍历数组
    for (int i = 0; i < getSize(); i++) {
        if (this.elem[i] == toFind) {
            return i; //2.找到返回下标
        }
    }
    //3.找不到返回-1
    return -1;
}

这个方法跟上面contains方法大同小异,无需多言!

2.6 get 方法

// 获取 pos 位置的元素
public int get(int pos) {
    //1.判断pos位置是否合法
    if (pos > getSize() || pos < 0) {
        throw new IllegalPosException("获取pos位置不合法");
    }
    //2.返回pos位置值
    return this.elem[pos];
}

这个方法需要注意的点就是判断pos下标位置的合法性,注意这一点就ok了!

2.7 set 方法

// 给 pos 位置的元素设为 value
public void set(int pos, int value) {
    //1.判断pos位置是否合法
    if (pos > getSize() || pos < 0) {
        throw new IllegalPosException("pos位置不合法");
    }
    //2.设置值
    this.elem[pos] = value;
}

好像跟上面的 get 方法没什么区别唉,多简单就不用我多说了吧!

2.8 remove 方法

//删除第一次出现的关键字key
public void remove(int toRemove) {
    //1.获取第一次key出现的位置
    int pos = indexOf(toRemove);
    if (pos == -1) {
        return;
    }
    //2.从pos位置的元素都往前覆盖
    for (int i = pos + 1; i < getSize(); i++) {
        this.elem[i - 1] = this.elem[i];
    }
    //3.有效数据减一(如果是引用类型需要置null)
    this.size--;
}

这个方法我们就可以复用我们之前写的 indexOf 方法了,不用重新写查找逻辑了,接着把后面的元素覆盖掉 pos 下标的元素就可以了!记得别忘记有效数据减一哦!

2.9 getSize 和 clear 方法

// 获取顺序表长度
public int getSize() {
    return this.size;
}
// 清空顺序表
public void clear() {
    this.size = 0;
}

这两个就简单了吧,但是要注意一点,如果你的顺序表放的是引用类型,需要置null,方法已经实现的差不多了,感兴趣的下来结合代码画图写一写吧!

3、ArrayList 的学习

3.1 ArrayList的成员属性

  • ArrayList实现了RandomAccess接口,表明ArrayList支持随机访问
  • ArrayList实现了Cloneable接口,表明ArrayList是可以clone的
  • ArrayList实现了Serializable接口,表明ArrayList是支持序列化的

这就是类定义的前部分,这里还是比较复杂的,会随着我们学习的深入,逐步学习到。

接下来我们来看ArrayList的几个成员变量:

3.2 ArrayList的构造方法

3.2.1 构造方法1

当前是一个带参数的构造方法,很好理解,根据传递的参数开辟大小,如果参数是等于0,就直接把 EMPTY_ELEMENTDATA 共享空数组赋值给存放数据的数组中, 如果是给定一个负数,显然是错误的,也即直接抛出异常!

3.2.2 构造方法2

奇怪,这个无参构造方法居然也是给了一个空数组,也就是没有分配数组内存,那到底是怎么把数据放进去的呢?别急,随着后面的讲解,你会解开这个谜题。

3.2.3 构造方法3

按照集合迭代器返回元素的顺序,构造一个包含指定集合元素的列表,如果是属于同类型,就直接放入到存放数据的数组中,如果不是同类型,则利用 copyOf 拷贝指定的集合,如果指定集合长度为0,则把 EMPTY_ELEMENTDATA 共享空数组赋值给存放数据的数组中。

这个地方如果你不是很理解,没关系,因为现在还没接触迭代器,随着学习的深入就会接触到。

3.3 ArrayList 的 add 方法

别小看这几行代码,跟我们自己模拟实现的还是有区别的,真正有内涵的代码其实在 ensureCapacityInternal 这个方法中,那么现在,我们就一步步去解开他的面纱:

有了上面的图解我们不难看出,真正的扩容是在 add 方法中实现的,所以在实例化 ArrayList 的时候,是不会默认给你开辟空间的。所以 ArrayList 默认容量是在 add 方法调用后,才会分配空间。而且在真正扩容之前会检测是否能扩容成功,防止太大导致扩容失败。

3.4 ArrayList的常用方法

image.png

还有其他方法需要使用的话,就可以去查阅Java的帮助文档,到了数据结构阶段,就要尝试着自己看源码,看文档了,培养自主学习的能力!

相关文章
|
22天前
|
Java
【Java集合类面试二十六】、介绍一下ArrayList的数据结构?
ArrayList是基于可动态扩展的数组实现的,支持快速随机访问,但在插入和删除操作时可能需要数组复制而性能较差。
|
26天前
|
存储 设计模式 算法
JAVA中的常见数据结构
JAVA中的常见数据结构
|
2月前
|
存储 C语言
【数据结构】顺序表
数据结构中的动态顺序表
33 3
【数据结构】顺序表
|
2天前
|
存储 C语言 C++
数据结构基础详解(C语言) 顺序表:顺序表静态分配和动态分配增删改查基本操作的基本介绍及c语言代码实现
本文介绍了顺序表的定义及其在C/C++中的实现方法。顺序表通过连续存储空间实现线性表,使逻辑上相邻的元素在物理位置上也相邻。文章详细描述了静态分配与动态分配两种方式下的顺序表定义、初始化、插入、删除、查找等基本操作,并提供了具体代码示例。静态分配方式下顺序表的长度固定,而动态分配则可根据需求调整大小。此外,还总结了顺序表的优点,如随机访问效率高、存储密度大,以及缺点,如扩展不便和插入删除操作成本高等特点。
|
2天前
|
存储 算法 C语言
C语言手撕数据结构代码_顺序表_静态存储_动态存储
本文介绍了基于静态和动态存储的顺序表操作实现,涵盖创建、删除、插入、合并、求交集与差集、逆置及循环移动等常见操作。通过详细的C语言代码示例,展示了如何高效地处理顺序表数据结构的各种问题。
|
26天前
|
存储 算法
【数据结构与算法】顺序表
【数据结构与算法】顺序表
12 0
【数据结构与算法】顺序表
|
29天前
|
存储 Java
数据结构中的哈希表(java实现)利用哈希表实现学生信息的存储
这篇文章通过Java代码示例展示了如何实现哈希表,包括定义结点类、链表类、数组存储多条链表,并使用简单的散列函数处理冲突,以及如何利用哈希表存储和查询学生信息。
数据结构中的哈希表(java实现)利用哈希表实现学生信息的存储
|
22天前
|
存储 算法 Java
"解锁Java对象数据结构的奥秘:从基础到实战,与热点技术共舞,让你的编程之路更激情四溢!"
【8月更文挑战第21天】Java以对象为核心,它是程序的基本单元与数据处理的基础。对象源自类,拥有属性(字段)和方法。对象在内存中分为对象头(含哈希码、GC信息等)和实例数据区(存储属性值)。例如,`Student`类定义了姓名、年龄等属性及相应的方法。通过`new`关键字实例化对象并调用其方法进行数据操作,是Java编程的关键技能。
26 0
|
24天前
|
存储 算法
【初阶数据结构篇】顺序表和链表算法题
此题可以先找到中间节点,然后把后半部分逆置,最近前后两部分一一比对,如果节点的值全部相同,则即为回文。
|
24天前
|
存储 测试技术
【初阶数据结构篇】顺序表的实现(赋源码)
线性表(linearlist)是n个具有相同特性的数据元素的有限序列。