学习目标
- [ 1 ] 数组
学习内容:
- 动态数组
- 二维数组
- Arrays类
数组:
数组是一个固定长度的存储相同数据类型的数据结构,数组中的元素被存储在一段连续的内存空间中。
动态初始化: 数据类型 [] 数组名称 = new 数据类型 [长度];
// 动态初始化
int[] arr = new int [10];
静态初始化:在定义数组的同时设置元素的值。
数据类型 [] 数组名称 = {值1,值2,…};
//静态初始化
int[] arr={1,2,3,4,5};
动态数组:
Java中已经提供了可以动态修改的数组ArrayList,但是为了更好地学习数组,所以自己实现一个动态数组。
这里设数组里存放的是int类型数据:
添加元素:
//添加一个元素
public void addLast(int element) {
add(size,element);
}
//在索引位置添加元素
public void add(int index, int element) {
//检查容量
checkCapacity();
if (index >= 0 && index <= size) {
System.arraycopy(array, index, array, index + 1, size - index);
}
array[index] = element;
size++;
}
private void checkCapacity() {
if (size == capacity) {
//扩容至1.5倍
capacity += capacity >> 1;
int[] newArray = new int[capacity];
System.arraycopy(array, 0, newArray, 0, size);
array = newArray;
}
}
查询元素:
public int get(int index){
return array[index];
}
遍历元素:
方法1:fori
public void forEach(){
for (int i = 0; i < size-1; i++) {
System.out.println(array[i]);
}
}
打印功能写死在forEach方法内,不便于修改。
方法2:函数式接口
因为需要遍历得到每一个array[i],同时不需要返回值,所以采用函数式接口Consumer。
public void forEach(Consumer<Integer> consumer){
for (int i = 0; i < size-1; i++) {
consumer.accept(array[i]);
}
}
arr.forEach((element)->{
System.out.println(element);
});
方法3:迭代器和增强for循环
@Override
public Iterator<Integer> iterator() {
return new Iterator<Integer>() {
int i =0;
@Override
public boolean hasNext() { //是否有下一个元素
return i < size;
}
@Override
public Integer next() {
return array[i++];
}
};
}
for (Integer element : arr) {
System.out.println(element);
}
方法4:stream
public IntStream stream(){
return IntStream.of(Arrays.copyOfRange(array,0,size));
}
通过copyOfRange保证输出的是size范围内的有效元素。如果不经过copy,会输出size范围外的无效元素。
arr.stream().forEach((element)->{
System.out.println(element);
});
输出元素:
public int remove(int index) {
int removed = array[index];
if (index < size - 1) {
System.arraycopy(array, index + 1, array, index, size - index - 1);
}
size--;
return removed;
}
二维数组:
数组里的每一个元素都是是一个一维数组的数组被称为二维数组。
//静态初始化
int[][] arr1 = {{1,2,3},{1,2,3,4,5}};
//动态初始化
int arr[][] = new int[2][3];
注:CPU从内存读取数据后会放入高速缓存。缓存最小单位为缓存行,大小一般为64Bytes,每次读取填满一行。
因此读入某个数据时,还会读入其临近数据。这就决定了遍历二维数组时,先遍历每行的一维数组效率更高。
Arrays类:
Arrays类位于 java.util 包中,主要包含了操作数组的各种方法。
常用功能 | 常用方法 |
---|---|
填充数组 | Arrays.fill(); |
数组排序 | Arrays.sort(); |
转字符串 | Arrays.toString(); |
比较元素是否相等 | Arrays.equals(); |
二分查找 | Arrays.binarySearch(); |
截取数组 | Arrays.copeOf() 和Arrays.copeOfRange(); |
以上笔记部分内容来自于 https://www.bilibili.com/video/BV1Lv4y1e7HL