目录
🚩 数组
❤ 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 +
'}';
}
}
我们定义了一个类,它的成员变量有capacity
和size
,其中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--;
}