当前位置 博文首页 > liuchonghua的博客:Java数组,Arrays工具类

    liuchonghua的博客:Java数组,Arrays工具类

    作者:[db:作者] 时间:2021-07-19 13:31

    数组的基本概念

    ??? 数组是储存多个相同类型的元素,虽然数组中的元素均为基本元素,但是Java中使用了类似对象的处理方式处理数组。在数组的初始化中使用new进行初始化。

    创建一个一维数组

    定义数组的方式为:

    ??? 数组元素类型??? [ ]数组名;如下实例

    int arr1[];		//定义一个int类型的数组
    int []arr2;
    String []arr3;	????????//定义一个String类型的数组
    char []arr4;?? ?????????//定义一个字符类型数组
    boolean []arr5;?? ???  ?//定义一个boolean类型数组
    

    ????数组定义中中括号[ ]可以在数组名的前面或者后面,表达式效果相同,Java中推荐放在数组名前。

    数组定义后还不能对数组进行访问,因为定义中只是声明了数组的类型和数组名,想要真正让数组发挥作用还需要对数组进行初始化,为当前数组分配内存空间。

    数组的初始化

    ????数组的初始化分为静态初始化和动态初始化两种。

    动态初始化

    ?????? 动态初始化中需要给数组指定一个长度,语法格式为:
    //先定义再初始化.
    	int []arr1;			
    	arr1=new int[6];
    //定义和初始化一起执行.
    	int []arr2=new int [5];
    动态初始化中只需给定一个数组长度,系统会默认给当前数组中的元素提供一个默认值。默认值随数组类型给出,比如:
    int []arr1=new int[5];
    System.out.println(arr1[2]);
    	//此时会输出 0
    String []arr2=new String[3];
    System.out.println(arr2[2]);
    	//此时会输出 null
    boolean []arr3=new boolean[4];
    System.out.println(arr3[2]);
    	//此时会输出 false

    静态初始化

    ??? 静态初始化中需要给定数组中的元素的值,由系统计算数组的长度。语法格式为:

    int []arr=new int[]{1,2,3,4,5};
    int []arr2={3,4,5,6};
    静态初始化中可以省略new,两种方式效果一样。需要注意 不可以写成如下形式:
    //int []arr=new int[5]{1,2,3,4,5};
    //这种书写方式是错误的,数组的初始化中静态初始化和动态初始化只能选择一种。

    数组的应用

    ????数组的遍历

    ????????for循环遍历。

    public class TextDemo {
    	public static void main(String[] args) {
    		int[] arr = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
    		out(arr);
    	}
    
    	public static void out(int[] arr) {
    		System.out.print("[");
    		for (int i = 0; i < arr.length; i++) {
    			if (i == arr.length - 1) {
    				System.out.println(arr[i] + "]");
    			} else {
    				System.out.print(arr[i] + ", ");
    			}
    		}
    	}
    }
    //输出结果为[1, 2, 3, 4, 5, 6, 7, 8, 9]
    

    需要注意描述数组的长度时数值从1开始,操作数组中的元素时的脚标从0开始如:

    int [ ]arr=new int[ 3 ];

    arr这个数组中包含了arr[0],arr[1],arr[2]这三个元素。

    arr.length表示当前数组的长度。

    ????????使用Arrays类中的toString方法遍历数组

    此方法可以将数组转化成字符串遍历输出。

    该方法为静态方法使用类名调用。

    import java.util.Arrays;//需要导包
    
    public class arr {
    	public static void main(String[] args) {
    		int arr[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
    		System.out.println(Arrays.toString(arr));
    		int[][] arr2 = { { 1, 2, 3 }, { 4, 5, 6 } };
    		System.out.println(Arrays.toString(arr2[0]));
    		System.out.println(Arrays.toString(arr2[1]));
    	}
    }
    /**输出为:
    [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
    [1, 2, 3]
    [4, 5, 6]
     */

    ??????? 使用String拼接

    public class buffer {
    	public static void main(String[] args) {
    		int arr[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
    		String a = new String();
    		a += "[";
    		for (int i = 0; i < arr.length; i++) {
    			if (i == arr.length - 1) {
    				a += arr[i];
    				a += "]";
    			} else {
    				a += arr[i];
    				a += ", ";
    			}
    		}
    		System.out.println(a);//[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
    	}
    }
    

    ?使用StringBuffer中的append方法

    public class buffer {
    	public static void main(String[] args) {
    		int arr[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
    		StringBuffer a = new StringBuffer("[");
    		for (int i = 0; i < arr.length; i++) {
    			if (i == arr.length - 1) {
    				a.append(arr[i]+"]");
    			} else {
    				a.append(arr[i]+", ");
    			}
    		}
    		System.out.println(a);//[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
    	}
    }

    数组元素的逆序

    public class TextDemo {
    	public static void main(String[] args) {
    		int[] arr = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
    		out(arr);
    		reversed(arr);
    		out(arr);
    	}
    
    	public static void reversed(int[] arr) {
    		//数组逆序排列
    		for(int i=0;i<=arr.length/2;i++) {
    			int temp=arr[i];
    			arr[i]=arr[arr.length-1-i];
    			arr[arr.length-1-i]=temp;
    		}
    		
    	}
     	public static void out(int[] arr) {
    		//打印数组
    		System.out.print("[");
    		for (int i = 0; i < arr.length; i++) {
    			if (i == arr.length - 1) {
    				System.out.println(arr[i] + "]");
    			} else {
    				System.out.print(arr[i] + ", ");
    			}
    		}
    	}
    }
    /**输出为:
    [1, 2, 3, 4, 5, 6, 7, 8, 9]
    [9, 8, 7, 6, 5, 4, 3, 2, 1]
    */
    

    数组中的元素的查找

    ????基本查找法

    import java.util.Scanner;
    public class TextDemo {
    	public static void main(String[] args) {
    		int[] arr = { 1, 2, 3, 4, 5, 4, 3, 2, 1 };
    		find(arr);
    	}
    	public static void find(int[] arr) {
    		Scanner sc = new Scanner(System.in);
    		System.out.println("请输入要查询的数:");
    		int a = sc.nextInt();
    		int j = 0;
    		for (int i = 0; i < arr.length; i++) {
    			if (arr[i] == a) {
    				System.out.println("该元素在当前数组的第" + (i+1) + "位。");
    				j++;
    			}
    		}
    		if (j == 0) {
    			System.out.println("该元素不在当前数组中。");
    		}
    	}
    }
    /**输入为3时的输出:
    ?请输入要查询的数:
    3
    该元素在当前数组的第3位。
    该元素在当前数组的第7位。
    ?*/
    
    /**输入为7时的输出:
    请输入要查询的数:
    7
    该元素不在当前数组中。
    */
    
    

    折半查找法

    折半查找是每次去出需要查找的中间值,然后和需要查找的数进行比较,大的话就从左边的再进行折半查找,小的话就从右边开始折半查找,最终找到相等的值时返回此时的下标。

    折半查找法需要数组是按从小到大排列的,如果数组不是有序的还是使用基本查找法。

    import java.util.Scanner;
    
    public class ArrayDemo3 {
    
    	public static void main(String[] args) {
    
    		int[] arr = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
    		System.out.println("请输入要查询的元素");
    		Scanner sc = new Scanner(System.in);
    		int index = search(arr, sc.nextInt());
    		if (index == -1) {
    			System.out.println("查找元素不在数组中");
    		} else {
    			System.out.println("查找元素下标为:" + index);
    		}
    
    	}
    
    	public static int search(int[] arr, int value) {
    		// 1定义数组中的最小索引和最大索引
    		int min = 0;
    		int max = arr.length - 1;
    		// 2 计算出中间索引
    		int mid = (max + min) / 2;
    		// 3)拿中间索引对应的元素和需要查找的元素进行比较
    		// 如果相等,返回
    		while (arr[mid] != value) {
    			// 不相等
    			if (arr[mid] > value) {
    				max = mid - 1;
    			} else {
    				min = mid + 1;
    			}
    			// 如果这value在数组中找不到,找不到返回-1
    			if (min > max) {
    				return -1;
    			}
    			// 重新计算出中间索引
    			mid = (max + min) / 2;
    		}
    		return mid;
    	}
    }
    /**
    请输入要查询的元素
    10
    查找元素下标为:9
    
     请输入要查询的元素
    55
    查找元素不在数组中
     * */

    ??? 数组的排序

    将一个数字数组按从小到大顺序排列

    ????????冒泡排序法

    此方法是依次比较数组中前后两个数的大小,前一个比后一个大则交换,每次循环后会将最大的数换到最后。

    import java.util.Arrays;
    
    public class Arr {
    	public static void main(String[] args) {
    		int[] arr = { 2, 5, 6, 9, 1, 3, 8, 4, 10, 7 };
    		System.out.println(Arrays.toString(arr)); // Arrays.toString方法遍历数组
    		for (int i = 0; i < arr.length; i++) { // 控制循环排序次数,一共进行数组长度-1次
    			for (int j = 0; j < arr.length - 1 - i; j++) { // 依次对比将大的交换到最后,每遍历过一次后比较的次数-1
    				//注意因为有arr[j + 1],所以j的取值只能取到数组长度-1次,不然会超出范围
    				if (arr[j] > arr[j + 1]) {
    					int temp = arr[j + 1];
    					arr[j + 1] = arr[j];
    					arr[j] = temp;
    				}
    			}
    		}
    		System.out.println(Arrays.toString(arr));
    	}
    }
    // [2, 5, 6, 9, 1, 3, 8, 4, 10, 7]
    // [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

    ????????比较排序法

    抽取第一个元素然后和之后所有元素比较,谁比他小就交换,最终会将最小的排在第一个,然后再抽取下一位。

    import java.util.Arrays;
    
    public class Arr {
    	public static void main(String[] args) {
    		int[] arr = { 2, 5, 6, 9, 1, 3, 8, 4, 10, 7 };
    		System.out.println(Arrays.toString(arr));
    		for (int i = 0; i < arr.length - 1; i++) {// 控制循环进行的次数
    			for (int j = i + 1; j < arr.length; j++) { // 从抽取的数的下一位开始依次比较
    				if (arr[i] > arr[j]) {
    					int temp = arr[j];
    					arr[j] = arr[i];
    					arr[i] = temp;
    				}
    
    			}
    		}
    		System.out.println(Arrays.toString(arr));
    	}
    }
    // [2, 5, 6, 9, 1, 3, 8, 4, 10, 7]
    // [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

    对象数组

    用来存储对象的数组

    class Student {
    	// 创建一个学生类
    	String name;
    	int age;
    
    	public Student(String name, int age) {
    		super();
    		this.name = name;
    		this.age = age;
    	}
    
    	public Student() {
    		super();
    	}
    
    	@Override
    	public String toString() {
    		return "Student [姓名=" + name + ", 年龄=" + age + "]";
    	}
    
    }
    
    public class Arr {
    	public static void main(String[] args) {
    		// 创建对象数组
    		Student[] stuarr = new Student[4];
    		// 创建4个学生对象
    		Student s1 = new Student("张三", 23);
    		Student s2 = new Student("李四", 24);
    		Student s3 = new Student("王五", 21);
    		Student s4 = new Student("赵六", 20);
    		// 赋值
    		stuarr[0] = s1;
    		stuarr[1] = s2;
    		stuarr[2] = s3;
    		stuarr[3] = s4;
    		// 遍历
    		for (int i = 0; i < stuarr.length; i++) {
    			System.out.println(stuarr[i].toString());
    		}
    	}
    }
    /**
    Student [姓名=张三, 年龄=23]
    Student [姓名=李四, 年龄=24]
    Student [姓名=王五, 年龄=21]
    Student [姓名=赵六, 年龄=20]
     */

    二维数组

    二维数组的定义:

    //动态初始化;
    int [][]arr=new int[3][2];
    int []arr2[]=new int[3][2];
    int arr3[][]=new int[3][2];
    //静态初始化
    int [][]arr4=new int[][]{{3,5,8,9},{1,2,3,5}};
    int [][]arr5= {{1,4,5,8,9},{1,1,2,5,5}};
    

    二维数组中第一个元素相当于定位到第几个一维数组,也就是说一维数组是一些类型相同的元素的集合,二维数组是一些元素相同的一维数组的集合.

    动态初始化还可以动态定义每一个一维数组的长度:

    //通过动态给定每个一维数组的长度
    arr[0]=new int[2];
    arr[1]=new int[1];
    arr[2]=new int[4];
    arr[2][3]= 5;????????//该元素是arr[2][]的最后一个元素,而不是arr[2][4].
    System.out.println(arr[2][3]);

    需要注意此时定义的是长度,也就是说

    arr[2]=new int[4];

    此时定义的是第三个一维数组的长度为4,则这个数组的最后一个元素为arr[2][3].

    如果在调用中写成arr[2][4]则会发生异常ArrayIndexOutOfBoundsException

    二维数组的遍历:

    public class ARRTEXT {
    	public static void main(String[] args) {
    		int[][] arr = { { 1, 2, 3, 4, 5 }, { 6, 7, 8, 9 }, { 10, 11 } };//静态初始化二维数组
    		printArray(arr);
    
    	}
    
    	public static void printArray(int[][] arr) {
    		for (int x = 0; x < arr.length; x++) {
    			for (int y = 0; y < arr[x].length; y++) {
    				System.out.print(("["+arr[x][y] + "] "));
    			}
    			System.out.println();
    		}
    
    	}
    }
    //输出结果为:
    /*
    [1] [2] [3] [4] [5] 
    [6] [7] [8] [9] 
    [10] [11] 
    
     */

    Arrays工具类

    Java中为我们提供了数组相关的一个工具类,使用该工具类可以方便的输出编辑数组。

    工具类只有静态方法。

    ????toString()

    将数组转化为字符串,有多个重载方法,可以支持boolean、float、int、long、short对象数组。

    ????sort()

    将数组升序排列,是一个改进的快速排序,比起传统的冒泡,选择排序速度更快

    ????binarySearch(int[] a,int key)

    二分法查找数组,返回值为int型

    import java.util.Arrays;
    //使用Arrays工具类需要导包。
    public class test {
    	public static void main(String[] args) {
    
    		int arr[] = { 5, 4, 8, 9, 6, 7, 1, 2, 3 };
    		// 遍历数组
    		System.out.println(Arrays.toString(arr));// [5, 4, 8, 9, 6, 7, 1, 2, 3]
    		// 数组升序排列
    		Arrays.sort(arr);
    		System.out.println(Arrays.toString(arr));
    		// 查找4在当前数组中的位置,使用二分法查找
    		System.out.println(Arrays.binarySearch(arr, 4));
    
    	}
    
    }

    ????asList(T... a)

    public static <T> List<T> asList(T... a)

    将数组转化成固定大小的集合,该集合的长度不可变,添加删除等相关功能都会报错。

    import java.util.Arrays;
    import java.util.List;
    
    public class test {
    
    	public static void main(String[] args) {
    		String[] s = { "java", "word", "hello", "google" };
    		// 转换成固定长度的集合
    		List<String> list = Arrays.asList(s);
    		// list.add("android"); UnsupportedOperationException不支持该操作
    		// 可以使用替换
    		list.set(2, "android");
    		for (String st : list) {
    			System.out.print(st + " ");// java word android google
    		}
    
    	}
    }

    异常

    ????数组中常见的异常:

    ????????ArrayIndexOutOfBoundsException:数组角标越界异常

    访问了定义中不存在的数组角标,属于运行中异常,编译的时候可以通过。

    解决办法可以在代码中加入非空判断,当数组不为空的时候才可以输出。




    cs
    下一篇:没有了