首页 > 技术文章 > 数组、数组遍历以及数组遍历的包装(开发常用)

saowei 2021-11-29 23:28 原文

数组

一、数组的介绍

1、数组的概念:
     (1)数组是存储同一数据类型的多个元素的集合,可以理解为一个容器
     (2)数组既可以存储基本数据类型,也可以存储引用数据类型
  回顾:基本数据类型:byte,short,int,long,float,double,char,boolean
       引用数据类型:类(class)、接口(interface)、数组([])
2、数组的语句格式:
        格式1:数据类型[] 数组名;
            举例:int[]  arr
            
        格式2:数据类型 数组名[];
            举例:int  arr[]
            
3、注意事项:
	(1)这两种定义,数组中是没有元素值的。
	(2)针对于这两种定义数组的格式,推荐使用第一种。
	(因为第一种的定义格式可读性更强。早期的时候很多人喜欢用第二种,
	 但是慢慢地发展,使用第一种的人越来越多了)
4、定义了一个数组,如果数组里面没有值,没有任何意义。要想使用它,就必须先做初始化
    (1)初始化:为数组中地元素进行分配内存空间,并且为元素赋值。
    (2)如何对数组的元素进行初始化呢?
        ①动态初始化:初始化时,只指定数组长度,由系统为数组分配初始值(先不赋值)   
        ②静态初始化:初始化时指定每个数组元素的初始值,由系统决定数组长度(先赋值)
5、数组中常见的两个报错
(1)ArrayIndexOutOfBoundsException
    访问到了数组中的不存在的索引时发生。
(2)NullPointerException
    数组引用没有指向实体,却在操作实体中的元素时

二、动态初始化

1、动态初始化
	(1)初始化时只指定数组长度,由系统为数组分配初始值。
	(2)格式:
        	数据类型[] 数组名 = new 数据类型[数组长度]
        	(数组长度其实就是数组中元素的个数)
            举例:
                int[] arr = new int[3];
            解释:定义了一个int类型的数组,这个数组中可以存放3个int类型的值
2、单独使用是没有任何意义地,因为尚未初始化变量arr,未初始化之前不能使用
  (未初始化之前若使用,执行时会报错)
			如下:
                public class ArrayDemo1 {
                    public static void main(String[] args) {
                       int[] arr;	//定义一个数组,int类型地数组
                        System.out.println(arr);
                      }
                  }
3、
            public class ArrayDemo1 {
                public static void main(String[] args) {

                    int[] arr = new int[3];
                    /*
                        左侧:
                              int:说明数组的元素是int类型
                               []:说明它是一个数组类型
                              arr: 给数组起的名字
                        右侧:
                              new: 代表为数组分配一个内存空间
                              int: 说明数组中的元素的数据类型是int类型
                               []: 说明它是一个数组
                                3: 代表着数组的长度,其实就是数组元素的个数
                     */
                    System.out.println(arr);
                }
            }
            
       执行结果如下:
                    [I@1540e19d

                    Process finished with exit code 0
========================================================================
        (1)解释说明:
                   [I@4554617c 	  代表地址值 十六进制的
        (2)在实际编写代码的过程中,拿到地址值是没有任何意义的,我们大多数情况下
	    实际上是想获取数组的元素值;
            数组里面提供了一个类似于编号的作用的东西,我们称之为索引(下标)
			
        (3)如何通过索引获取数组中的元素呢?
           	语法格式:
                        数组的名称[索引]
         	 注意事项:
         		 ①索引的编号是从0开始的,从左往右的顺序编号
         		 ②索引不能越界
=====================================================
获取数组中的元素如下代码所示:  
                    public class ArrayDemo1 {
                        public static void main(String[] args) {

                    int[] arr = new int[3];//定义一个int类型的数组,长度位3
                    		  //(数组长度位3,其实就是数组的元素有3个)
            
                  System.out.println(arr[0]);//获取arr数组中的第一个元素
                  System.out.println(arr[1]);//获取arr数组中的第二个元素
                  System.out.println(arr[2]);//获取arr数组中的第三个元素
                  }
              }
              
          执行结果如下:
                        0
                        0
                        0

                        Process finished with exit code 0
 ====================================================================== 
(1)Java程序为了提高程序运行的效率,在内存中对数据进行了划分
	具体划分了5个部分:
                        ①栈:存储局部变量(方法中定义的变量称之为局部变量)
                        ②堆:存储new出来的东西
                        ③方法区:(后期会说到)
                        ④本地方法区:(后期会说到)
                        ⑤寄存器:(后期会说到)
(2)堆内存的特点:
                ①堆内存中放的都是new出来的东西
                ②每个变量都有一个系统给的默认值,根据数据类型不同,默认值也不同
                byte,short,int,long		0
                float,double			0.0
                char				'\u0000'
                boolean				false
                引用数据类型			null
                
                
		由(1)(2)可知,执行结果都是系统给的默认值0     
4、定义一个int类型的数组,给数组中的元素赋值

          public class ArrayDemo3 {
              public static void main(String[] args) {

              int[] arr = new int[3];    //定义一个长度为3的int类型的数组

                arr[0] = 10;        //将10赋值给数组中的第一个元素
                arr[1] = 20;        //将20赋值给数组中的第二个元素
                arr[2] = 30;        //将30赋值给数组中的第三个元素

                    System.out.println(arr);
                    System.out.println(arr[0]);
                    System.out.println(arr[1]);
                    System.out.println(arr[2]);
                }
            }
            
            执行结果为:
                    [I@1540e19d
                    10
                    20
                    30

                    Process finished with exit code 0
5、定义两个int类型的数组,分别给数组中的元素赋值

                public class ArrayDemo3 {
                    public static void main(String[] args) {
                        
                        int[] arr1 = new int[3];
                        arr1[0] = 11;
                        arr1[1] = 22;
                        arr1[2] = 33;
                        System.out.println(arr1);
                        System.out.println(arr1[0]);
                        System.out.println(arr1[1]);
                        System.out.println(arr1[2]);

                        int[] arr2 = new int[4];
                        arr2[0] = 44;
                        arr2[1] = 55;
                        arr2[2] = 66;
                        System.out.println(arr2);
                        System.out.println(arr2[0]);
                        System.out.println(arr2[1]);
                        System.out.println(arr2[2]);
                        System.out.println(arr2[3]);//第4个元素没赋值,
						    //输出结果就默认为0
                    }
                }
                
                执行结果如下:
                            [I@1540e19d
                            11
                            22
                            33
                            [I@677327b6
                            44
                            55
                            66
                            0

                            Process finished with exit code 0

6、
                定义两个数组,先定义一个数组,赋值,输出。
                然后定义第二个数组的时候把第一个数组的地址赋值给第二个数组。
                然后给第二个数组赋值,再次输出两个数组的名及元素

            public class ArrayDemo4 {
                public static void main(String[] args) {
                    
                    int[] arr = new int[3];		//定义第一个数组
                   
                    arr[0] = 11;			//赋值
                    arr[1] = 22;			//赋值
                    arr[2] = 33;			//赋值
                    
                    System.out.println(arr);
                    System.out.println(arr[0]);
                    System.out.println(arr[1]);
                    System.out.println(arr[2]);

                 定义第二个数组,把第一个数组的地址赋值给第二个数组
                    int[] arr2 = arr;
                 然后给第二个数组赋值,再次输出两个数组的名及元素。
                    arr2[0] = 100;
                    arr2[1] = 200;

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

                    System.out.println(arr2);
                    System.out.println(arr2[0]);
                    System.out.println(arr2[1]);
                    System.out.println(arr2[2]);
                }
            }
            
            执行结果如下:
                        [I@1540e19d
                        11
                        22
                        33
                        [I@1540e19d
                        100
                        200
                        33
                        [I@1540e19d
                        100
                        200
                        33

                        Process finished with exit code 0
                        
       由此可见,将第一个数组的地址赋值给第二个数组之后,二者输出结果一样

三、静态初始化

1、静态初始化:指定每个数组元素的初始值,由系统决定数组长度。

2、静态初始化格式:
    		数据类型[] 数组名 = new 数据类型[]{元素1,元素2,…};
    			
          举例:
                int[] arr = new int[]{11,12,13};
          解释:
            	定义了一个int类型的数组,这个数组中可以存放3个int类型的值,
		并且值分别是11,12,13
      简化的写法:
                int[] arr = {1,2,3};
3、静态初始化注意事项:
                (1)大括号中值要和定义数组的时候数据类型要一致
                (2)使用静态初始化的时候,右边的中括号中不允许出现数字
                    如果出现了,就意味着,定义的时候既有动态初始化,也有静态
		    初始化两者不能混淆
                    例:int[] arr1 = new int[5]{1,2,3,4,5};//错误
                (3)当初始值不是0的时候,推荐使用静态初始化
4、静态初始化代码如下:
                public class ArrayDome4 {
                    public static void main(String[] args) {
                        int[] arr = new int[]{1,3,5};

                        System.out.println(arr[0]);
                        System.out.println(arr[1]);
                        System.out.println(arr[2]);
                    }
                }
          或者
              public class ArrayDome4 {
                   public static void main(String[] args) {
                       int[] arr = {1,3,5};	//静态初始化的简化格式

                         System.out.println(arr[0]);
                         System.out.println(arr[1]);
                         System.out.println(arr[2]);
                        }
                    }
                    
             执行结果如下:
                            1
                            3
                            5

                            Process finished with exit code 0

四、数组遍历(依次输出数组中的每一个元素)

打印出数组中的每一个元素
		方法1:使用顺序结构
					
            public class ArrayDemo6 {
                public static void main(String[] args) {
                    //定义一个数组
                    int[] arr = new int[8];
                    arr[0] = 11;
                    arr[1] = 22;
                    arr[2] = 33;
                    arr[3] = 44;
                    arr[4] = 55;
                    arr[5] = 66;
                    arr[6] = 77;
                    arr[7] = 88;
                    System.out.println(arr[0]);
                    System.out.println(arr[1]);
                    System.out.println(arr[2]);
                    System.out.println(arr[3]);
                    System.out.println(arr[4]);
                    System.out.println(arr[5]);
                    System.out.println(arr[6]);
                    System.out.println(arr[7]);
                 }
             }
             
                 方法2:使用for循环
          public class ArrayDemo6 {
                    public static void main(String[] args) {
                        //定义一个数组
                        int[] arr = new int[8];
                        arr[0] = 11;
                        arr[1] = 22;
                        arr[2] = 33;
                        arr[3] = 44;
                        arr[4] = 55;
                        arr[5] = 66;
                        arr[6] = 77;
                        arr[7] = 88;
                 for(int i=0;i<8;i++){
                    System.out.println(arr[i]);
                  }
              }
           }

五、属性length的引入

1、由于我们上面的数组arr可以一眼就能数清有多少个元素,所以在循环的时候,可以确定一个范围但是呢,当我们数组中的元素有非常多的时候,这时候就不一定能数清了,如果有一个办法可以获取数组元素的个数就好了,java中的数组提供一个属性,可以让我们获取到数组的长度
2、这个属性的名字叫做:length
3、使用格式:
	  数组名称.length
			
4、例:利用属性获取数组中元素的个数:
    	public class ArrayDemo6 {
           public static void main(String[] args) {
               int[] arr = {1,2,3,67,78,90,67,45,67,89,12}
               System.out.println(arr.length);	//属性的使用
                  }
              }
              
              执行结果如下:
                            11

                            Process finished with exit code 0
                            
               即,利用属性求出数组中的元素个数为11
5、数组遍历引入属性
        public class ArrayDemo5 {
               public static void main(String[] args) {

                  int[] arr ={11,22,33,44,55,66,77,88};
			//元素非常多时需要引入属性
                        for(int i =0;i<arr.length;i++){
                            System.out.println(arr[i]);
                        }
                    }
                }

六、数组遍历的包装(开发常用)

1、遍历的包装就是为了让依次输出的数值,排列更加的美观

2、例:这种情况输出都在一列,很难看
   public class ArrayDemo6 {
        public static void main(String[] args) {
            //第1步:静态初始化,指定数组中元素的值
            int[] arr = {1,2,34,56,45,24,56,76,5,666,7776,4456,1233,10};
            //第2步:如果元素较多,使用属性获取元素的个数
         System.out.println(arr.length); //有14个元素(arr.length是一个数)
            //第3步:引入属性,并使用for循环遍历
            for(int i = 0;i<arr.length;i++){
                System.out.println(arr[i]);
            }
        }
    }
================================================================
  
  包装改进:
        为了排列美观,我们需要让输出的元素在一行,而且两端加上[],元素之间用逗号隔开  
    
    
=================引入属性,使用for循环遍历==========================

		public class ArrayDemo6 {
    public static void main(String[] args) {
        //第1步:静态初始化,指定数组中元素的值
        int[] arr = {1,2,34,56,45,24,56,76,5,666,7776,4456,1233,10};
        //第2步:如果元素较多,使用属性获取元素的个数
        System.out.println(arr.length); //有14个元素
        
        //第3步:引入属性,并使用for循环遍历
        for(int i = 0;i<arr.length;i++){
            if(i==0){
                System.out.print("["+arr[i]);//给最左端加[
            }else if(i==arr.length-1){		 //给最右端加]
                System.out.print(arr[i]+"]");
            }else{
                System.out.print(arr[i]+",");//依次输出,并且逗号隔开
            }
        }
    }
}
执行结果如下:
        14
        [12,34,56,45,24,56,76,5,666,7776,4456,1233,10]
        Process finished with exit code 0
        
 =======================使用方法遍历=============================
 
public class ArrayDemo6_1 {
    public static void main(String[] args) {
        //第1步:静态初始化,指定数组中元素的值
        int[] arr = {1,2,34,56,45,24,56,76,5,666,7776,4456,1233,10};
        //第2步:如果元素较多,使用属性获取元素的个数
        System.out.println(arr.length); //有14个元素(arr.length是一个数)

        //第4步:调用方法,调用时方法里的名字要和初始化定义的一致
        printArry(arr);			//没有明确的返回值,可以单独调用
    }
        //第3步:新定义一个方法,起个名字叫printArry
        //定义方法时,参数名字要和方法内部一致
    public static void printArry(int[] arr1){
        for(int i = 0;i<arr1.length;i++){
            if(i==0){
                System.out.print("["+arr1[i]);
            }else if(i==arr1.length-1){
                System.out.print(arr1[i]+"]");
            }else{
                System.out.print(arr1[i]+",");
            }
        }
    }
}

七、获取数组数组中的最值

					获取数组中的最大值最小值

            分析:  1、定义一个数组,存储一些元素(使用静态初始化)
                   2、首先在数组中任意找一个元素进行比较,默认一开始它就是最大值
                      一般来说,我们取第一个(选择排序)
                   3、遍历其他的元素与第一个元素进行比较,如果找到了更大的元素,
                      就将它取代,如果比它小,不管它继续和后面比较
                   4、输出最大值

public class Array2Test2 {
    public static void main(String[] args) {
        int[] arr ={2,25,3,21,15,18,88,38,26};//定义一个一维数组
        int max = arr[0];   //取第一个元素,定义为最大值

        for(int i =1;i<arr.length;i++){
            if(arr[i]>max){     //拿着这个定义的最大值与其他元素进行比较
               max = arr[i];    //如果其他元素大于max,则其他元素为最大值
            }
        }
        System.out.println(max); //在for循环外输出最大值
                                 // 若在for循环内,则会打印每一个元素值
    }
}

推荐阅读