一. 命令行参数(了解)
1.在程序运行过程中,可以向应用程序传递一些参数,这些参数称为命名行参数。
列:
1 public class Test01{ 2 public static void main(String[] args){ 3 System.out.println(args.length); 4 5 for(int i= 0;i<args.length;i++){ 6 System.out.println(args[i]); 7 } 8 } 9 }
运行时命令行 输入字符串 abcdjava java123(以空格形式分割),如果参数中本身包含空格,需要使用引号引起来。
D:gameprojectday06>java Te01 abcdjava java123 "jacky chan" 2 abcdjava java123 jacky chan
二. Array
1.jdk中为了便于开发,给开发者提供了Arrays类,其中包含了很多数组的常用操作。例如快速输出、排序、查找等。
①常用的方法:
1 import java.util.Arrays; 2 public class Test02{ 3 public static void main(String[] args){ 4 5 int[] ary = {4,2,3,1}; 6 // 【1】数组的字符串形式 7 String str = Arrays.toString(ary); 8 System.out.println(str); 9 10 // 【2】sort对数组排序(只能升序)-> 内部使用快速排序。 11 Arrays.sort(ary); 12 System.out.println(Arrays.toString(ary)); 13 14 // 【3】fill 填充数组 15 //Arrays.fill(ary,0); 16 //System.out.println(Arrays.toString(ary)); 17 18 // 【4】equals(ary1,ary2) 判断两个数组是否相等。 19 // 数组相等的条件:a.长度相等 b.对应位置元素相等。 20 int[] ary2 = {1,2,3}; 21 System.out.println(Arrays.equals(ary,ary2)); 22 } 23 }
2.二分法查找必须是有序的数组,如果找到返回索引;如果没有找到,返回-插入点-1。插入点就是key应该放到数组的位置。
①二分法高效动图展示:
②二分法查找:
1 private static int binarySearch0(long[] a, int fromIndex, int toIndex, long key) { 2 int low = fromIndex; 3 int high = toIndex - 1; 4 5 while (low <= high) { 6 int mid = (low + high) >>> 1; 7 long midVal = a[mid]; 8 9 if (midVal < key) 10 low = mid + 1; 11 else if (midVal > key) 12 high = mid - 1; 13 else 14 return mid; // key found 15 } 16 return -(low + 1); // key not found. 17 }
三.数组的复制
1.copyOf(arr,len) 把arr复制len个长度的元素并返回新数组。如果len>arr.length,新数组的长度末尾用0填充。
2.copyOfRange(arr,from,to) 从arr中from(包含)位置开始复制到to(不包含)这个范围的元素到新数组中。含头不含尾。
列:
1 import java.util.Arrays; 2 public class Test04{ 3 public static void main(String[] args){ 4 5 int[] ary = {1,3,4,6,8}; 6 7 int[] newAry = Arrays.copyOf(arr,6); 8 System.out.println(Arrays.toString(newAry)); 9 10 // copyOfRange(ary,from,to) 11 int[] newAry2 = Arrays.copyOfRange(ary,1,3); 12 System.out.println(Arrays.toString(newAry2)); 13 } 14 }
3.其中JAVA系统API方法也提供了赋值数组的方法。
arraycopy(srcAry,srcPos,destAry,destPos,len)
srcAry:要复制的源数组
srcPos:从srcAry的srcPos位置开始复制
destAry:复制到的目标数组
destPos:目标数组从destPos开始存放
len:从源数组中复制len个长度
1 import java.util.Arrays; 2 public class Test04{ 3 public static void main(String[] args){ 4 5 int[] ary2 = new int[ary.length]; 6 7 System.arraycopy(ary,1,ary2,0,3); 8 9 System.out.println(Arrays.toString(ary2)); 10 } 11 } 12
四.二维数组
1.二维数组就是数组的数组,数组的元素也是数组。
二维数组表示行列二维结构:
2.二维数组的声明
根据二维数组的定义:
1 import java.util.Arrays; 2 public class Test05{ 3 public static void main(String[] args){ 4 5 // 二维数组 6 //int[] 7 // (int[]) [] 8 9 10 // 【1】声明 11 int[][] ary; 12 // 【2】初始化一个能存3个一维数组的二维数组 13 ary = new int[3][]; 14 15 // 【3】赋值 16 int[] ary1 = {1,3,4,5}; 17 int[] ary2 = {1,3,4}; 18 int[] ary3 = {2,1,6,4}; 19 20 ary[0] = ary1; 21 ary[1] = ary2; 22 ary[2] = ary3; 23 24 System.out.println(ary); 25 System.out.println(Arrays.toString(ary)); 26 } 27 }
此时ary = new int[3][];只分配了二维数组的空间,一维数组没有分配空间。
声明一个规则的二维数组
1 import java.util.Arrays; 2 public class Test06{ 3 public static void main(String[] args){ 4 5 // 声明一个规则的二维数组,3行4列 6 int[][] ary; 7 ary = new int[3][4]; 8 9 ary[0][0] = 10; 10 ary[0][1] = 20; 11 ary[0][2] = 30; 12 ary[0][3] = 40; 13 14 ary[1][0] = 100; 15 ary[1][1] = 200; 16 ary[1][2] = 300; 17 ary[1][3] = 400; 18 19 ary[2][0] = 1000; 20 ary[2][1] = 2000; 21 ary[2][2] = 3000; 22 ary[2][3] = 4000; 23 24 System.out.println(Arrays.toString(ary)); 25 } 26 }
这样二维数组已经分配好空间,同时一维也分配好空间,当已知二维数组的值数,可以考虑字面量声明;
1 import java.util.Arrays; 2 public class Test07{ 3 public static void main(String[] args){ 4 5 // 声明字面量二维数组 6 int[][] ary = { 7 {10,20,30,40}, 8 {100,200,300}, 9 {1000,2000,3000,4000} 10 }; 11 System.out.println(Arrays.toString(ary)); 12 } 13 }
3.二维数组的遍历
1 import java.util.Arrays; 2 public class Test08{ 3 public static void main(String[] args){ 4 5 // 声明字面量二维数组 6 int[][] ary = { 7 {10,20,30,40}, 8 {100,200,300}, 9 {1000,2000,3000,4000} 10 }; 11 // System.out.println(Arrays.toString(ary)); 12 13 /* 14 for(int i=0;i<ary.length;i++){ 15 int[] t = ary[i]; 16 for(int j=0;j<t.length;j++){ 17 System.out.print(t[j]+" "); 18 } 19 System.out.println(); 20 } 21 */ 22 23 24 for(int i=0;i<ary.length;i++){ 25 for(int j=0;j<ary[i].length;j++){ 26 System.out.print(ary[i][j]+" "); 27 } 28 System.out.println(); 29 } 30 } 31 }
总结:
二维数组是行列结构,使用双层for循环,外层for用于控制行,内层for用于控制列
=> 行列结构
=> 双层for遍历
五.基本数据类型和引用数据类型赋值的区别
1 import java.util.Arrays; 2 public class Test09{ 3 public static void main(String[] args){ 4 5 // 基本数据类型的赋值 6 int a = 10; 7 int b; 8 b = a; 9 // a? b? 10 b = 20; 11 // a? b? 12 13 // 引用数据类型的赋值 14 int[] ary = {1,3,5}; 15 int[] ary2 = ary; 16 ary2[0] = 100; 17 18 System.out.println("ary:"+ary); 19 System.out.println("ary2:"+ary2); 20 21 System.out.println("ary[0]:"+ary[0]); 22 23 } 24 }
总结:
基本数据类型赋值时,复制的是值
引用数据类型赋值时,复制的是引用