数据结构---数组

这篇具有很好参考价值的文章主要介绍了数据结构---数组。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、基本概念

1. 存放一组相同数据类型的集合

2.在内存中,分配连续的空间,数组创建时要指定大小

3. 定义    数据类型 [] 数组名

//  1.定义一个数组,里面的元素包含10, 20, 24, 17, 35, 58, 45, 74
int arr[] = {10, 20, 24, 17, 35, 58, 45, 74};

4. 获取数组的长度

int length = arr.length;

5.获取数组中指定位置的元素

int number = arr[1];//  第2个位置的值

6.修改数组中指定位置的元素

arr[2] = 100;//  将第三位的数字改为100

7.数组排序

Arrays.sort(arr);

8.遍历数组

for (int i = 0; i < arr.length; i++) {
    System.out.println(arr[i]);
}

9.索引从0开始,最大为数组长度-1

10.访问数组中元素需要通过索引

11.常见的错误:NULLPointException(空指针异常) ArrayIndexOutofBoundsException(数组索引越界)

System.out.println(arr[length]);//  ArrayIndexOutofBoundsException(数组索引越界)

12.常见的数组:字符串,对象数组,哈希表 

二、Java数组的特点

<1>数组在内存中连续分配

<2>创建数组时要指明数组的大小

<3>如何访问数组,通过索引,索引从0开始,到数组的长度-1

<4>使用索引

  • 获取指定索引位置的值 arr[index]

  • 修改指定索引位置的值 arr[index] = 值

  • 删除数组中元素(假删除----空间未被删除)

  • 数组的遍历:将数组中的元素一一打印出来

数组最大的优点:快速查询文章来源地址https://www.toymoban.com/news/detail-814634.html

三、数组的基本操作 

  1. 构造函数

    public MyArray(int capacity) {
        //  判断容量
        if (capacity < 0) {
            this.capacity = 10;
        } else {
            this.capacity = capacity;
        }
        this.size = 0;
        this.data = (T[]) (new Object[this.capacity]);//  为泛型数组赋值
    }
  2. 获取数组中实际存放元素的个数

    public int getSize() {
        return this.size;
    }
  3. 获取数组的容积 

    public int getCapacity() {
        return this.capacity;
    }
  4. 判断数组是否为空

    public boolean isEmpty() {
        return this.size == 0;
    }
  5. 向数组中添加元素

    public void add(T item) {
        //  this.size  指向的是待插入元素的位置
        addIndex(this.size, item);
    }
    ​
  6. 向数组中添加元素(头部)

    public void addHead(T item) {
        addIndex(0, item);
    }
  7. 根据索引修改值

    public void setValByIndex(int index, T val) {
        //  判断索引范围  不符合抛出异常
        if (index < 0 || index >= this.size) {
            throw new IllegalArgumentException("index is invalid");
        }
        this.data[index] = val;
    }
  8. 扩容resize(自定义扩容函数)

    private void resize(int newCapacity) {
        System.out.println("resize:" + newCapacity);//  打印数组的新容量
        T[] newData = (T[]) (new Object[newCapacity]);//  创建一个新的泛型数组并赋值
        //  将原数组中元素加到新数组
        for (int i = 0; i < this.size; i++) {
        newData[i] = this.data[i];
        }
        //  改变容量与容积
        this.data = Arrays.copyOf(newData, newCapacity);
        this.capacity = newCapacity;
    }
  9. 向数组中在指定位置添加元素

    public void addIndex(int index, T val) {
        //  判断索引范围  不符合抛出异常
        if (index < 0 || index > this.size) {
        throw new IllegalArgumentException("index is invalid");
        }
        //判断数组是否满
        if (this.size == this.capacity) {
        // 扩容   resize  容积扩一倍
        capacity *= 2;
        System.out.println("resize:" + capacity);//  打印数组的新容量
        this.data = Arrays.copyOf(data, capacity * 2);//  使用数组复制函数
        //resize(this.capacity * 2);//  使用自定义函数
        }
        //从index位置开始,元素需要进行后移
        for (int i = this.size - 1; i >= index; i--) {
            this.data[i + 1] = this.data[i];
        }
        //  向指定位置添加元素
        this.data[index] = val;
        //更新this.size
        this.size++;
    }
    ​
  10. 修改指定位置的值

    public void modifyValueByIndex(int index, T value) {
        //  入参判断--对输入的参数进行判断    参数有误抛异常(index is invlid.)
        if (index < 0 || index >= this.capacity) {
            throw new IllegalArgumentException("index is invlid.");
        }
        this.data[index] = value;//  修改指定位置的值
    }
  11. 获取指定索引位置的值

    public T getValueByIndex(int index) {
        //  入参判断--对输入的参数进行判断    参数有误抛异常(index is invlid.)
        if (index < 0 || index >= this.capacity) {
            throw new IllegalArgumentException("index is invlid.");
        }
        return this.data[index];//  返回指定索引的值
    }
    ​
  12. 查询指定的值在数组是否存在

    public int containsValue(T val) { 
        //  遍历数组    返回对应索引  使用比较函数    如存在,获取索引,否则返回-1
        for (int i = 0; i < this.size; i++) {
            if (val.equals(this.data[i])) {
                return i;
            }
        }
        return -1;
    }
  13. 根据索引删除从数组中删除元素

    public T removeByIndex(int index) {
        //  入参判断--对输入的参数进行判断    参数有误抛异常(index is invlid.)
        if (index < 0 || index >= this.size) {
            throw new IllegalArgumentException("index is invlid.");
        }
    ​
        //  删除操作的核心
        /**
         * 1.找到删除的位置
         * 2.删除位置之后的元素要前移   arr[j-1] = arr[j]
         */
        T delValue = this.data[index];//  获取要删除索引的值
        for (int i = index + 1; i < this.size; i++) {
            this.data[i - 1] = this.data[i];
        }
        //  更新数组索引
        this.size--;
        //  判断是否缩容
        if (this.size < this.capacity / 4 && this.capacity / 2 > 0) {
            capacity /= 2;
            this.data = Arrays.copyOf(data, capacity);
            //resize(this.capacity / 2);//  使用自己编写的缩容函数
        }
        return delValue;//  返回删除的值
    }
  14. 重写toString---ctrl+O

    @Override
    public String toString() {
        //  [1,2,3,4,5]
        StringBuilder sb = new StringBuilder("[");
        //  遍历将数据逐个拼接   中间用逗号隔开
        for (int i = 0; i < this.size; i++) {
            sb.append(this.data[i]);
            if (i != this.size - 1) {
                sb.append(",");
            }
        }
        sb.append("]");
        return sb.toString();//  返回字符串
    }
  15. 将一个数组转换为字符串

//  将一个数组转换成字符串
int[] res = {1, 2, 3, 4, 5};
//  方式1
String temp = Arrays.toString(res);
System.out.println(temp);//  [1, 2, 3, 4, 5]
//  方式2
temp = Arrays.stream(res).boxed().map(Objects::toString).collect(Collectors.joining(""));
System.out.printf(temp);//  12345
  1. 向原数组中继续添加一个元素,就会越界(解决办法:扩容)
  2. 只能处理int类型,如何处理多种类型---(解决方法:使用泛型)
  3. 删除元素后,空间利用率低(解决方法:减少容量)

到了这里,关于数据结构---数组的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 数据结构(数组)

        1. 数组定义         数组(Array)是一种线性结构。它用一组连续的内存空间,来存储一组具有相同数据类型的数据。    2. 数组的特点         ①用来存储一组类型相同的数据。         ②在内存中,分配连续的空间,数组创建时需要指定容量。因为数组为了保持

    2024年01月25日
    浏览(30)
  • 数据结构(一)—— 数组

    数组是存放在连续内存空间上的相同类型数据的集合 ,也就是说数组 内存空间的地址 是连续的。 因为数组的在内存空间的地址是连续的,所以我们在删除或者增添元素的时候,就难免要移动其他元素的地址,注意:数组的元素是不能删的,只能覆盖。 1、数组初始化分配内

    2023年04月22日
    浏览(22)
  • 数据结构<1>——树状数组

    前言:树状数组能解决的问题线段树一定可以解决。然后关于线段树的内容会在2中讲解。 树状数组,也叫Fenwick Tree和BIT(Binary Indexed Tree),是一种支持 单点修改 和 区间查询 的,代码量小的数据结构。 那神马是单点修改和区间查询?我们来看一道题。 洛谷P3374(模板): 在本题中

    2024年01月25日
    浏览(50)
  • 基础数据结构:数组介绍

    程序设计 = 数据结构+算法 说到数据结构是什么,我们得先来谈谈什么叫数据。 正所谓\\\"巧妇难为无米之炊’,再强大的计算机,也是要有\\\"米’下锅才可以的,否则就是一堆破铜烂铁 这个\\\"米\\\"就是数据。 数据: 是描述客观事物的符号,是计算机中可以操作的对象,是能被计算

    2024年02月11日
    浏览(37)
  • 数据结构基础-数组

    概述 定义 在计算机科学中,数组是由一组元素(值或变量)组成的数据结构,每个元素有至少一个索引或键来标识 In computer science, an array is a data structure consisting of a collection of elements (values or variables), each identified by at least one array index or key 因为数组内的元素是 连续存储 的,

    2024年02月07日
    浏览(32)
  • 二维数组-数据结构

    二维数组可以定义为数组的数组。二维数组被组织为矩阵,可以表示为行和列的集合。 然而,创建二维数组是为了实现类似于关系数据库的数据结构。它可以轻松地一次保存大量数据,这些数据可以在需要时传递到任意数量的函数。 二维数组可视化在线操作-图码 数据结构可

    2024年01月18日
    浏览(32)
  • 数据结构——数组

    本篇内容参考自Github krahets的hello算法,将其内容进行归纳整理

    2024年02月19日
    浏览(17)
  • 数据结构---数组(java)

    1 、数组基础 1 用来存储一组类型相同的数据 2 在内存中,分配连续的空间,数组创建时要指定容量(大小) 3 数据类型[] 数组名 int[] arr = new int[10] int[] arr2 = {1,2,3,4} 4 索引---访问数组时通过索引进行操作 5 索引从0开始,最大为 arr.length -1 6 常见的错误: NullPointException ArrayI

    2024年01月23日
    浏览(34)
  • 数据结构---数组

    1. 存放一组 相同 数据类型的集合 2.在内存中,分配连续的空间,数组创建时要 指定大小 3. 定义    数据类型 [] 数组名 4. 获取数组的长度 5.获取数组中指定位置的元素 6.修改数组中指定位置的元素 7.数组排序 8.遍历数组 9.索引从 0 开始,最大为 数组长度-1 10.访问数组中元素需

    2024年01月22日
    浏览(31)
  • 【数据结构】--189.轮转数组

    💐 🌸 🌷 🍀 🌹 🌻 🌺 🍁 🍃 🍂 🌿 🍄🍝 🍛 🍤 📃 个人主页 :阿然成长日记 👈点击可跳转 📆 个人专栏: 🔹数据结构与算法🔹C语言进阶 🚩 不能则学,不知则问,耻于问人,决无长进 🍭 🍯 🍎 🍏 🍊 🍋 🍒 🍇 🍉 🍓 🍑 🍈 🍌 🍐 🍍 🌸 hello大家好✨又见

    2024年02月15日
    浏览(23)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包