

-
数组属于引用数据类型的变量;数组的元素既可以是基本数据类型,也可以是引用数据类型(str)
-
创建数组对象会在内存中开辟一整块连续的空间,数组名中引用的是连续空间的首地址(16进制数)。
-
数组长度一旦确定,就不能修改。

一维数组

*二维使用相同
-
一维数组的声明与初始化

但如果先声明再赋值的一维数组,不可使用类型推断!
Wrong!
int[] wrongArr;
wrongArr = {1, 2, 3, 4, 5};
// Wrong, 因为分开写,不能推断出类型!
-
调用数组指定位置的元素:索引,与Python类似(0开始,长度-1结束)
names[0] = "allen" //动态数组赋值,names为Array
-
获取数组的长度,属性 length
Arrayxx.length
-
遍历数组 for loop
-
数组元素的默认初始化值
-
基本数据类型

-
其中Char型,默认值为数字0,不是字符串‘0’ ----》 因为char型对应的是一个数字,如“a” --> 97; 遍历时不显示
-
引用数据类型

-
是空值,不是"null"
-
数组的内存解析

-
方法中的变量:局部变量 存储流程演示
-
没有指针指向的数组,在不确定时间被当做垃圾回收(引用计数算法)
-
代码执行完之后,局部变量从下往上离栈,与此同时指针消失,数组被回收
多维数组(二维数组)
-
一维数组的元素也是一维数组,底层运行机制来看,没有多维数组

-
二维数据声明与初始化


二维数组 arr2 内存示意图; 也可以把第一个[]看成行,第二个[]看成列

-
调用数组指定位置元素,同Python
//如果没有初始化/赋值内数组,调用时会出现异常
String[][] arr3 = new String[3][];
arr3[1][0] //空指针异常,未定义内层元素
//Solution, 先赋值or初始化,再调用
arr3[1] = new String[4];
arr3[1][0] //NULL

-
获取二维数组长度
-
Arry.length ---> return # of rows, 外层长度

-
获取内层数组长度
arry[0].length
-
遍历二维数组
-
两层for loop 内层使用 arry[i].length 作为循环条件
-
二维数组元素的默认初始化值

int[][] arry2 = new int[3][4];
//print arry2 ---> [[I@28a418fc
//2维 int型 @之后是地址,16进制
//print arry2[0] ---> [I@28a418fc
// 1维, int型, @之后是地址
//print arry2[0][1] ---> 0
//float [F ||| String [Ljava.lang.String ||| boolean [Z@xxxxx ||| short [S byte [B long [J
//未定义内层元素
int[][] arry3 = new int[3][];
//输出外层
print(arry3[0]) ----> null *即使不是String类型,也是NULL; 引用类型默认值都为Null,二维数组内部是一维数组,数组是引用类型!!!
//输出内层,报错
print(arry3[0][0]) ---> Null pointer exception

//char型最为特殊
char[][] arry5 = new char[3][4];
print(arry5[0]) ---> 输出4个不显示的0!
print(arry5[0][0]) ---> 输出一个不显示的0!
print(arry5) ---> 输出[[C@地址
二维数组内存解析


赋值问题
-
int[] x, y[]
-
声明之后再赋值
#1)x[0] = y #No x[0] 为int值,不能接收二维数列
#2)x = y #NO 二维不能赋给一维
#3)y[0] = x #Yes 同为一维数列
#4)y[0][0] = x #No 一维数列不能赋值给int型
#5) y = x #No cannot convert from [] to [][]

3)array2 = array1 ----> 把array1 的地址值给了Array2---------->非数组复制
-
数组复制:
int[] array1, array2;
array1 = new int[]{1,2,3,4,5,6};

-
数组反转
-
方法一
-

-
遍历到1/2 长度就可,不然又转回来了
-
引入一个临时变量,存放原 index i位置的值,再把这个值赋给 array.length - 1 - i 位置
-
方法二

-
-
前变量要一直小于后变量
-
-
数组查找
-
线性
-
If String var1.equals(var2), int 类型 ==
-
-
二分法
-
前提:数组必须有序!
-
-

-
-
不需要slice array,使用index来控制查找范围
-
改进:如果array里面的数据缓慢增加,那么可以根据差值法来决定从哪开始找
-
(target_num - head)/ (tail - head) ---> get a proporation, can find the target number faster.
-
-
-
数组排序
-
目的:为了快速查找
-

-
稳定性:如果a series of items, already sorted by sales, item A is at above of item B, then second sorting cateria is price, item A has the same price as B. In this situation, item A still sits above item B-------> ROBUST!
-
排序分类

-
十大内部排序算法

算法

Array 工具类
-
java.util.Arrays: 操作数组的工具类
-
判断两个数组是否相等
-
boolean equals(int[] a, int[] b);
-
e.g. boolean isEqual = Arrays.equals(a1, a2);
-
-
输出数组信息
-
String toString(int[] a);
-
e.g. System.out.println(Arrays.toString(a1));
-
-
将指定的值填充到数组; 用提供的值替换array里面所有数据
-
void fill(int[] a , int val)
-
e.g. Arrays.fill(a1, aNumber);
-
-
对数组进行排序
-
void sort(int[] a)
-
e.g. Arrays.sort(a1);
-
-
对排序后的数组进行二分法检索指定的值
-
int binarySearch(int[] a, int key)
-
e.g. int index = Arrays.binarySearch(a1, aNumber);
-
if 未找到,返回一个负值
-
-
Array 异常


-
arr2[0] --> null; arr2[0][0] ---> 空指针
情况一和二都是在null的情况下使用索引导致的空指针异常!

-
print(arr3[0]) works ------> null
-
But arr3[0].toString() 空指针异常
以上截图出自尚硅谷Java课程,平台 B站
本文详细探讨了Java中的数组,包括其作为引用数据类型的特点、内存分配、初始化、长度固定性以及元素访问。讲解了一维和二维数组的声明、初始化、遍历、默认初始化值,特别是引用数据类型的默认值。此外,还讨论了数组的内存解析,局部变量的作用域,以及数组的回收机制。文章还涵盖了数组的复制、反转、查找和排序,包括线性搜索、二分查找以及使用Arrays工具类的各种操作。最后,提到了多维数组的处理,尤其是对空引用的处理要领。

3230

被折叠的 条评论
为什么被折叠?



