1.9 数组
1.9.1 数组定义与初始化
int[] arrr = {1,2,4};
int[] arrr1 = new int[5];//如果没有复值,就会用默认值
int[] arrr2 = new int[] {4,7,8,9};
int[] arr4 = arrr2;
1.9.2 匿名数组
匿名数组是一种特殊的数组创建方式,它允许你在不事先定义数组变量的情况下直接创建并使用数组。也就是说,你可以直接在需要数组的地方创建它,而不用专门声明一个数组变量来存储它。Java 允许数组长度为0。通过匿名数组这种语法可以创建一个长度为0的数组。数组长度为0和null不同。
语法:
new 数据类型[]{元素1, 元素2, ...};
//创建一个长度为0的数组
new elementType[0];
- 作为方法参数传递
public class AnonymousArrayExample {
public static void printArray(int[] array) {
for (int num : array) {
System.out.print(num + " ");
}
System.out.println();
}
public static void main(String[] args) {
// 直接使用匿名数组作为参数传递给printArray方法
printArray(new int[]{1, 2, 3, 4, 5});
}
}
- 初始化其他数组
int[] numbers = new int[]{10, 20, 30, 40, 50};
这里的 new int[]{10, 20, 30, 40, 50} 虽然本质上是匿名数组,但它被赋值给了变量 numbers。一旦赋值给了变量,在后续代码里我们更多是通过变量 numbers 来引用这个数组,而非直接使用这个匿名数组的形式。一般来说,在赋值语句中,等号右边以 new 数据类型[]{元素列表} 这种形式出现且没有预先定义变量名的就是匿名数组。但是,当它被赋值给一个变量后,我们通常就借助该变量来使用这个数组了。
1.9.3 数组拷贝
拷贝分为浅拷贝和深拷贝。
浅拷贝:指向相同。
深拷贝:自己会重新开辟一块空间,把对方的值拷贝一份在自己空间,即只有值相同。
int[] arrr = {1,2,4};
int[] arrr1 = new int[5];//如果没有赋值,就会用默认值
int[] arrr2 = new int[] {4,7,8,9};
//浅拷贝
int[] arr4 = arrr2;
arr4[0] = 1000;//因为指向相同,都指向同一个数组,所以修改0位置的数,打印出来显示两数组里0位置的数都改了
System.out.println(Arrays.toString(arrr2));
System.out.println(Arrays.toString(arr4));
//深拷贝
//手动
int[] arr5 = new int[arrr2.length];
for(int i=0;i<arrr2.length;i++) {
arr5[i] = arrr2[i];
}
arr5[0]=525;//修改arr5[0]的值不会修改arrr2[0]的值,因为是两个不同的空间
System.out.println(Arrays.toString(arrr2));
System.out.println(Arrays.toString(arr5));
//使用Arrays里的方法
//长度随意,多了的就按默认值,少了就只拷最前面的值
int[] arr6 = Arrays.copyOf(arrr2, 10);
arr6[0] = 8989;//修改arr6[0]的值不会修改arrr2[0]的值,因为是两个不同的空间
System.out.println(Arrays.toString(arrr2));
System.out.println(Arrays.toString(arr6));

注:Java无指针运算,不可以通过数组名+1,访问下一个值。
1.9.4 命令行参数

1.9.5 数组排序
使用Arrays类中的sort方法,可以对数值型数组进行排序。默认升序。
package com.qcby.第三章基础;
public class Person {
int age;
int height;
String name;
public Person(int a,int b,String c) {
age = a;
height = b;
name = c;
}
//如不重写toString,打印的就是Object类的toString
//Arrays.toString(arr4)会以数组的形式打印,但是数组里面元素怎么打印,要看该元素的toString方法
@Override
public String toString() {
return "Person [age=" + age + ", height=" + height + ", name=" + name + "]";
}
}
//sort默认升序
int[] arr = {10,1,7,2,4};
Arrays.sort(arr);
System.out.println(Arrays.toString(arr));
//通过多加参数,变降序,一共有两种方法,两种结果都一样
Integer[] arr2 = {10,1,7,2,4};
Arrays.sort(arr2,(a,b)->b-a);
//Arrays.sort(arr2,Collections.reverseOrder());
System.out.println(Arrays.toString(arr2));
//字符按照ASCII码排 sort默认升序
String[] arr3 = {"acc","bac","bbx","acbd","sza"};
Arrays.sort(arr3);
System.out.println(Arrays.toString(arr3));
Person x1 = new Person(20,168,"李华");
Person x2 = new Person(19,185,"赵雨");
Person x3 = new Person(24,178,"周叶");
Person[] arr4 = {x1,x2,x3};
Arrays.sort(arr4,(a,b)->b.height-a.height);//其他属性依次类推,降序
System.out.println(Arrays.toString(arr4));
Arrays.sort(arr4,(a,b)->a.height-b.height);//升序
System.out.println(Arrays.toString(arr4));

一些方法
java.util.Arrays 1.2
tatic String toString(type[] a) 5.0
返回包含a中数据元素的字符串,这些数据元素被放在括号内,并用逗号分隔。参数a的类型为int、long、short、char、byte、boolean、float或double的数组。
static type copy0f(type[] a, int length) 6
static type copyOfRange(type[] a,int start, int end) 6
返回与a类型相同的一个数组,其长度为length或者end-start,数组元素为a的值。
参数:
a 的类型为int、long、short、char、byte、boolean、float或double的数组。
start 为起始下标(包含这个值)。
end 为终止下标(不包含这个值)。这个值可能大于a.length。在这种情况下,结果为0或false。
length 为拷贝的数据元素长度。如果length值大于a.length,结果为 0 或false;否则,数组中只有前面length个数据元素的拷贝值。
static void sort(type[] a)
采用优化的快速排序算法对数组进行排序。
参数:
a 的类型为int、long、short、char、byte、boolean、float 或double的数组。
static int binarySearch(type[] a,type v)
static int binarySearch(type[] a,int start, int end, type v) 6
参数:
a 的类型为int、long、short、char、byte、boolean、float或double的有序数组。
start 为起始下标(包含这个值)。
end 为终止下标(不包含这个值)。
v 为同a的数据元素类型相同的值。
static voidfill(type[] a,type v)
将数组的所有数据元素值设置为v。
参数:
a 为类型为int、long、short、char、byte、boolean、float或double的数组。
v 为与a数据元素类型相同的一个值。
static boolean equals(type[]a,type[] b)
如果两个数组大小相同,并且下标相同的元素都对应相等,返回true。
参数:
a 和 b 类型为int、long、short、char、byte、boolean、float或double的两个数组。
1.9.6 多维数组
int[][] arr= {{1,2},{7,6},{18,9}};
int[][] arr2 = new int[3][2];//3个一维数组,每个一维数组有2个数
int[][][] arr5 = {{{1,89},{1,2}},{{3,4},{5,7}}};
1.9.7 不规则数组
数组的每一行有不同的长度。Java实际上没有多维数组,只有一维数组,多维数组被解释为“数组的数组”。
int[][] arr= {{1,2},{7,4,6},{1,8,9}};
int[][] arr2 = new int[3][2];//3个一维数组,每个一维数组有2个数
arr2[1] = new int[] {4,8,9,10};
String[][] arr3 = {{"aa","bb"},{"cc",new String("dd")},{new String("ee")}};
arr3[0] = new String[] {"xxxx"};
arr3[2][0] = new String("yyyyy");
Person x1 = new Person();
Person x2 = new Person();
Person[][] arr4 = {{x1,x2},{new Person()}};
int[][][] arr5 = {{{1},{1,2}},{{3,4},{5}}};
687

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



