声明Java数组时,会在内存中开辟一块连续指定大小的空间,用来存储固定大小的同类型元素java
在java中定义个名为scores,长度为8,类型为int类型的数组以下:git
public static void main(String[] args) {
int[] scores = new int[8];
}
复制代码
为了便于理解,咱们看下它在内存的中的分布示意图:github
图中的一个个小格子是用来存放数组的元素,小格子上方的0-7
数字,是数组中每一个元素的下标(也能够叫索引),若是咱们要查询数组中指定位置的元素,咱们能够经过数组名[索引]
来获取,好比图中的scores[2]
数组
在图中咱们还能够看到,数组的起始下标是从0
开始的(也就是第一个元素),最后一个元素的下标是7
(也就是数组的长度8
减1
)由此类推,数组长度如果n
,那么数组最后一个元素的下标是n-1
(数组的起始下标老是从0
开始的)数据结构
各位不要闲唠叨哈,为了照顾全部人(其实个人心里是很纠结的。。。😆)函数
使用data
属性表示存放数组的元素,测试
使用capacity
属性表示数组的容量(等价于数组的长度),可是真正自定义数组类的时候咱们不须要显示声明,由于隐示等价于(Array.length
)this
使用size
属性表示数组中真正存放元素的个数(注意和capacity
概念的区分)。spa
咱们画出示意图:code
下面咱们来完成初始代码
public class ArrayExample {
/** * 存放数组的元素 */
private int data[];
/** * 数组中元素的个数 */
private int size;
/** * 根据指定capacity容量初始化数组 * * @param capacity 容量 */
public ArrayExample(int capacity) {
data = new int[capacity];
size = 0;
}
/** * 无参构造函数,指定默认数组容量capacity=10 */
public ArrayExample() {
this(10);
}
/** * 获取数组中元素的个数 * * @return */
public int getSize() {
return size;
}
/** * 获取数组容量 * * @return */
public int getCapacity() {
return data.length;
}
}
复制代码
假设如今数组的形态是这样,咱们须要将77
元素插入到索引为1
的位置
思路分析:把当前索引为1
的位置元素以及后面的元素都向后挪一个位置,而后将77
这个元素放到索引为1
的位置(注意:挪位置的时候,咱们应该从最后一个元素100
向后挪一个位置,换句话说从后往前挪),完成以后,维护一下size
的索引,进行size++
操做(size
是始终指向数组中下一个没有元素的位置)
下面咱们基于前面写的代码,来完成数组元素的添加操做
/** * 在index位置插入元素 * * @param index 指定索引 * @param element 插入的元素 */
public void add(int index, int element) {
// 简单的边界判断
if (size == data.length) {
throw new IllegalArgumentException("数组添加失败,数组已满");
}
if (index < 0 || index > size) {
throw new IllegalArgumentException("index索引不合法");
}
// 从最后一个元素一直到size位置的元素,日后挪动一位
for (int i = size - 1; i >= index; i--) {
data[i + 1] = data[i];
}
// 位置赋值
data[index] = element;
// 维护size大小
size++;
}
复制代码
因为方面你们查看,只贴出添加数组元素的代码,本文文末,会贴出完成的代码示例地址
如今若是咱们想把一个元素添加到数组头部的位置或者尾部的位置,咱们能够这么作
/** * 向数组头的位置添加元素 * * @param element 元素 */
public void addFirst(int element) {
add(0, element);
}
/** * 向数组尾的位置添加元素 * * @param element 元素 */
public void addLast(int element) {
add(size, element);
}
复制代码
你们必定要注重代码的复用性哈
/** * 获取index索引位置的元素 * * @param index 索引 * @return */
public int get(int index) {
if (index < 0 || index >= size) {
throw new IllegalArgumentException("获取失败,索引不合法");
}
return data[index];
}
复制代码
/** * 修改index索引位置的元素为element * * @param index 索引 * @param element 元素 */
public void set(int index, int element) {
if (index < 0 || index >= size) {
throw new IllegalArgumentException("获取失败,索引不合法");
}
data[index] = element;
}
复制代码
/** * 查找数组中是否有元素element * * @param element * @return */
public boolean contains(int element) {
return Arrays.stream(data).filter(x -> x == element).findAny().isPresent();
}
复制代码
这里使用了Java8的lambda表达式,不知晓的盆友,能够自行去了解一下
/** * 查找数组中元素element所在的索引,若是不存在元素element,则返回-1 * * @param element * @return */
public int find(int element) {
for (int i = 0; i < data.length; i++) {
if (data[i] == element) {
return i;
}
}
return -1;
}
复制代码
如今咱们要删除索引为1
的元素77
思路分析:咱们知晓了数组的插入思路,那么数组的删除思路,恰好和数组的插入思路相反,若是要删除索引为1
位置的元素77,咱们只须要,从索引2
开始,将索引2
位置的元素向左
移动到索引为1
的位置,也就是将索引2
位置的元素的值赋值给索引为1
位置的元素(等价于data[1]=data[2]
),依次类推,将索引为3
位置的元素,移动到索引为2
位置的元素,一直到最后一个元素,好比图中的元素100
,完成以后,这时候,咱们须要再次维护一下size
的大小,咱们要进行size--
操做
重要
size
既表示数组中元素的大小,又表示始终指向数组中第一个没有元素的位置
代码完成数组的删除操做
/** * 删除索引index位置的元素,并将删除的元素返回 * * @param index * @return */
public int remove(int index) {
// 简单判断数组索引的合法性
if (index < 0 || index >= size) {
throw new IllegalArgumentException("删除数组元素失败,索引不合法");
}
// 存放删除指定索引的位置元素
int result = data[index];
// 从删除指定索引的后一个位置,一直往前挪一位,直到最后一个元素
for (int i = index + 1; i < size; i++) {
data[i - 1] = data[i];
}
// 维护size的位置
size--;
return result;
}
复制代码
完成了数组元素的删除操做,咱们还能够便捷地为数组添加删除数组中第一个元素的方法和删除数组中最后一个元的方法。
删除数组中第一个元素的方法
/** * 删除数组中第一个元素,并将删除的元素进行返回 * * @return */
public int removeFirst() {
return remove(0);
}
复制代码
删除数组中最后一个元素的方法
/** * 删除数组中最后一个元素,并将删除的元素进行返回 * * @return */
public int removeLast() {
return remove(size - 1);
}
复制代码
至此,咱们已经完成了数组的增删改查操做,下面咱们写个测试类,来使用一下咱们本身写的简单版数组
public class ArrayExampleTest {
@Test
public void testAdd() {
// 初始化数组容量大小为5,目前数组中没有任何元素
ArrayExample arrayExample = new ArrayExample(5);
System.out.println(arrayExample);
// 向数组中欧添加第一个元素
arrayExample.addFirst(1);
System.out.println(arrayExample);
// 向数组中添加最后一个元素
arrayExample.addLast(2);
System.out.println(arrayExample);
// 向数组中索引为0的位置添加元素
arrayExample.add(0, 10);
System.out.println(arrayExample);
}
// TODO 其它测试方法,读者能够自行测试
}
复制代码
运行结果
ArrayExample{data=[0, 0, 0, 0, 0], size=0,capacity=5}
ArrayExample{data=[1, 0, 0, 0, 0], size=1,capacity=5}
ArrayExample{data=[1, 2, 0, 0, 0], size=2,capacity=5}
ArrayExample{data=[10, 1, 2, 0, 0], size=3,capacity=5}
复制代码
完整版代码GitHub仓库地址:Java版数据结构-数组 欢迎你们关注和Star
本次咱们完成的是静态数组的实现,每每静态数组不够灵活,后面笔者会在代码仓库中实现动态数组,就不做为一个篇幅来说解了,接下来,笔者还会一一的实现其它常见的数组结构。
持续更新中,欢迎你们关注公众号:小白程序之路(whiteontheroad),第一时间获取最新信息!!!