第五节:数组

5.1数组的概述

5.1.1数组的理解

数组(Array),是多个相同类型数据按一定顺序排列的集合,并使用一个名字命名,并通过编号的方式对这些数据进行统一管理。


5.1.2数组相关的概念

数组名

元素

角标、下标、索引

数组的长度:元素的个数


5.1.3数组的特点

1)数组是有序排列的

2)数组属于引用数据类型的变量。数组的元素,既可以是基本数据类型,也可以是引用数据类型

3)创建数组对象会在内存中开辟一整块连续的空间

4)数组的长度一旦确定,就不能修改。


5.1.4数组的分类

① 按照维数:一维数组、二维数组、。。。

② 按照数组元素的类型:基本数据类型元素的数组、引用数据类型元素的数组


5.2一维数组的使用

①一维数组的声明和初始化

        int[]ids;//声明

        //1.1 静态初始化:数组的初始化和数组元素的赋值操作同时进行

        ids=newint[]{1001,1002,1003,1004};

        //1.2动态初始化:数组的初始化和数组元素的赋值操作分开进行

        String[]names=newString[5];

        //也是正确的写法:

        int[]arr4={1,2,3,4,5};//类型推断

        //总结:数组一旦初始化完成,其长度就确定了。


②如何调用数组的指定位置的元素:通过角标的方式调用

//数组的角标(或索引)从0开始的,到数组的长度-1结束。

    names[0]="王铭";


③如何获取数组的长度。

    //属性:length

    System.out.println(names.length);//5


④ 如何遍历数组

    for(inti=0;i<names.length;i++){

        System.out.println(names[i]);

    }


⑤ 数组元素的默认初始化值

    >数组元素是整型:0

    >数组元素是浮点型:0.0

>数组元素是boolean型:false

  >数组元素是引用数据类型:null


⑥ 数组的内存解析


5.3二维数组的使用

5.3.1理解

对于二维数组的理解,我们可以看成是一维数组array1又作为另一个一维数组array2的元素而存在。其实,从数组底层的运行机制来看,其实没有多维数组。


5.3.2二维数组的使用

①二维数组的声明和初始化

        int[] arr = new int[]{1,2,3};//一维数组

        //静态初始化

        int[][] arr1 = new int[][]{{1,2,3},{4,5},{6,7,8}};

        //动态初始化1

        String[][] arr2 = new String[3][2];

        //动态初始化2

        String[][] arr3 = new String[3][];

        //也是正确的写法:

        int[] arr4[] = new int[][]{{1,2,3},{4,5,9,10},{6,7,8}};

        int[] arr5[] = {{1,2,3},{4,5},{6,7,8}};


②如何调用数组的指定位置的元素

        System.out.println(arr1[0][1]);//2

        System.out.println(arr2[1][1]);//null


③获取数组的长度

        System.out.println(arr4.length);//3

        System.out.println(arr4[0].length);//3

        System.out.println(arr4[1].length);//4


④如何遍历二维数组

        for(int i = 0;i < arr4.length;i++){

            for(int j = 0;j < arr4[i].length;j++){

                System.out.print(arr4[i][j] + "  ");

            }

            System.out.println();

        }


⑤ 数组元素的默认初始化值

针对于初始化方式一:比如:int[][] arr = new int[4][3];

外层元素的初始化值为:地址值

内层元素的初始化值为:与一维数组初始化情况相同


针对于初始化方式二:比如:int[][] arr = new int[4][];

外层元素的初始化值为:null

内层元素的初始化值为:不能调用,否则报错。


⑥ 数组的内存解析



5.4数组中涉及到的常见算法

5.4.1使用二维数组打印一个 10 行杨辉三角

1. 第一行有 1 个元素, 第 n 行有 n 个元素

2. 每一行的第一个元素和最后一个元素都是 1

3. 从第三行开始, 对于非第一个元素和最后一个元素的元素。即:

yanghui[i][j] = yanghui[i-1][j-1] + yanghui[i-1][j];

publicclassYangHuiTest{

    publicstaticvoidmain(String[]args) {

        //1.声明并初始化二维数组

        int[][]yangHui=newint[10][];

        //2.给数组的元素赋值

        for(inti=0;i<yangHui.length;i++){

            yangHui[i]=newint[i+1];

            //2.1 给首末元素赋值

            yangHui[i][0]=yangHui[i][i]=1;

            //2.2 给每行的非首末元素赋值

            //if(i > 1){

            for(intj=1;j<yangHui[i].length-1;j++){

                yangHui[i][j]=yangHui[i-1][j-1]+yangHui[i-1][j];

            }

            //}

        }

        //3.遍历二维数组

        for(inti=0;i<yangHui.length;i++){

            for(intj=0;j<yangHui[i].length;j++){

                System.out.print(yangHui[i][j]+"  ");

            }

            System.out.println();

        }

    }

}


5.4.2求数值型数组中元素的最大值、最小值、平均数、总和等

        int[]arr=newint[10];


        for(inti=0;i<arr.length;i++){

            arr[i]=(int)(Math.random()*(99-10+1)+10);

        }


        //遍历

        for(inti=0;i<arr.length;i++){

            System.out.print(arr[i]+"\t");

        }

        System.out.println();


        //求数组元素的最大值

        intmaxValue=arr[0];

        for(inti=1;i<arr.length;i++){

            if(maxValue<arr[i]){

                maxValue=arr[i];

            }

        }

        System.out.println("最大值为:"+maxValue);


        //求数组元素的最小值

        intminValue=arr[0];

        for(inti=1;i<arr.length;i++){

            if(minValue>arr[i]){

                minValue=arr[i];

            }

        }

        System.out.println("最小值为:"+minValue);

        //求数组元素的总和

        intsum=0;

        for(inti=0;i<arr.length;i++){

            sum+=arr[i];

        }

        System.out.println("总和为:"+sum);

        //求数组元素的平均数

        intavgValue=sum/arr.length;

        System.out.println("平均数为:"+avgValue);

    }


5.4.3数组的复制、反转、查找(线性查找、二分法查找)

        String[]arr=newString[]{"JJ","DD","MM","BB","GG","AA"};

        //数组的复制(区别于数组变量的赋值:arr1 = arr)

        String[]arr1=newString[arr.length];

        for(inti=0;i<arr1.length;i++){

            arr1[i]=arr[i];

        }

        //数组的反转

        for(inti=0;i<arr.length/2;i++){

            Stringtemp=arr[i];

            arr[i]=arr[arr.length-i-1];

            arr[arr.length-i-1]=temp;

        }

        //遍历

        for(inti=0;i<arr.length;i++){

            System.out.print(arr[i]+"\t");

        }

        System.out.println();

        //查找(或搜索)

        //线性查找:

        Stringdest="BB";

        dest="CC";

        booleanisFlag=true;

        for(inti=0;i<arr.length;i++){

            if(dest.equals(arr[i])){

                System.out.println("找到了指定的元素,位置为:"+i);

                isFlag=false;

                break;

            }

        }

        if(isFlag){

            System.out.println("很遗憾,没有找到的啦!");

        }

        //二分法查找:(熟悉)

        //前提:所要查找的数组必须有序。

        int[]arr2=newint[]{-98,-34,2,34,54,66,79,105,210,333};

        intdest1=-34;

        dest1=35;

        inthead=0;//初始的首索引

        intend=arr2.length-1;//初始的末索引

        booleanisFlag1=true;

        while(head<=end){

            intmiddle=(head+end)/2;

            if(dest1==arr2[middle]){

                System.out.println("找到了指定的元素,位置为:"+middle);

                isFlag1=false;

                break;

            }elseif(arr2[middle]>dest1){

                end=middle-1;

            }else{//arr2[middle] < dest1

                head=middle+1;

            }

        }

        if(isFlag1){

            System.out.println("很遗憾,没有找到的啦!");

        }

    }


5.4.4冒泡排序

    publicstaticvoidmain(String[]args) {

        int[]arr=newint[]{43,32,76,-98,0,64,33,-21,32,99};

        //冒泡排序

        for(inti=0;i<arr.length-1;i++){

            for(intj=0;j<arr.length-1-i;j++){

                if(arr[j]>arr[j+1]){

                    inttemp=arr[j];

                    arr[j]=arr[j+1];

                    arr[j+1]=temp;

                }

            }

        }

        for(inti=0;i<arr.length;i++){

            System.out.print(arr[i]+"\t");

        }

    }


5.4.5快速排序

通过一趟排序将待排序记录分割成独立的两部分,其中一部分记录的关键字均比另一部分关键字小,

则分别对这两部分继续进行排序,直到整个序列有序。

  privatestaticvoidswap(int[]data,inti,intj) {

        inttemp=data[i];

        data[i]=data[j];

        data[j]=temp;

    }

    privatestaticvoidsubSort(int[]data,intstart,intend) {

        if(start<end) {

            intbase=data[start];

            intlow=start;

            inthigh=end+1;

            while(true) {

                while(low<end&&data[++low]-base<=0)

                    ;

                while(high>start&&data[--high]-base>=0)

                    ;

                if(low<high) {

                    swap(data,low,high);

                }else{

                    break;

                }

            }

            swap(data,start,high);

            subSort(data,start,high-1);//递归调用

            subSort(data,high+1,end);

        }

    }

    publicstaticvoidquickSort(int[]data){

        subSort(data,0,data.length-1);

    }

    publicstaticvoidmain(String[]args) {

        int[]data={9,-16,30,23,-30,-49,25,21,30};

        System.out.println("排序之前:\n"+java.util.Arrays.toString(data));

        quickSort(data);

        System.out.println("排序之后:\n"+java.util.Arrays.toString(data));

    }


5.4.6Arrays工具类

    publicstaticvoidmain(String[]args) {

        //1.boolean equals(int[] a,int[] b):判断两个数组是否相等。

        int[]arr1=newint[]{1,2,3,4};

        int[]arr2=newint[]{1,3,2,4};

        booleanisEquals=Arrays.equals(arr1,arr2);

        System.out.println(isEquals);


        //2.String toString(int[] a):输出数组信息。

        System.out.println(Arrays.toString(arr1));


        //3.void fill(int[] a,int val):将指定值填充到数组之中。

        Arrays.fill(arr1,10);

        System.out.println(Arrays.toString(arr1));


        //4.void sort(int[] a):对数组进行排序。

        Arrays.sort(arr2);

        System.out.println(Arrays.toString(arr2));


        //5.int binarySearch(int[] a,int key)

        int[]arr3=newint[]{-98,-34,2,34,54,66,79,105,210,333};

        intindex=Arrays.binarySearch(arr3,210);

        if(index>=0){

            System.out.println(index);

        }else{

            System.out.println("未找到");

        }

    }


5.4.7数组中的常见异常

        //1. 数组角标越界的异常:ArrayIndexOutOfBoundsExcetion

        int[]arr=newint[]{1,2,3,4,5};

        System.out.println(arr[-2]);

        //2.2. 空指针异常:NullPointerException

        //情况一:

        int[]arr1=newint[]{1,2,3};

        arr1=null;

        System.out.println(arr1[0]);

        //情况二:

        int[][]arr2=newint[4][];

        System.out.println(arr2[0][0]);

        //情况三:

        String[]arr3=newString[]{"AA","BB","CC"};

        arr3[0]=null;

        System.out.println(arr3[0].toString());

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,607评论 6 507
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,239评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,960评论 0 355
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,750评论 1 294
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,764评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,604评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,347评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,253评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,702评论 1 315
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,893评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,015评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,734评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,352评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,934评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,052评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,216评论 3 371
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,969评论 2 355

推荐阅读更多精彩内容

  • 1.定义:数组是一种容器,可以存放多个数据值 2.特点: 1.数组是一种引用类型。 2.数组当中的...
    Jhxia阅读 405评论 0 1
  • 这节课主要讲了数组的概念及对应特点的影响,还跟 Java 的 ArrayList 做了比较。 概念 数据是一种线性...
    wean_a23e阅读 174评论 0 0
  • 定义 多个相同类型数据按一定顺序排列的集合,并使用一个名字命名,并通过编号的方式对这些数据进行统一管理 常见概念 ...
    小猴子滴乐乐阅读 363评论 0 0
  • 1.数组(Array), 多个相同类型的数据,按照一定的顺序排列的集合 并使用一个名字命名,并通过编号的方式对这些...
    白名琰阅读 307评论 0 0
  • 兼容类型java八种基本类型(byte、short、int、long 、float、double、char、boo...
    TPAColalin阅读 191评论 0 0