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.常见的数组:字符串,对象数组,哈希表?
<1>数组在内存中连续分配
<2>创建数组时要指明数组的大小
<3>如何访问数组,通过索引,索引从0开始,到数组的长度-1
<4>使用索引
获取指定索引位置的值 arr[index]
修改指定索引位置的值 arr[index] = 值
删除数组中元素(假删除----空间未被删除)
数组的遍历:将数组中的元素一一打印出来
数组最大的优点:快速查询
public MyArray(int capacity) {
// 判断容量
if (capacity < 0) {
this.capacity = 10;
} else {
this.capacity = capacity;
}
this.size = 0;
this.data = (T[]) (new Object[this.capacity]);// 为泛型数组赋值
}
public int getSize() {
return this.size;
}
public int getCapacity() {
return this.capacity;
}
public boolean isEmpty() {
return this.size == 0;
}
public void add(T item) {
// this.size 指向的是待插入元素的位置
addIndex(this.size, item);
}
?
public void addHead(T item) {
addIndex(0, item);
}
public void setValByIndex(int index, T val) {
// 判断索引范围 不符合抛出异常
if (index < 0 || index >= this.size) {
throw new IllegalArgumentException("index is invalid");
}
this.data[index] = val;
}
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;
}
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++;
}
?
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;// 修改指定位置的值
}
public T getValueByIndex(int index) {
// 入参判断--对输入的参数进行判断 ? 参数有误抛异常(index is invlid.)
if (index < 0 || index >= this.capacity) {
throw new IllegalArgumentException("index is invlid.");
}
return this.data[index];// 返回指定索引的值
}
?
public int containsValue(T val) {
// 遍历数组 ? 返回对应索引 使用比较函数 如存在,获取索引,否则返回-1
for (int i = 0; i < this.size; i++) {
if (val.equals(this.data[i])) {
return i;
}
}
return -1;
}
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;// 返回删除的值
}
@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();// 返回字符串
}
// 将一个数组转换成字符串
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
- 向原数组中继续添加一个元素,就会越界(解决办法:扩容)
- 只能处理int类型,如何处理多种类型---(解决方法:使用泛型)
- 删除元素后,空间利用率低(解决方法:减少容量)