• ArrayList顺序表零基础详解(上)


                  hello呀!各位,这里是Sunlightʊə。

    目前大三,主要在学习Java语言。可以一起交流呀!

    相关文章:

    数据结构第一课 —— 时间和空间复杂度

    Java数据结构第三课 —— 泛型(2)

    Java数据结构第二课 —— 泛型(1)

    最新文章:

    新学期,新Java


    目录

    前言:

     一、线性表

    二、顺序表

    1、接口的实现

    三、ArrayList简介


    前言:

    上次我们谈到了数据结构的一大特殊参数化类型——>泛型

    首先,我们要明确,数据结构中有三个重要组成: 逻辑结构、存储结构、数据运算 。

    逻辑结构:指的是数据之间的逻辑关系,从逻辑关系上去描述数据。逻辑结构包括线性结构非线性结构两种。其中包括集合线性结构树形结构图形结构

    逻辑结构是一种“依赖关系”,描述的仅仅是数据元素之间的关系,除了描述数据元素之间的关系外,再也没有其他的含义了

    特别注意:逻辑结构与存储结构无关。

     存储结构:也称为数据的物理结构,是数据元素及其关系在计算机中的存储方式,有:顺序存储链式存储散列存储索引存储

     数据运算:是对数据依某种模式而建立起来的关系进行处理的过程。是指对数据实施的操作,数据运算最终需要在对立的存储结构上用算法实现,所以数据运算分为运算定义和运算实现两个层面。(这里我们暂不深究。

     那么,逻辑结构中的线性表又是什么呐?

     一、线性表

    线性表:指的是N个具有相同特性的数据元素的有限序列。

     线性表在逻辑结构中呈现线性结构,也就是说它是一条连续的直线。

    但是,线性表在物理结构上(也就是说在存储结构上)并不一定是连续的,线性表在物理上存储时,通常会以数组和链式结构的形式进行存储。

     

    二、顺序表

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

     也就是说顺序表的底层其实是一个动态的数组。

    ArrayList底层其实是一个动态的数组,称为顺序表

    1、接口的实现

    1. public class MyArrayList {
    2. public int[] elem;//数组
    3. public int usedSize;//记录有效元素的个数
    4. public static final int DEFAULT_SIZE=10;
    5. public MyArrayList(){
    6. this.elem=new int[DEFAULT_SIZE];
    7. }
    8. // 新增元素,默认在数组最后新增
    9. public void add(int data) {
    10. //考虑越界和扩容
    11. //1.检查当前顺序表是不是满了
    12. if(isFull()){
    13. //2.如果满了就要进行扩容
    14. this.elem=Arrays.copyOf(this.elem,2*this.elem.length);
    15. }
    16. //3.
    17. this.elem[this.usedSize]=data;
    18. //4.
    19. this.usedSize++;
    20. }
    21. public boolean isFull(){
    22. if(size()>=this.elem.length){
    23. return true;
    24. }
    25. return false;
    26. }
    27. // 在 pos 位置新增元素
    28. public void add(int pos, int data) throws PosWrongfulException {
    29. //1.下标为负数
    30. //2.下标超过了数组的长度
    31. //3.满
    32. //4.不能隔着元素放 要存储的位置前面一定是有元素的
    33. if(isFull()){
    34. System.out.println("满了");
    35. this.elem=Arrays.copyOf(this.elem,2*this.elem.length);
    36. }
    37. if(pos<0||pos>this.usedSize){
    38. System.out.println("注意:pos位置不合法!!!");
    39. throw new PosWrongfulException("注意:pos位置不合法!!!");
    40. }
    41. //pos合法
    42. //1.开始挪动数据
    43. for (int i = this.usedSize-1; i >=pos ; i--) {
    44. this.elem[i+1]=this.elem[i];
    45. }
    46. //2.插入数据
    47. this.elem[pos]=data;
    48. //3.usedSize++
    49. this.usedSize++;
    50. }
    51. //判断是否包含某个元素
    52. public boolean contains(int toFind) {
    53. for (int i = 0; i < this.size(); i++) {
    54. if(this.elem[i]==toFind){
    55. return true;
    56. }
    57. }return false;
    58. }
    59. // 查找某个元素对应的位置
    60. public int indexOf(int toFind) {
    61. for (int i = 0; i < this.size(); i++) {
    62. if(this.elem[i]==toFind){
    63. return i;
    64. }
    65. }return -1;
    66. }
    67. // 获取 pos 位置的元素
    68. public int get(int pos) {
    69. if(isEmpty()){
    70. throw new EmptyException("注意:当前顺序表为空!!!");
    71. }
    72. if(pos<0||pos>=this.usedSize){
    73. throw new PosWrongfulException("注意:当前pos位置不合法!!!");
    74. }
    75. return this.elem[pos];
    76. }
    77. public boolean isEmpty(){
    78. return size()==0;
    79. }
    80. // 给 pos 位置的元素更新为value
    81. public void set(int pos, int value) {
    82. //1.pos是否越界
    83. if(isEmpty()){
    84. throw new EmptyException("注意:当前顺序表为空!!!");
    85. }
    86. if(pos<0||pos>=this.usedSize){
    87. throw new PosWrongfulException("注意:当前pos位置不合法!!!");
    88. }
    89. this.elem[pos]=value;
    90. }
    91. // 删除第一次出现的关键字key
    92. public void remove(int key) {
    93. //空的顺序表没有key
    94. if(isEmpty()){
    95. throw new EmptyException("注意:当前顺序表为空!!!");
    96. }
    97. //1.先找到key,知道下标
    98. int num=this.indexOf(key);
    99. if(num==-1){
    100. System.out.println("没有这个数字");
    101. return;
    102. }//2.挪动数据
    103. for (int i = num; i < size()-1; i++) {
    104. this.elem[i]=this.elem[i+1];
    105. }
    106. //3.usedSize--
    107. usedSize--;
    108. }
    109. // 获取顺序表长度
    110. public int size() {
    111. return this.usedSize;
    112. }
    113. // 清空顺序表
    114. public void clear() {
    115. this.usedSize=0;
    116. }
    117. // 打印顺序表
    118. public void display() {
    119. for (int i = 0; i < this.usedSize; i++) {
    120. System.out.printf(this.elem[i]+" ");
    121. }
    122. System.out.println();
    123. }
    124. }

    三、ArrayList简介

     上图说明以下几点:

    1.ArrayList实现了RandomAccess接口,表明ArrayList支持随机访问。(根据下标进行访问)

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

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

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

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

    6.ArrayList 继承了 AbstractList ,并实现了 List 接口。

    其中,ArrayList 类位于 java.util 包中,使用前需要引入它。

    import java.util.Arrays;

    ArrayList是以泛型方式实现的,使用前必须要先进行实例化:

    ArrayList objectName =new ArrayList<>();
    • E:表示泛型数据类型,用于设置 objectName 的数据类型,只能为引用数据类型
    • objectName: 对象名。

  • 相关阅读:
    PHP M题 - 技巧
    华为机试 - 不含101的数
    Java 基础常见知识点&面试题总结(中),2022 最新版!| JavaGuide
    Altium Designer培训 | 2 - 原理图库创建篇
    21. SAP ABAP OData 服务的 $count 操作实现
    区块链:一文了解区块链,在生活中的应用,代码实现,图导,区块链智能合约
    工良出品:包教会,Hadoop、Hive 搭建部署简易教程
    毕业季|遗憾而又幸运的毕业季
    python 正则表达式
    关于#人工智能#的问题:我想知道他下面这种遇到代码会换行并且会有一段我标红的代码是怎么实现的(语言-javascript)
  • 原文地址:https://blog.csdn.net/weixin_53212110/article/details/126999343