Java数组
数组:在连续内存上分布的相同类型数据的集合
1.数组的创建:
//动态初始化
数据类型[] 数组名称 = new 数据类型 [长度] { 初始化数据 };
int[] arr = new int[3]{1, 2, 3};
// 静态初始化
数据类型[] 数组名称 = { 初始化数据 };
int[] arr = {1, 2, 3};
//静态初始化的时候, 数组元素个数和初始化数据的格式是一致的
2.数组的使用
2.1数组长度:用数组名.length获取
int[] arr = {1, 2, 3};
// 获取数组长度
System.out.println("length: " + arr.length);
2.2访问数组元素
int[] arr = {1, 2, 3};
// 获取数组长度
System.out.println(arr[2]);
要注意,访问数组元素时,下标不能超出【数组长度-1】这个值。
数组下标溢出异常:java.lang.ArrayIndexOutOfBoundsException
2.3数组的遍历
fori语句: 通过下标访问每个元素
int[] arr = {1, 2, 3};
for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i]);
}
foreach语句:通过迭代得到每个元素
int[] arr = {1, 2, 3};
for (int x : arr) {
System.out.println(x);
}
3.将数组名作参数
数组名是一种引用
引用相当于一个 “别名”, 也可以理解成一个指针.
创建一个引用只是相当于创建了一个很小的变量, 这个变量保存了一个整数, 这个整数表示内存中的一个地址.
public static void main(String[] args) {
int[] arr = {1, 2, 3};
printArray(arr);
}
public static void printArray(int[] a) {
for (int x : a) {
System.out.println(x);
}
函数参数有两种:
(1)基本类型数据
改变的是形参的值,实参不改变。
(2)引用类型数据
形参的值为实参的地址,操作这个地址,实参的值会改变。
4.对数组的常规操作
4.1数组转字符串
将数组以字符串的形式输出
public static String myToString(int[] arr){
String ret="[";
for (int i = 0; i < arr.length; i++) {
// 借助 String += 进行拼接字符串
ret += arr[i];
// 除了最后一个元素之外, 其他元素后面都要加上 ", "
if (i != arr.length - 1) {
ret += ", ";
}
}
ret += "]";
return ret;
}
4.2.数据的拷贝
int[] arr = {1,2,3,4,5,6};
int[] newArr = Arrays.copyOf(arr, arr.length);
System.out.println("newArr: " + Arrays.toString(newArr));
arr[0] = 10;
System.out.println("arr: " + Arrays.toString(arr));
System.out.println("newArr: " + Arrays.toString(newArr));
copyOf( )函数返回为一个新的数组,将数组进行了 深拷贝, 即又创建了一个数组对象, 拷贝原有数组中的所有元素到新数组中. 因此, 修改原数组, 不会影响到新数组.
深拷贝
新对象地址存的值与旧对象地址存的值相同,但他们是两个存在,因为这两个对象的地址不一样。
浅拷贝
新对象等价于旧对象,因为两个对象的地址一样,一个改变,另一个也改变。
4.2查找数组元素(二分查找)
二分查找的前提是:数组是有序的
二分查找的思路是先取中间位置的元素, 看要找的值比中间元素大还是小. 如果小, 就去左边找; 否则就去右边找.
public static int[] fun6(int [] arr){
int temp;
int left=0;
int right=arr.length-1;
while(left<right){
temp=arr[left];
arr[left]=arr[right];
arr[right]=temp;
right--;
left++;
}
return arr;
}
4.3数组逆置
设定两个下标, 分别指向第一个元素和最后一个元素. 交换两个位置的元素.然后让前一个下标自增, 后一个下标自减, 循环继续可.
public static void reverse(int[] arr) {
int left = 0;
int right = arr.length - 1;
while (left < right) {
int tmp = arr[left];
arr[left] = arr[right];
arr[right] = tmp;
left++;
right--;
}
}
5.二维数组
例如数组arr[3][2]:arr[0]中存放的是数组第一行数据第一个元素所在的地址。
打印二维数组元素:Arrays.deepToString(arr)