- 数组
- ❤ java中的数组是什么
- ❤ java中数组声明的语法
- ❤ 数组赋值
- ❤ 数组中查询数据
- ❤ 数组的长度
- ❤ 数组的局限性
- 自己动手封装一个可伸缩的数组
- ❤ 为什么要自己封装
- ❤ 为什么不用ArrayList
- ❤ 开始写代码
- 一些思考
- ❤ 基础准备
- 增加元素
- 插入元素的过程
- 代码实现
- 删除元素
- 删除元素的过程
- 代码实现
- 两个思考题
- 通过泛型改写类?
- java中数组下标为什么从0开始?
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;
public MyArray() {
this(10);
}
public MyArray(int capacity) {
data = new int[capacity];
size = 0;
}
public int getSize() {
return size;
}
public int getCapacity() {
return data.length;
}
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
public void addFirst(int e) {
add(0, e);
}
public void addLast(int e) {
add(size, 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
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开始?


