程序员第三步-Java基础知识-数组及Arrays工具类

数组

数组的概述

数组是一个容器,长度在初始化时进行定义,一但定义,长度就不可以改变,数组中存放的都是相同类型的数据。

数组的定义格式

一维数组(以整型数组为例,其余类型可以直接将int替换为你想要的数据类型就可以)
1.int []a;
2.int a[];

数组的初始化

数组初始化概述

Java中的数组必须进行初始化之后才可以使用,所谓初始化就是为定义的数组分配内存空间,并为每个元赋值

数组的初始化方式

一维数组(以整型数组为例,其余类型可以直接将int替换为你想要的数据类型就可以)
1.动态初始化:int []a = new int[n],n表示数组长度,是大于0 的整数
2.静态初始化:int []a = new int[]{1,2,3};
int []a={1,2,3};

数组的内存分配

在这里插入图片描述

数组的使用

数组的元素访问

索引:数组会自动为存储进来的元素进行索引的分配,从0开始,最大的索引为数组的长度减一。
格式:数组名[索引]

import java.util.Scanner;

public class Demo {
    
    public static void main(String[] args) {
    //一维数组的定义
        int []arr = new int[]{1,2};
        int []arr2={5,6};
        //遍历通过索引输出输出数组中的元素
        for (int i = 0; i < arr.length; i++) {
            System.out.printf(arr[i]+" ");
        }
        System.out.println();
        for (int i = 0; i < arr2.length; i++) {
            System.out.printf(arr2[i]+" ");
        }



    }


}
/**
 * 输出结果
 * 1 2
 * 5 6 
 * Process finished with exit code 0
 */

import java.util.Scanner;
//动态为数组进行赋值
public class Demo {
    //break和continue案例
    public static void main(String[] args) {
        //一维数组的定义
        int []arr = new int[5];
        //创建Scanner对象进行输入操作
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入5个数:");
        for (int i = 0; i <arr.length ; i++) {
            arr[i]=sc.nextInt();
        }
        System.out.println("数组中存储的是:");
        for (int i : arr) {
            System.out.printf(i+" ");
        }
    }
}
/**
 * 输出结果
 请输入5个数:
 3 5 2 4 3
 数组中存储的是:
 3 5 2 4 3 
 * Process finished with exit code 0
 */

二维数组

二维数组概述

二维数组可以理解为存储的元素为一维数组的一维数组;

二维数组格式

以int类型为例:
1.int [][]a;
2.int [] a[];
3.int a[][]
后面两种不推荐使用哦!
二维数组的初始化方式:
1.int [][]a = new int [n][m];(动态)
2.int [][]a = new int [][]{{1,2},{2,3},{3,4}};(静态)
3.int [][]a = {{1,2},{2,3},{3,4}};(静态)

二维数组的遍历

import java.util.Scanner;

public class Demo {
    //break和continue案例
    public static void main(String[] args) {

        //二维数组的遍历
        int [][]a = {{1,2,3},{4,5,6}};
        for (int i = 0; i < a.length; i++) {
            for (int j = 0; j < a[i].length; j++) {
                System.out.printf(a[i][j]+" ");
            }
            System.out.println();
        }
    }
}
/**
 1 2 3 
 4 5 6 
 * Process finished with exit code 0
 */


Arrays工具类

Arrays工具类的概述

Arrays类包含用于操作数组的各种方法(如排序和搜索)。

Arrays工具类的常用方法

1.asList


  @Test
    public void Demo1(){
        /*asList(T... a)返回由指定数组支持的固定大小的列表
        * 该方法若参数出入数组,则返回的是一个泛型为一维数组类型的List集合
        * */
        int [][]a = new int[][]{{1,2,3,4},{2,3,4,5}};
        List<int[]> ints = Arrays.asList(a);
        for (int[] anInt : ints) {
            System.out.println(Arrays.toString(anInt));
        }
        //直接传入int,char等类型的常量会返回一个对应类型作为泛型的list
        List<Integer> integers = Arrays.asList(1, 2, 3);
    }
/**
     * [1, 2, 3, 4]
     * [2, 3, 4, 5]
     */

2.binarySearch(二分查找),返回类型为int
binarySearch的重载有很多,挑两个来说

   @Test
    public void Demo2(){
        /*
        binarySearch(byte[] a, byte key)
        第一个参数代表在哪个数组(该数组必须是有序的)中进行查找,第二个参数表示在数组中查找什么值
        使用二进制搜索算法搜索指定值的指定字节数组。
        折半查找,若找到,则返回对应的索引,否则返回一个负数
        */

        byte []b = {4,1,2,3,6};
        Arrays.sort(b);
        System.out.println(Arrays.binarySearch(b,(byte)6));//4
        System.out.println(Arrays.binarySearch(b,(byte)5));//-5,数组中存在比5大的数,将这个第一个大于5得数的坐标变成负数再减一就可以作为返回值
        System.out.println(Arrays.binarySearch(b,(byte)10));//-6,10大于数组中所有元素,所以返回的是数组长度取负数,再减一
    }

  @Test
    public void Demo3(){
        /*
        * binarySearch(byte[] a, int fromIndex, int toIndex, byte key)
        * 使用二进制搜索算法搜索指定值的指定字节数组的范围。
        * 找到就返回对应的索引
        * */

        byte []b = {3,5,28,10,19,26,24,11};//3,5,10,11,19,24,26,28
        Arrays.sort(b);
        System.out.println(Arrays.binarySearch(b,1,5,(byte)10));//2,
        System.out.println(Arrays.binarySearch(b,1,5,(byte)20));//-6
        System.out.println(Arrays.binarySearch(b,1,5,(byte)30));//-6,在给定数组索引范围内,没有这个值,就将右边的索引取反减一
    }

2.copyOf(拷贝),返回类型为数组

  @Test
    public void Demo6(){
        /*copyOf(int[] original, int newLength)
        使用 false (如有必要)复制指定的数组,截断或填充,以使副本具有指定的长度。
        original:原数组,即用于被copy的数组
        newLength:新数组的长度
        将已有数组的元素拷贝到一个新的数组,拷贝的长度自己定义,若超过现有长度,则补位数据类型的默认值
        */
        int []a={2,3,4,5,6,7,8,910};
        int[] ints = Arrays.copyOf(a, 8);
        for (int anInt : ints) {
            System.out.println(anInt);
        }
        System.out.println("a==ints:"+(ints==a));//双等于号是比较地址
        System.out.println("Arrays.equals():"+(Arrays.equals(a,ints)));//这里比较数值

        char []c = {'c','r','f','g','h','j','i'};
        char[] chars = Arrays.copyOf(c, 10);
        for (char aChar : chars) {
            System.out.print(aChar+",");//c,r,f,g,h,j,i, , , ,123
        }
        System.out.println("123");
    }


  @Test
    public void Demo8() {
        /*copyOfRange(int[] original, int from, int to)
        将指定数组的指定范围复制到新数组中。
        original:被拷贝的数组,
        from:拷贝开始的索引
        to:to-1为拷贝的最后一个元素的索引,实际操作是无法拷贝到to的
		*/
        int []a = {1,2,3,4,5,6,7,8,9};
        int[] ints = Arrays.copyOfRange(a, 1, 5);//实际是将1-4索引对应的元素拷贝到新的数组中
        for (int anInt : ints) {
            System.out.println(anInt);
        }
    }

**3deepEquals(Object[] a1, Object[] a2)

 @Test
    public void Demo9() {
       /* deepEquals(Object[] a1, Object[] a2)
        如果两个指定的数组彼此 深度相等 ,则返回 true*/
       String[] s1 = {"123","456","789"};
       String[] s2 = {"123","456","789"};
       String[] s3 = {"123","456"};
        System.out.println(Arrays.deepEquals(s1,s2));
        System.out.println(Arrays.deepEquals(s1,s3));


        String [][]s4={{"123","456","789"},{"123","456","789"},{"123","456","789"}};
        String [][]s6={{"123","456","111"},{"123","456","789"},{"123","456","789"}};
        String [][]s7={{"123","456","111"},{"123","456","789"},{"123","456","789"}};
        String [][]s5 = {{"123","456","789"}};
        System.out.println(Arrays.deepEquals(s4,s5));
        System.out.println(Arrays.deepEquals(s4,s6));//false,并且两个数组中所有对应的元素对都相等,则两个数组引用被认为是相当相等的。

        System.out.println(Arrays.deepEquals(s7,s6));//比较值,多维数组展开后进行比较,有一个不同,则为false
    }

4.deepToString

@Test
    public void Demo11() {
       /* deepToString(Object[] a)
        返回指定数组的“深度内容”的字符串表示形式。*/

        String[] s1 = {"123","456","789"};
        String [][]s5 = {{"123","456","789"},{"123","456","7"}};
        System.out.println(Arrays.toString(s1));//[123, 456, 789]
        System.out.println(Arrays.toString(s5));//[[Ljava.lang.String;@30946e09, [Ljava.lang.String;@5cb0d902]

        //上述运行结果可知,toString可以返回一维数组的字符串表示形式,对于多维的,只是返回第一维展开的地址
        //deepToString可以将多维数组展开
        System.out.println(Arrays.deepToString(s5));//[[123, 456, 789], [123, 456, 7]]

    }

4.fill

 @Test
    public void Demo12() {
        /*
        fill(int[] a, int val)
        将指定的int值分配给指定的int数组的每个元素,原数组中若有值,则进行替换

        fill(int[] a, int fromIndex, int toIndex, int val)
        将指定的int值分配给指定的int数组的指定范围的每个元素。
        */


        int []a = {1,2,3,4,5};
        Arrays.fill(a,8);
        for (int i : a) {
            System.out.print(i+" ");
        }
        System.out.println();
        Arrays.fill(a,0,3,77);//值赋值给索引是0-2的
        for (int i : a) {
            System.out.print(i+" ");
        }
    }

    /**
     * 8 8 8 8 8 
     * 77 77 77 8 8 
     */

5.sort(底层为快排)

/*
sort(int[] a) 
按照数字顺序排列指定的数组。
sort方法可以对各种类型的数据进行排序,只要实现Comparable接口即可进行比较
*/


  @Test
    public void Demo15() {
        int []a = {7,5,6,8,9,2};
        Arrays.sort(a);
        System.out.println("排序后的结果为:");
        for (int i : a) {
            System.out.printf(i+" ");
        }
        /**
         * 排序后的结果为:
         * 2 5 6 7 8 9
         */
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值