数组(2)
5.命令行参数
在程序运行过程中,可以向应用程序传递一些参数,这些参数称为命名行参数。
命令行参数以字符串的形式传入args数组中。可以一次传递0-多个参数,以空格分割。
如果参数中本身包含空格,需要使用引号引起来。
6.Arrays
jdk中为了便于开发,给开发者提供了Arrays类,其中包含了很多数组的常用操作。例如快速输出、排序、查找等。
1)常用方法
1 import java.util.Arrays; 2 public class Test03{ 3 public static void main(String[]args){ 4 int [] arr={1,5,3,2,4}; 5 //Arrays 常用方法 6 7 8 //【1】数组的字符串型式 Arrays.toString(arr) 9 System.out.println(Arrays.toString(arr)); 10 11 //【2】sort 对数组排序(只能升序) 12 Arrays.sort(arr); 13 System.out.println(Arrays.toString(arr)); 14 15 16 //【3】equals(arr1,arr2) 判断两个数组是否相等 17 //1.长度相等 2.数组对应位置元素相等 18 int [] arr1={1,2,3,4,5}; 19 System.out.println(Arrays.equals(arr,arr1)); 20 21 //【4】fill 填充数组 fill(arr,from,to,值) 22 //0,2指在目标数组从0到2进行填充,包含0,但不包含2,即含头不含尾 23 //值 填充到数组的元素 24 Arrays.fill(arr,0,2,6); 25 System.out.println(Arrays.toString(arr)); 26 27 } 28 }
2)二分法查找元素 (只适用于有序的数组)
1 // 用二分法查找数组的某个元素 只适用于有序的数组 2 // Arrays.binarySearch(arr,t) t为需要找到的元素 3 import java.util.Arrays; 4 public class Test04{ 5 public static void main(String[]args){ 6 int[] arr={1,2,3,5,7,8}; 7 int t=5; 8 int loc=Arrays.binarySearch(arr,t); 9 System.out.println("找到:"+loc); 10 } 11 } 12 /*private static int binarySearch0(long[] a, intfromIndex, inttoIndex, 13 long key) { 14 int low = fromIndex; 15 int high = toIndex - 1; 16 17 while (low <= high) { 18 int mid = (low + high) >>> 1; 19 long midVal = a[mid]; 20 21 if (midVal< key) 22 low = mid + 1; 23 else if (midVal> key) 24 high = mid - 1; 25 else 26 return mid; // key found 27 } 28 return -(low + 1); // key not found. 29 } 30 二分法查找必须是有序的数组,如果找到返回索引; 31 如果没有找到,返回-插入点-1。插入点就是key应该放到数组的位置。 32 */
3)数组的复制
1 // 数组的复制 2 import java.util.Arrays; 3 public class Test01{ 4 public static void main(String[]args){ 5 int[] arr={1,3,5,7,9}; 6 7 // 【1】copyOf(arr,len) 复制指定的数组 8 // len:复制给新数组的长度 9 // 当 len > arr.length,新数组的末尾用0来填充 10 int[] Arr=Arrays.copyOf(arr,6); 11 System.out.println(Arrays.toString(Arr)); 12 13 14 // 【2】copyOfRange(arr,from,to) 复制数组某一范围 15 // 从arr中from(包含)位置开始复制到to(不包含)这个范围的元素到新数组中。含头不含尾。 16 int[] arr1=Arrays.copyOfRange(arr,0,4); 17 System.out.println(Arrays.toString(arr1)); 18 19 //[System中也有复制的方法] 20 // 【3】System.arraycopy (src,srcPos,dest,destPos,length) 21 // src - 源数组。 22 // srcPos - 源数组中的起始位置。 23 // dest - 目标数组。 24 // destPos - 目标数据中的起始位置。 25 // length - 要复制的数组元素的长度。 26 27 int[] arr2=new int[arr.length]; 28 System.arraycopy(arr,1,arr2,1,3); 29 System.out.println(Arrays.toString(arr2)); 30 } 31 }
4)判断两个字符串(String)是否相等
user.equals(_user) 判断user和_user的相等(适用于String)
7. 二维数组
二维数组就是数组的数组,即数组里的元素也是数组
由图得知,二维数组是行列结构
1)声明方式 三种
根据二维数组的定义进行声明
import java.util.Arrays; public class Test06{ public static void main(String[] args){ // 【1】声明 int[][] arr; // 【2】初始化一个能存3个一维数组的二维数组 arr = new int[3][]; // 【3】赋值 int[] arr1 = {1,2,4,6}; int[] arr2 = {3,6,7}; int[] arr3 = {1,4,6,8}; arr[0] = arr1; arr[1] = arr2; arr[2] = arr3; System.out.println(arr); System.out.println(Arrays.toString(arr)); } }
由上知,只给二维数组分配了空间 ,一维数组没有分配空间
一个规则的二维数组进行声明
1 import java.util.Arrays; 2 public class Test07{ 3 public static void main(String[] args){ 4 5 // 声明一个规则的二维数组,3行4列 6 int[][] arr; 7 arr = new int[3][4]; 8 9 arr[0][0] = 10; 10 arr[0][1] = 20; 11 arr[0][2] = 30; 12 arr[0][3] = 40; 13 14 arr[1][0] = 100; 15 arr[1][1] = 200; 16 arr[1][2] = 300; 17 arr[1][3] = 400; 18 19 arr[2][0] = 1000; 20 arr[2][1] = 2000; 21 arr[2][2] = 3000; 22 arr[2][3] = 4000; 23 24 System.out.println(Arrays.toString(arr)); 25 } 26 }
由上知一维和二维都分配了空间
已知二维数组元素 用字面量进行声明
1 public class Test08{ 2 public static void main(String[]args){ 3 //声明字面量二维数组 已知数组的值 4 int[][] arr={ 5 {10,20,30,40}, 6 {100,200,300}, 7 {1000,2000,3000,4000} 8 }; 9 System.out.println(Arrays.toString(arr)); 10 } 11 }
由上知一维和二维都分配了空间
2)二维数组的遍历
1 // 二维数组的遍历 2 3 //二维数组是行列结构,使用双层for循环,外层for用于控制行,内层for用于控制列 4 // 行列结构=>双层for遍历。 5 6 7 import java.util.Arrays; 8 public class Test02{ 9 public static void main(String[]args){ 10 //声明字面量二维数组 已知数组的值 11 int[][] arr={ 12 {10,20,30,40}, 13 {100,200,300}, 14 {1000,2000,3000,4000} 15 }; 16 //遍历一个二维数组 外层循环为行 内层循环为列 17 for(int i=0;i<arr.length;i++){ // 行 18 for(int j=0;j<arr[i].length;j++){ // 列 19 System.out.print(arr[i][j]+"\t"); 20 } 21 System.out.println(); 22 } 23 } 24 }
8.基本数据类型和引用数据类型的区别
import java.util.Arrays; public class Test09{ public static void main(String[] args){ // 基本数据类型的赋值 int a = 10; int b; b = a; // a=10 b=10 b = 20; // a=10 b=20 // 引用数据类型的赋值 int[] arr = {1,3,5}; int[] arr2 = arr; arr2[0] = 100; // arr[0]=100 System.out.println("arr:"+arr); System.out.println("arr2:"+arr2); System.out.println("arr[0]:"+arr[0]); } }
总结:
基本数据类型赋值时,复制的是值
引用数据类型赋值时,复制的是引用。(arr2复制的是arr的地址,所以他们指向的都是0x1100这个数组)
9.去除数组中的重复元素(用三个for循环解决问题)
做法如下
1 // 已知一个数组存在重复元素,请去掉数组中的重复元素。 2 import java.util.Scanner; 3 import java.util.Arrays; 4 public class Test13{ 5 public static void main(String[]args){ 6 int [] arr={1,1,1,2,3,3}; 7 int t=0; 8 int len=arr.length; 9 for(int i=0;i<len;i++){ 10 t=arr[i]; 11 for(int j=i+1;j<len;j++){ 12 if(t==arr[j]){ //比较 相等后删除此元素 13 for(int k=j;k<len-1;k++){ 14 arr[k]=arr[k+1]; // 前移 即删除元素 15 } 16 j--; 17 arr[len-1]=0; // 当 前移后 当前最后一位为0 18 len--; 19 } 20 } 21 } 22 System.out.println(Arrays.toString(arr)); // 去除重复元素后 23 } 24 }
|