• JavaSE| 数组


    1、数组(array)

    
    数组就是多个相同类型数据的组合,实现对这些数据的统一管理。 数组中的元素可以是任何数据类型,包括基本数据类型和引用数据类型。数组属引用类型,数组型数据是对象(object),
    每个元素相当于该对象的成员变量。 相同数据类型的一组元素,数据,按照一定的顺序排列的集合。 把有限个相同类型的变量,使用统一的名称进行命名,以便统一管理它们,这个统一的名称我们称为“数组名”, 每一个元素通过编号来区别,这个编号我们称为“索引index下标”。 组成数组的每一个数据我们称为“元素element”, 数组中元素的总个数,我们称为“数组的长度length”。 一个int类型的变量,存储一个整数值。 一、数组的声明 语法格式: 元素的数据类型[] 数组名; 数组名
    = new 元素的数据类型[]{元素值1,元素值2...}; 二、数组的初始化      1、目标: (1)确定数组的长度   (2)确定数组的元素值      2、动态初始化        语法格式:数组名 = new 元素的数据类型[长度]; 先声明,再动态初始化String[] name;             name = new String[5]; 声明+动态初始化如   int[] score = new int[5];        通过动态初始化的数组,元素有默认值,默认值也分为基本数据类型和引用数据类型。        基本数据类型:byte,short,int,long:0; float,double:0.0; char:u0000,即字符编码为0的字符; booleanfalse        引用数据类型:默认值统统都是null;例如String等类、接口、数组等类型   3、静态初始化:     语法格式:元素的数据类型[] 数组名 = {元素值1,元素值2...};          声明+静态初始化如:   int[] day = {30,31,33};         先声明,后再静态初始化如:int[] day;                       day = new int[]{ }    、手动赋值: 数组名[下标] = 值; 说明:数组的下标的范围[0,数组的长度-1] ;如果下标越界,会报ArrayIndexOutOfBoundsException 数组的元素:数组名[下标],数组元素下标从0开始,长度为n的数组合法下标取值范围为0-->n-1; 数组的长度:数组名.length 定义并运用运算符new为之分配空间后,才可以引用数组中的每个元素。 数组一旦初始化,其长度是不可变的。
    四、数组的遍历
    for(int i=0; i<数组名.length; i++){ //数组名[i]代表一个元素
    }
    增强for循环
    for(int num : arr){
      System.out.print(num);
    }

    数组的遍历/赋值、最高分和最低分、数组的反转

    class ShuZu{
        public static void main(String[] args){
            
            java.util.Scanner input = new java.util.Scanner(System.in);
            //输入小组人数
            System.out.print("请输入小组人数:");
            int count = input.nextInt();
            
            //声明和初始化name和score数组
            String[] name; //先声明
            name = new String [count]; //动态初始化
            
            int[] score = new int[count]; //声明+动态初始化
            
            
            //遍历数组赋值
            for (int i = 0; i < name.length; i++){
                System.out.print("第" + (i+1) + "个同学的名字:");
                name[i] = input.next();
                System.out.print("第" + (i+1) + "个同学的成绩:");
                score[i] = input.nextInt();
            }
            
            //遍历数组
            System.out.println("学生姓名和成绩如下:");
            for (int i = 0;i < name.length;i++ ){
                System.out.print(name[i] + ":");
                System.out.print(score[i] + "分" + "
    ");
            }
            
            //对数组score进行遍历找出最高分和最低分
            
            int max = score[0];
            int min = score[0];
            int indexMax = 0;//
            int indexMin = 0;
            int sum = 0;
            for(int i = 0; i < score.length; i++ ){ //也可以i < count;
                sum += score[i];
                if(max < score[i]){
                    max = score[i];
                    indexMax = i;
                }if(min > score[i] ){
                    min = score[i];
                    indexMin = i;
                }
                
            }System.out.println("第"+ (indexMax+1) + "个同学" + name[indexMax]  + "的成绩是最高的为:" + max);
            System.out.println("第"+ (indexMin+1) + "个同学" + name[indexMin]  + "的成绩是最高的为:" + min);
            System.out.println("总分为:" + sum + "平均分是:" + sum/count);
            
            //数组的反转方法一(首尾对应位置交换,借助第三个变量) 下标i和下标score.length-1-i  
            for(int i = 0;i <= score.length/2; i++){
                int temp = score[i]; 
                score[i] = score[score.length-1-i]; //[1,2,3,4,5,6] 1(0)和6(5);2(1)和5(4)... 
                score[score.length-1-i] = temp;
            }
            for(int i = 0; i< score.length;i++){
                System.out.print(score[i] + "	");
                
            }
            //数组的反转,方法二:借助一个空(新)数组
            int[] temp = new int[count];
            for(int i = 0;i < score.length;i++){
                temp[i]=score[score.length-1-i];
            }
            score = temp; //废弃旧数组,指向新数组
            for(int i = 0;i < score.length;i++ ){
                System.out.print(score[i] + "	");
            }
    
        }
    }

     由基本数据类型创建的数组它的默认值:

    public class TestArray0 {
        public static void main(String[] args){
            
            //对于基于基本数据类型的变量创建的数组:byte short int long float double char boolean
            //1.对于byte short int long而已:创建数组以后,默认值为0
            int[] scores = new int[4];
            scores[0] = 89;
            scores[3] = 90;
            for(int i = 0;i < scores.length;i++){
                System.out.println(scores[i]);
            }
            //2.对于float  double而言;默认值是0.0
            float[] f = new float[3];
            f[0] = 1.2F;
            for(int i = 0; i < f.length;i++){
                System.out.println(f[i]);
            }
            System.out.println();
            
            //3.对于char而言,默认是空格
            char[] c = new char[3];
            for(int i = 0; i < c.length;i++){
                System.out.println(c[i]);
            }
            System.out.println();
            
            //4.对于boolean而言,默认是false
            boolean[] b = new boolean[3];
            for(int i = 0; i < b.length;i++){
                System.out.println(b[i]);
            }
            System.out.println();        
            
            //5.对于引用类型的变量构成的数组而言:默认初始化值为null。以String为例
            String[] strs = new String[4];
            strs[0] = "AA";
            strs[1] = "BB";
            //strs[2] = "CC"; 默认为null
            strs[3] = "DD";
            //遍历数组的元素
            for (int i = 0;i < strs.length;i++){
                System.out.println(strs[i]);
            }
            //自定义的类
            System.out.println();
            Person[] pers = new Person[3];
            for(int i = 0; i < pers.length;i++){
                System.out.println(pers[i]);
            }
        }
    }
    class Person{
        
    }

    2、数组在内存中的结构

     整个内存里边的基本结构就分这4部分:

     new出来数组、对象;

    方法区:类名、包名、方法的定义等;常量池、字符串常量池等,想用哪个从池子里边拿

    静态区:静态的变量,用static修饰的变量等。

    以数组为例,看它如何使用内存结构的:

    java虚拟机进行解释运行对它进行初始化,栈先进后出,scores变量先存放在里边,每个内存里边都对应一个地址;new出来的放在堆里边。通过地址进行对应。

    //数组一旦初始化,其长度是不可变的
    public class TestAarry1 {
        public static void main(String[] args){
            int[] i = new int[]{12,13,14};
            int[] j = new int[10];
            for(int k = 0;k < i.length;k++){
                j[k] = i[k];
            }
            j[3] = 15;
            j[4] = 16;
            
            for(int k = 0; k < j.length;k++){
                System.out.println(j[k]);
            }
        }
    
    }

    3、二维数组

    数组的分类:
        一维数组、二维数组、三维数组...多维数组:从二维开始都算多维数组,一般到二维就差不多了。
    二维数组又称为矩阵。
    
    先把一行看成一个整体的话,二维数组就是一个“特殊一维数组”
            二维数组的行数,就是“特殊一维数组”的长度,二维数组名.length;
            一行同时又是一个一维数组,一行的列数,行.length;
            行:就是“特殊一维数组”的一个元素,二维数组名[下标]
    二维数组的相关表示方式:
        行:二维数组名[行下标]        行下标的范围[0, 总行数-1]
        元素:二维数组名[行下标][列下标]  列下标的范围[0, 该行的总元素的个数-1]
        行数:二维数组名.length
        每一行的列数:二维数组名[行下标].length
    
    二维数组如何声明?
        元素的数据类型[][] 二维数组名;
    
    例如:要存储每一组的学员的成绩,构成全班的成绩数组。    
    
    二维数组的初始化?
    1、静态初始化    
        二维数组名 = new 元素的数据类型[][]{{第一行的元素列表},{第二行的元素列表}....};
        
        声明 + 静态初始化:元素的数据类型[][] 二维数组名 = {{第一行的元素列表},{第二行的元素列表}....};
            int[][] scores2; //1. 先声明
            scores2 = new int[][]{{1,2,3},{3,4,5},{6}}; //2.静态初始化
    
         int[][] scores2 = {{1,2,3}, {3,4,5}, {6}}; //声明+静态初始化。
    2、动态初始化
      一维数组的动态初始化:  一维数组名 = new 元素的数据类型[长度];
    
      二维数组的动态初始化:
          1、每一行的列数是相同的,规则的矩阵
            二维数组名 = new 元素的数据类型[行数][列数];
          2、每一行的列数是不相同的,不规则的矩阵
            (1)第一步先确定总行数
                二维数组名 = new 元素的数据类型[行数][];
            (2)依次确定每一行的列数
                行 = new  元素的数据类型[列数];
    
        for(int i = 0; i < arr.length; i++){ //确定每行的列数;  --->> 为元素赋值  --->> 遍历显示   --->>换行
            arr[i] = new int[i + 1];
          }
            String[][] names; //1.二维数组的声明
            //names = new String[6][5];//动态初始化的方式一
            names = new String[6][0]; //动态初始化的方式二,先确定行数;再确定列数。
            names[0] = new String[5];
            names[1] = new String[3];
            names[2] = new String[7];
            names[3] = new String[9];
            names[4] = new String[2];
            names[5] = new String[4];
    二维数组如何为元素赋值
        二维数组名 [行下标][列下标] = 值;
    二维数组的遍历
    for(int i=0; i<行数; i++){
        for(int j=0; j<每一行的列数; j++){
            元素:二维数组名[行下标][列下标],即二维数组名[i][j]
        }
    } 

     

    package com.du.bai.www;
    
    public class TestArry2 {
        public static void main(String[] args){
            int[] scores1 = new int[10];
            int[][] scores2;
            String[][] names;
            //1.二维数组的初始化
            scores2 = new int[][]{{1,2,3},{3,4,5},{6}}; //静态初始化
            
            names = new String[6][5];//动态初始化的方式一
            names = new String[6][0]; //动态初始化的方式二
            names[0] = new String[5];
            names[1] = new String[3];
            names[2] = new String[7];
            names[3] = new String[9];
            names[4] = new String[2];
            names[5] = new String[4];
            
            //错误的初始化方式
            //names = new String[][];
            //names = new String[][5];
            
            //2.如何来引用具体的某一个元素
            int[][] i = new int[3][2]; //int[] i[] = new int[3][2];
            i[1][0] = 90;
            i[2][1] = 89;
            
            //3.数组的长度
            //二维数组的长度;length属性
            System.out.println(i.length); //3
            //二维数组中元素的长度
            System.out.println(i[0].length); //2
            System.out.println(names.length); //6
            System.out.println(names[4].length); //8
            System.out.println(); 
            
            //4.如何遍历二维数组
            for(int m = 0; m < scores2.length;m++){ //控制行数
                for(int n = 0;n < scores2[m].length;n++){
                    System.out.print(scores2[m][n] + "  ");
                }
                System.out.println();
            }
            
        }
    
    }
    View Code

    异常:下标越界、空指针 

    public class TestException {
        public static void main(String[] args){
            //1.数组下标越界异常:java.lang.ArrayIndexOutOfBoundsException
            int[] i = new int[10];
            //i[0] = 90;
            //i[10] = 99;
    //        for (int m = 0;m <= i.length;m++){
    //            System.out.println(i[m]);
    //        }
            
            //2.空指针的异常:NullPointerException
            //第一种:
    //        boolean[] b = new boolean[3];
    //        b = null;
    //        System.out.println(b[0]);
            
            //第二种:
    //        String[] str = new String[4];
    //        str[3] = new String("AA"); //str[3] = "AA";
    //        System.out.println(str[3].toString());
            //第三种:
            int[][] j = new int[3][];
            j[2][0] = 12;
        }
    }


     

    public class TestGetSum {
        public static void main(String[] args){
            int[][] m = new int[][]{{3,8,2},{2,7},{9,0,1,6}};
            int sum = 0;
            for (int i = 0;i < m.length;i++){
                for(int j = 0;j < m[i].length;j++){
                    System.out.print(m[i][j] + "	");
                    sum += m[i][j];
                }
                System.out.println();
            }
            System.out.println("总和为:" + sum);
        }
    
    }

    杨辉三角

    public class TestYangHui {
        public static void main(String[] args){
            int[][] yangHui = new int[10][];
            //1.初始化二维数组
            for(int i = 0;i < yangHui.length;i++){
                yangHui[i] = new int[i + 1];
            }
            //2.显示的为二维数组的每个元素赋值
            for(int i = 0;i < yangHui.length;i++){
                for(int j = 0;j < yangHui[i].length;j++){
                    yangHui[i][0] = yangHui[i][i] = 1;
                    
                    if (i > 1 && j > 0 && j < i){
                        yangHui[i][j] = yangHui[i - 1][j] + yangHui[i - 1][j - 1];
                        
                    }
                }
                
            }
            
            //遍历二维数组
            for(int i = 0;i < yangHui.length;i++){
                for(int j = 0; j < yangHui[i].length;j++){
                    System.out.print(yangHui[i][j] + "	");
                }
                System.out.println();
            }
        }
    
    }
    View Code

     4、API,数组工具类

    API:应用程序编程接口,俗称“帮助文档”
    
    java.util.Arrays:数组工具类
        此类包含用来操作数组(比如排序和搜索)的各种方法。
    
    (1)int binarySearch(int[] a, int key) 
            a - 要搜索的数组
            key - 要搜索的值
            结果:如果它(key)包含在数组(a)中,则返回搜索键的索引;否则返回 (-(插入点) - 1)。
                插入点:被定义为将键(key)插入数组(a)的那一点
        二分查找的前提:数组必须是有序的
    (2)void sort(int[] a) :对指定的 int 型数组按数字升序进行排序。
    (3)int[] copyOf(int[] original, int newLength)    如:Arrays.copyOf(arr, arr.length * 2); 扩容为原来的2倍。 
        复制指定的数组,截取或用 0 填充(如有必要),以使副本具有指定的长度。 Arrays..copyOf(arr, total);返回数组实际存储的元素;
        original - 要复制的数组,源数组
        newLength - 要返回的副本的长度 
        结果:原数组的副本,截取或用 0 填充以获得指定的长度 
    (4)int[] copyOfRange(int[] original, int from, int to)      
        original - 将要从其复制一个范围的数组,源数组
        from - 要复制的范围的初始索引(包括)
        to - 要复制的范围的最后索引(不包括)。(此索引可以位于数组范围之外)。 
        结果:original数组的[from,to)
    (5) void fill(int[] a, int val) 将指定的 int 值分配给指定 int 型数组的每个元素。 
        a - 要填充的数组
        val - 要存储在数组所有元素中的值
    (6)String toString(int[] a) 
    返回指定数组内容的字符串表示形式。字符串表示形式由数组的元素列表组成,括在方括号("[]")中。
    相邻元素用字符 ", "(逗号加空格)分隔。
            a - 返回其字符串表示形式的数组
            结果:a 的字符串表示形式,是一个字符串
    ....        
    class TestApi{
        public static void main(String[] args){
            
            //java.util.Scanner
            //1.找下标
            int[] arr = {8,2,0,4,5,1,6,9,3};
            int find = 5;
            int index = java.util.Arrays.binarySearch(arr,find);
            //因为这个工具的binarySearch方法会返回一个结果,所以我要用一个变量接收这个结果
            System.out.println("index=" + index);
    
            //2.排序,从小到大
            java.util.Arrays.sort(arr);
            for(int i = 0;i < arr.length; i++){
                System.out.print(arr[i] + "	");
            }
            
            
            //3.复制一个和原来长度一模一样的数组,两倍长就是arr.length * 2
            //int[] xin = java.util.Arrays.copyOf(arr, arr.length);
            //复制数组前3个;
            //int[] xin = java.util.Arrays.copyOf(arr, 3);
            //要复制arr数组,但是我想要从arr[2]复制到arr[5],
            //int[] xin = java.util.Arrays.copyOfRange(arr,3,5+1);
            //要复制arr数组,但是我想要从arr[2]开始到最后,并且新数组的长度是10
            //假设原数组够长,新数组的长度要10,从[2]~[11],但是11不包含,所以写12
            //int[] xin = java.util.Arrays.copyOfRange(arr, 2, 12);
            
            //4.填充
            int[] arr1 = new int[10];//用3填充数组arr
            //java.util.Arrays.fill(arr1, 3);
            
            java.util.Arrays.fill(arr1, (int)(Math.random()*100));
            
            
            
            for(int num : arr1){
                System.out.print(num + "	");
            }
            
            String str = java.util.Arrays.toString(arr);
            System.out.println(str);
            
        }
        
    }

    数组的增加

    创建添加信息对象;然后将对象作为参数传给数组

  • 相关阅读:
    android手机推送消息 (百度云推送)
    android小功能:checkbox使用自己的背景点击切换背景
    Android中的通知—Notification
    Android判断网络状态
    android简单的夜间模式
    Xutils请求服务器json数据与下载文件
    Android第三方登录详解2
    stackstorm docker中配置ssh免密码登录方式
    scrapy 采集网页出现丢失url的问题
    pandans导出Excel并将数据保存到不同的Sheet表中
  • 原文地址:https://www.cnblogs.com/shengyang17/p/10002822.html
Copyright © 2020-2023  润新知