本文主要是记录学习《Java 核心技术》一书中数组的一些知识点和实践过程。有数组的定义方式、初始化方式、命令行参数、常用的API等内容,以代码片段展示为主。
一、代码实践
public class ArrayTest {
public static void main(String[] args) {
// 定义数组
int[] i = new int[6];
boolean d[] = new boolean[10];
char c[] = {'a','b','c','d'};
// 打印
String r1 = "数组i:[";
for (int j = 0; j < Array.getLength(i); j++) {
if (j > 0) {
r1 += ", ";
}
r1 += j;
}
r1 += "]";
System.out.println(r1);
// Arrays.toString()方法打印
String r2 = "数组d:" + Arrays.toString(d);
System.out.println(r2);
// toString()方法打印
String r3 = "数组c:" + c.toString();
System.out.println(r3);
// 匿名数组(无法正常定义)
// new int[] {1,2,3,4,5,6,7};
// 重新初始化数组i
i = new int[] {8,9,4,6,5,1,7,10};
Arrays.sort(i);
String r4 = "重新初始化数据i:" + Arrays.toString(i);
System.out.println(r4);
// 数组copy
int[] k = i;
String r5 = "copy1-k:" + Arrays.toString(k);
System.out.println(r5);
System.out.println("i引用:" + i.toString());
System.out.println("k引用:" + k.toString());
int[] m = Arrays.copyOf(i, 10);
String r6 = "copy2-m:" + Arrays.toString(m);
System.out.println(r6);
System.out.println("m引用:" + m.toString());
int[] n = Arrays.copyOfRange(m, 3, 7);
String r7 = "copy3-n:" + Arrays.toString(n);
System.out.println(r7);
System.out.println("n引用:" + n.toString());
// 命令行参数(使用时需要注意包名问题)
if (args.length == 0 || args[0].equals("-h")) {
System.out.print("Oh no");
} else if (args[0].equals("-f")) {
System.out.println("feiyst, ");
}
for (int j = 1; j < Array.getLength(args); j++) {
System.out.print(args[j]);
}
// 其它API(binarySearch、fill)
int[] array = new int[10];
for (int j = 0; j < Array.getLength(array); j++) {
array[j] = (int) (Math.random() * 20);
}
Arrays.sort(array);
System.out.println("原始值:" + Arrays.toString(array));
// 必须先进行排序
int index = Arrays.binarySearch(array, 8);
System.out.println("二分查找:" + index);
Arrays.fill(array,6);
System.out.println("固定值覆盖:" + Arrays.toString(array));
}
}
二、抽奖程序
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
System.out.println("输入数组长度:n = ");
int n = Integer.parseInt(in.next());
System.out.println("输入获奖数量:k = ");
int k = Integer.parseInt(in.next());
// 初始化基数组
int[] array = new int[n];
for (int i = 0; i < array.length; i++) {
array[i] = i;
}
System.out.println("array: " + Arrays.toString(array));
// 抽取结果
int[] result = new int[k];
int index;
for (int i = 0; i < result.length; i++) {
index = (int) (Math.random() * n);
result[i] = array[index];
array[index] = array[n-1];
n--;
}
// 输出结果
Arrays.sort(result);
System.out.println("result: " + Arrays.toString(result));
}
三、常用API及说明(代码末尾数字表示JDK版本号,type表示基本数据类型)
1.static String toString(type[] a) 5.0
说明:返回包含a中数据元素的字符串,这些元素被放在括号内,并用逗号分隔。
2.static type copyOf(type[] a, int length) 6
static type copyOfRange(type[] a, int start, int end) 6
说明:返回与a类型相同的一个数组,其长度为length或者end-start,数组元素为a的值(start-end取值为半开半闭区间)。
3.static void sort(type[] a)
说明:采用优化的快速排序算法对数组进行排序。
4.static int binarySearch(type[] a, type v)
static int binarySearch(type[] a, int start, int end, type v) 6
说明:采用二分法搜索算法查找v。如果查找成功,则返回相应的下标值;否则,返回一个负数值r。-r-1是为保存a有序v应插入的位置。
5.static void fill(type[] a, type v)
说明:将数组的所有数据元素值设置为v。
6.static boolean equals(type[] a, type[] b)
说明:如果两个数组大小相同,并且下标相同的元素都对应相等,返回true。