Loading [MathJax]/jax/input/TeX/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >动态数组

动态数组

作者头像
全栈程序员站长
发布于 2022-09-06 07:02:48
发布于 2022-09-06 07:02:48
97200
代码可运行
举报
运行总次数:0
代码可运行

大家好,又见面了,我是你们的朋友全栈君。

什么是数据结构?

线性表

数组

动态数组设计

项目结构

代码实现

CybArrayList.java

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package com.cyb;

/**
 * 自定义ArrayList数组
 * 
 * @author chenyanbin
 *
 */
public class CybArrayList {
    /**
     * 元素的数量
     */
    private int size;
    /**
     * 所有元素
     */
    private int[] elements;
    private static final int DEFAULT_CAPACITY = 100;
    private static final int ELEMENT_NOT_FOUND = -1;

    public CybArrayList() {
        this(DEFAULT_CAPACITY);
    }

    public CybArrayList(int capacity) {
        capacity = (capacity < DEFAULT_CAPACITY) ? DEFAULT_CAPACITY : capacity;
        elements = new int[capacity];
    }

    /**
     * 元素的个数
     * 
     * @return
     */
    public int size() {
        return size;
    }

    /**
     * 是否为空
     * 
     * @return
     */
    public boolean isEmpty() {
        return size == 0;
    }

    /**
     * 是否包含某个元素
     * 
     * @param element 元素
     * @return
     */
    public boolean contains(int element) {
        return indexOf(element) != ELEMENT_NOT_FOUND;
    }

    /**
     * 添加元素到最后面
     * 
     * @param element
     */
    public void add(int element) {
        add(size, element);
    }

    /**
     * 往index位置添加元素
     * 
     * @param index   索引下标
     * @param element 元素
     */
    public void add(int index, int element) {
        rangeCheckForAdd(index);
        ensureCapacity(size + 1);
        for (int i = size - 1; i >= index; i--) {
            elements[i + 1] = elements[i];
        }
        elements[index] = element;
        size++;
    }

    /**
     * 返回index位置对应的元素
     * 
     * @param index 索引下标
     * @return
     */
    public int get(int index) {
        rangeCheck(index);
        return elements[index];
    }

    /**
     * 设置index位置的元素
     * 
     * @param index   索引下标
     * @param element 元素
     * @return 原来的元素
     */
    public int set(int index, int element) {
        rangeCheck(index);
        int oldElement = elements[index];
        elements[index] = element;
        return oldElement;
    }

    /**
     * 删除index位置对应的元素
     * 
     * @param index 索引下标
     * @return 删除的元素值
     */
    public int remove(int index) {
        rangeCheck(index);
        int result = elements[index];
        for (int i = index + 1; i <= size - 1; i++) {
            elements[i - 1] = elements[i];
        }
        size--;
        return result;
    }

    /**
     * 查看元素的位置
     * 
     * @param element 元素
     * @return
     */
    public int indexOf(int element) {
        for (int i = 0; i < size; i++) {
            if (elements[i] == element)
                return i;
        }
        return ELEMENT_NOT_FOUND;
    }

    /**
     * 清除所有元素
     */
    public void clear() {
        size = 0;
    }

    @Override
    public String toString() {
        StringBuilder stringBuilder = new StringBuilder();
        stringBuilder.append("size=").append(size).append(",[");
        for (int i = 0; i < size; i++) {
            // 方式一(推荐)
            if (i > 0) {
                stringBuilder.append(",");
            }
            stringBuilder.append(elements[i]);
            // 方式二(不推荐)
//            if (i!=size-1) {
//                stringBuilder.append(",");
//            }
        }
        stringBuilder.append("]");
        return stringBuilder.toString();
    }

    private void outOfBounds(int index) {
        throw new IndexOutOfBoundsException("Index:" + index + ",Size:" + size);
    }

    /**
     * 范围检测
     * 
     * @param index 索引下标
     */
    private void rangeCheck(int index) {
        if (index < 0 || index >= size) {
            outOfBounds(index);
        }
    }

    /**
     * 范围检测
     * 
     * @param index 索引下标
     */
    private void rangeCheckForAdd(int index) {
        if (index < 0 || index > size) {
            outOfBounds(index);
        }
    }

    /**
     * 保证要有capacity的容量
     * 
     * @param capacity 容量
     */
    private void ensureCapacity(int capacity) {
        int oldCapacity = elements.length;
        if (oldCapacity >= capacity)
            return;
        // 新容量为旧容量的1.5倍
        int newCapacity = oldCapacity + (oldCapacity >> 1);
        int[] newElements = new int[newCapacity];
        for (int i = 0; i < size; i++) {
            newElements[i] = elements[i];
        }
        elements = newElements;
        System.out.print("容量从"+oldCapacity+"扩展为"+newCapacity+"\n");
    }
}

泛型

  使用泛型技术可以让动态数组更加通用,可以存放任何数据类型

CybArrayList.java(泛型)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package com.cyb;

/**
 * 自定义ArrayList数组
 * 
 * @author chenyanbin
 *
 */
public class CybArrayList<E> {
    /**
     * 元素的数量
     */
    private int size;
    /**
     * 所有元素
     */
    private E[] elements;
    private static final int DEFAULT_CAPACITY = 100;
    private static final int ELEMENT_NOT_FOUND = -1;

    public CybArrayList() {
        this(DEFAULT_CAPACITY);
    }

    @SuppressWarnings("unchecked")
    public CybArrayList(int capacity) {
        capacity = (capacity < DEFAULT_CAPACITY) ? DEFAULT_CAPACITY : capacity;
        elements = (E[]) new Object[capacity];
    }

    /**
     * 元素的个数
     * 
     * @return
     */
    public int size() {
        return size;
    }

    /**
     * 是否为空
     * 
     * @return
     */
    public boolean isEmpty() {
        return size == 0;
    }

    /**
     * 是否包含某个元素
     * 
     * @param element 元素
     * @return
     */
    public boolean contains(E element) {
        return indexOf(element) != ELEMENT_NOT_FOUND;
    }

    /**
     * 添加元素到最后面
     * 
     * @param element
     */
    public void add(E element) {
        add(size, element);
    }

    /**
     * 往index位置添加元素
     * 
     * @param index   索引下标
     * @param element 元素
     */
    public void add(int index, E element) {
        rangeCheckForAdd(index);
        ensureCapacity(size + 1);
        for (int i = size; i > index; i--) {
            elements[i] = elements[i - 1];
        }
        elements[index] = element;
        size++;
    }

    /**
     * 返回index位置对应的元素
     * 
     * @param index 索引下标
     * @return
     */
    public E get(int index) {
        rangeCheck(index);
        return elements[index];
    }

    /**
     * 设置index位置的元素
     * 
     * @param index   索引下标
     * @param element 元素
     * @return 原来的元素
     */
    public E set(int index, E element) {
        rangeCheck(index);
        E oldElement = elements[index];
        elements[index] = element;
        return oldElement;
    }

    /**
     * 删除index位置对应的元素
     * 
     * @param index 索引下标
     * @return 删除的元素值
     */
    public E remove(int index) {
        rangeCheck(index);
        E result = elements[index];
        for (int i = index + 1; i < size; i++) {
            elements[i - 1] = elements[i];
        }
        elements[--size] = null;
        return result;
    }

    /**
     * 删除对象
     * 
     * @param element 对象
     */
    public void remove(E element) {
        remove(indexOf(element));
    }

    /**
     * 查看元素的位置
     * 
     * @param element 元素
     * @return
     */
    @SuppressWarnings("null")
    public int indexOf(E element) {
        if (element == null) {
            for (int i = 0; i < size; i++) {
                if (elements[i] == null)
                    return i;
            }
        } else {
            for (int i = 0; i < size; i++) {
                if (element.equals(elements[i]))
                    return i;
            }
        }

        return ELEMENT_NOT_FOUND;
    }

    /**
     * 清除所有元素
     */
    public void clear() {
        for (int i = 0; i < size; i++) {
            elements[i] = null;
        }
        size = 0;
    }

    @Override
    public String toString() {
        StringBuilder stringBuilder = new StringBuilder();
        stringBuilder.append("size=").append(size).append(",[");
        for (int i = 0; i < size; i++) {
            // 方式一(推荐)
            if (i > 0) {
                stringBuilder.append(",");
            }
            stringBuilder.append(elements[i]);
            // 方式二(不推荐)
//            if (i!=size-1) {
//                stringBuilder.append(",");
//            }
        }
        stringBuilder.append("]");
        return stringBuilder.toString();
    }

    private void outOfBounds(int index) {
        throw new IndexOutOfBoundsException("Index:" + index + ",Size:" + size);
    }

    /**
     * 范围检测
     * 
     * @param index 索引下标
     */
    private void rangeCheck(int index) {
        if (index < 0 || index >= size) {
            outOfBounds(index);
        }
    }

    /**
     * 范围检测
     * 
     * @param index 索引下标
     */
    private void rangeCheckForAdd(int index) {
        if (index < 0 || index > size) {
            outOfBounds(index);
        }
    }

    /**
     * 保证要有capacity的容量
     * 
     * @param capacity 容量
     */
    private void ensureCapacity(int capacity) {
        int oldCapacity = elements.length;
        if (oldCapacity >= capacity)
            return;
        // 新容量为旧容量的1.5倍
        int newCapacity = oldCapacity + (oldCapacity >> 1);
        @SuppressWarnings("unchecked")
        E[] newElements = (E[]) new Object[newCapacity];
        for (int i = 0; i < size; i++) {
            newElements[i] = elements[i];
        }
        elements = newElements;
        System.out.print("容量从" + oldCapacity + "扩展为" + newCapacity + "\n");
    }
}

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/155195.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
数据结构与算法系列2 线性表 使用java实现动态数组+ArrayList源码详解
对数组有不了解的可以先看看我的另一篇文章,那篇文章对数组有很多详细的解析,而本篇文章则着重讲动态数组,另一篇文章链接如下,可点击跳转: 链接:https://blog.csdn.net/pjh88/article/details/107166950
一只胡说八道的猴子
2020/09/27
3540
数据结构与算法系列2 线性表 使用java实现动态数组+ArrayList源码详解
数据结构与算法系列1之数组介绍与动态数组实现
1数组的概念 2数组的定义 2.1动态初始化 2.2静态初始化 3数组中的内存划分 4两个数组指向一个地址 5两个常见问题
一只胡说八道的猴子
2021/02/25
4880
数据结构与算法系列1之数组介绍与动态数组实现
数据结构与算法(一): 动态数组
小码哥数据结构与算法(一): 动态数组 本篇是恋上数据结构与算法(第一季)的学习笔记, 使用JAVA语言 一、数组(Array) 数组是一种顺序存储的线性表,所有元素的内存地址都是连续的 int
JavaEdge
2020/05/27
7500
数据结构与算法(一): 动态数组
Java数据结构和算法(1)--自定义一个数组类和动态数组类
前言 今天就要离校了,大学生涯也走到了尽头。肯定有很多不舍,不舍的是学校的安逸和美丽的女友。同时也对自己的未来充满着信心,希望自己能够强大起来,保护自己想要保护的人。之前一段时间,在掘金上面看到一篇文章,文章提到了一个思想:学会编程,而不是学会Java,文中提到了自定义一个模仿ArrayList的类,要去实现其中的add,get,remove等方法。同时正好我之前也在看《Java数据结构和算法》这本书,文中第二章也详细讲解了数组,所以自己也动手完成了自定义一个数组内和动态数组类,于是乎就有了这篇文章去温故而
用户2032165
2018/06/05
1.1K0
Data Structures (一) - 动态数组ArrayList实现
&emsp;&emsp;Java中的数组是一种顺序存储数据的线性表,元素的内存地址是连续的,且数组的容量是在创建时就已经确定的,且无法修改的。那么如何创建一个动态数组?
RiemannHypothesis
2022/08/19
4390
Data Structures (一) - 动态数组ArrayList实现
精解四大集合框架:List核心知识总结
Java集合框架早也是个老话题了,今天主要是总结一下关于Java中的集合框架List的核心知识点。肯定有人会问,这篇写的是List那接下来就还有三篇?是的,java集合框架一共会有四篇。希望通过这个系列能让你全面的get到Java集合框架的核心知识点。
田维常
2020/09/22
3530
精解四大集合框架:List核心知识总结
ArrayList 源码分析
ArrayList 是一个数组队列,相当于 动态数组。与Java中的数组相比,它的容量能动态增长。
Jacob丶
2020/08/05
4120
Java数据结构-------List
    ArrayList和Vector通过数组实现,几乎使用了相同的算法;区别是ArrayList不是线程安全的,Vector绝大多数方法做了线程同步。
在周末
2019/09/11
3980
ArrayList实现原理分析(Java源码剖析)ArrayList使用的存储的数据结构ArrayList的初始化ArrayList是如何动态增长ArrayList如何实现元素的移除ArrayList
ArrayList是我们经常使用的一个数据结构,我们通常把其用作一个可变长度的动态数组使用,大部分时候,可以替代数组的作用,我们不用事先设定ArrayList的长度,只需要往里不断添加元素即可,ArrayList会动态增加容量。ArrayList是作为List接口的一个实现。 那么ArrayList背后使用的数据结构是什么呢? ArrayList是如何保证动态增加容量,使得能够正确添加元素的呢?
desperate633
2018/08/27
1.6K0
聊聊ArrayList源码(基于JDK1.8)
打个广告,楼主自己造的轮子,感兴趣的请点[github]: https://github.com/haifeiWu/lightconf
haifeiWu
2018/09/11
3560
聊聊ArrayList源码(基于JDK1.8)
Data Structures (四) - 队列Queue实现
队列是一种特殊的线性表,它只允许在队列的头和尾进行操作。在队列的尾部添加元素即入列enQueue;在队列的头部移除元素即出列deQueue,队列的操作遵循先进先出First In First Out。
RiemannHypothesis
2022/08/19
3330
Data Structures (四) - 队列Queue实现
Java集合:ArrayList详解
ArrayList是我们日常中最长用的集合之一,在使用列表时,除非特殊情况,我们一般都会选择使用ArrayList,本文就ArrayList的几个主要方法主要介绍,并结合几个图片来介绍几个重要操作。
Java架构师必看
2021/05/18
5200
Java集合:ArrayList详解
【数据结构】线性表 ( 线性表概念简介 | 顺序存储结构 / 链式存储结构 | 顺序存储结构 - 顺序表 List | 顺序表 ArrayList 源码分析 )
ArrayList 源代码地址 : https://www.androidos.net.cn/android/9.0.0_r8/xref/libcore/ojluni/src/main/java/java/util/ArrayList.java
韩曙亮
2023/10/11
2650
Java集合-ArrayList源码解析-JDK1.8
ArrayList 是一个数组队列,相当于 动态数组。与Java中的数组相比,它的容量能动态增长。它继承于AbstractList,实现了List, RandomAccess, Cloneable, java.io.Serializable这些接口。
Java学习录
2019/04/18
2830
【Java】基础篇-ArrayList
说到面试,高频的当属 Java 的集合类了,这是完全绕不开的一道大坎,而且里面包含了许多的数据结构。而在我们的平常使用中,ArrayList 几乎可以说是随处可见,尤其是对刚入行的朋友们来说,ArrayList 可以说是万金油了,今天我们就来好好的看看它 里面到底有些啥,平常我们的使用又该怎么注意。
haoming1100
2019/05/17
6830
ArrayList的实现原理浅析
查看ArrayList的源码,发现其继承自AbstractList,实现了List,RandomAccess,Cloneable以及Serializable接口,如:
孟君
2020/04/22
4790
jdk源码分析之ArrayList
* The array buffer into which the elements of the ArrayList are stored.
全栈程序员站长
2022/07/15
1590
源码阅读之ArrayList
源码阅读是基于JDK7,本篇主要涉及ArrayList常用方法源码分析。 1.概述 ArrayList是List接口的可调整大小的数组实现,可以包含任何类型的元素,包括null。除了实现List接口中的方法,它还提供了调整元素数组大小的方法。这个类除了非同步的特性,大体上和Vector是相同的。它的size、isEmpty、get、set方法运行时间为常数,而add方法运行开销为分摊的常数,添加n个元素的时间复杂度是O(n)。每个ArrayList的实例都有自己的容量,这个容量即用于存储List元素的数组大
JavaQ
2018/04/04
6740
源码阅读之ArrayList
Java源码阅读之ArrayList - JDK1.8
当你对某件事情很感兴趣的时候,时间的流逝在感知中都模糊了(是不是很文艺,绕口得都快听不懂了),通俗来说,就是时间过得很快。
格子Lin
2018/09/30
4920
Java源码阅读之ArrayList - JDK1.8
ArrayList源码研究
背景:实习加工作也有近半年时间了,每天增删改查重复的枯燥无味,于是乎,最近开始了源码的研究,首先便是我们最常用的List接口中的ArrayList
向着百万年薪努力的小赵
2022/12/02
2460
ArrayList源码研究
推荐阅读
相关推荐
数据结构与算法系列2 线性表 使用java实现动态数组+ArrayList源码详解
更多 >
领券
社区富文本编辑器全新改版!诚邀体验~
全新交互,全新视觉,新增快捷键、悬浮工具栏、高亮块等功能并同时优化现有功能,全面提升创作效率和体验
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文