考研失利,转行Java,小伙伴问我数组应该怎么学

在这里插入图片描述

🚩 数组

❤ java中的数组是什么

java中关于数组的定义是,存放同一数据类型的一个在内存中连续的数据结构,这个同一类型可以是Java中的八个基本类型,也可以是引用类型(其中包括我们自定义的类型,比如Teacher,Student) 数组的下标是从0开始的,换句话说,如果你的数组中存放了n个元素,那数组中最后一个元素的下标就是 n-1.

❤ java中数组声明的语法

通过上面的学习我们已经知道了,数组是存放同一数据类型的在内存中连续的一种数据结构
那么在Java中如何声明一个数组呢? 它的语法如下
数据类型 [] 数组名称
比如,声明一个 int 类型的数组,我们给它起名字为arr,那么我们可以这样来写:

//声明一个int类型的数组arr
int [] arr;
//声明一个String类型的数组str
String [] str;
//声明一个自定义类型的Student数组
Student [] students;

❤ 数组赋值

数组赋值,等号左边是声明,等号右边为赋值,一般用大括号来包裹数组中的元素。
我们来看几个例子:

 //声明一个int类型的数组 arr
 int[] arr = {1, 2, 3, 4, 5};
 //声明一个int 类型的数组 arr1
 int[] arr1 = new int[]{1, 23, 45};
 // 声明一个String 类型的数组
 String[] str = {"abc", "cde", "xyz"};
 // 声明一个自定义Student类型的数组
 Student[] students = {new Student("zhangsan", 13), new Student("lisi", 20)};

❤ 数组中查询数据

语法 数组名[数组下标]
我们知道数组中在内存中是连续的内存单元,那么我们就可以通过数组的索引直接查找对应的元素。比如

// 声明一个有5个元素的int类型数组
int [] arr = {1,2,3,4,5};

好了,我们上面说到,数组的下标从零开始,上面数组一共有五个元素,下标分别为0,1,2,3,4,我们如果想取得数组中第三个元素的话,我们可以这样来写

//取得数组第三个元素
int i = arr[2];

❤ 数组的长度

语法数组名.length
以上面的数组arr为例子,它的长度是5,那么我们就可以通过arr.length来直接取得它的值比如

int [] arr = {1,2,3,4,5};
System.out.println(arr.length) // 5

❤ 数组的局限性

java中的数组在内存中是一段连续的内存单元,它要求在声明或者赋值时显示或隐式指定数组的长度,即大小,并且指定以后,会有如下局限性

  • 数组的长度不能变化,即不能对数组中的元素个数进行增加或者减少

🚩 自己动手封装一个可伸缩的数组

❤ 为什么要自己封装

上面我们提到了java中数组的局限性,我们不能对数组个数进行增加,删除。

❤ 为什么不用ArrayList

假设我们没学过ArrayList,作为初学者,我们只了解简单的数组,循环等知识

❤ 开始写代码

🍼 一些思考

编写自定义可伸缩的数组,我们要注意哪些点呢?

  • 防止数组下标越界
  • 灵活实现增加,删除元素

❤ 基础准备

首先我们要准备一个自定义类 MyArray

package com.nightcat.bean;

import java.util.Arrays;

public class MyArray {
    //封装的数组
    private int[] data;
    //数组中实际有多少元素
    private int size;

    /**
     * 默认的长度是10
     */
    public MyArray() {
        this(10);
    }

    /**
     * 构造函数,传入数组的capacity 构造数组
     *
     * @param capacity 数组容量(数组长度)
     */
    public MyArray(int capacity) {
        data = new int[capacity];
        size = 0;
    }

    /**
     * 获取数组中元素的个数
     *
     * @return
     */
    public int getSize() {
        return size;
    }

    /**
     * 获取数组的容量
     *
     * @return
     */
    public int getCapacity() {
        return data.length;
    }

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

    @Override
    public String toString() {
        return "MyArray{" +
                "data=" + Arrays.toString(data) +
                ", size=" + size +
                '}';
    }
}

我们定义了一个类,它的成员变量有capacitysize,其中capacity表示的是数组的容量,size表示的是数组中第一个没有元素的位置,举例来说,如果数组中有3个元素,那么size就应该指向数组下标为3的位置。(数组下标从零开始)
数组

🍼 增加元素
🚀 插入元素的过程

向我们自定义数组中添加元素的操作,就是挪动元素的一个过程,具体如下

  • 判断数组下标是否越界
  • 将待插入位置(含)后边的所有元素向后移动一个位置
  • 将待插入元素插入指定位置
  • 维护size
    在这里插入图片描述
🚀 代码实现
   /**
     * 向数组头添加元素
     *
     * @param e
     */
    public void addFirst(int e) {
        add(0, e);
    }


    /**
     * 向数组末尾添加元素
     *
     * @param e
     */
    public void addLast(int e) {
        add(size, e);
    }

    /**
     * 在index 处添加元素e
     *
     * @param index
     * @param e
     */
    public void add(int index, int e) {
        if (size == data.length) {
            throw new RuntimeException("数组已经满了");
        }
        if (index < 0 || index > size) {
            throw new RuntimeException("数组下标越界异常");
        }
        for (int i = size; i > index; i--) {
            data[i] = data[i - 1];
        }
        data[index] = e;
        size++;
    }
🍼 删除元素
🚀 删除元素的过程
  • 判断数组下标是否越界
  • 将待删除位置(含)后边的所有元素向前移动一个位置
  • 维护size
    在这里插入图片描述
🚀 代码实现
/**
     * 删除指定位置的元素
     *
     * @param index
     */
    public void del(int index) {
        if (size == 0) {
            throw new RuntimeException("数组里没有元素了");
        }
        if (index < 0 || index > size) {
            throw new RuntimeException("数组下标越界异常");
        }
        for (int i = index; i < size; i++) {
            data[i] = data[i + 1];
        }
        size--;
    }

🚩 两个思考题

🍼 通过泛型改写类?

🍼 java中数组下标为什么从0开始?

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

夜猫nightcat

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值