数组,内存分配

数组

1、格式:数据类型 [ ] 数组名 = new 数据类型[数组长度];

例:int [ ] a = new int[5];

1 //案例
2 int [ ] arr = new int [5];       //动态初始化,在内存中开辟连续的5块空间
3 System.out.println(arr[0]);    //系统给出默认初始化值,整数类型都是0
4 
5 arr[0]=10;
6 System.out.println(arr[0]);
  • 整数类型:byte,short,int,long默认初始化值都是0.
  • 浮点类型:float,double默认初始化值都是0.0
  • 布尔类型:boolean默认初始化值false
  • 字符类型:char默认初始化值'\u0000',每一个0代表的是16进制的0,所以4个0就是16个二进制位

2、内存分配

(1)栈

  存储局部变量

  局部变量:定义在方法声明上和方法中的变量

(2)堆

  存储new出来的数组或对象

(3)方法区

  面向对象部分讲解

(4)本地方法区

  和系统相关

(5)寄存器

  给CPU使用

3、数组的静态初始化

简化格式:数据类型 [ ] 数组名 = {元素1,元素2,……};

4、数组的两个小问题:

(1)数组索引越界异常:ArrayIndexOutOfBoundsException

   原因:访问了不存在的索引

例:int [ ] arr = new int[5];

  System.out.println(arr[5]);      //当访问数组中不存在的索引,会出现索引越界异常

(2)空指针异常:NullPointerException

   原因:数组已经不再指向堆内存了,但是还去用数组名访问元素

例:int [ ] arr = {1,2,3};

  arr = null;

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

5、数组的遍历:

就是一次输出数组中的每一个元素

int [ ]  arr = {11,22,33,44,55};
//第一种(不适用)
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]);


//第二种(循环)
for(int i =0;i<5;i++){
     System.out.println(arr[i]);
}


//第三种
//arr.length表示数组的长度
//System.out.println(arr.length);
for(int i =0;i<arr.length;i++){
     System.out.println(arr[i]);
} 

6、数组获取最值

//例子

public static void main(String[] args){
              int [ ] arr = {33,44,55,22,11};
              int max = getMax(arr);
              System.out.println(max);
}

/*
1、返回值类型int
2、参数列表int[ ] arr
*/
public static int getMax(int [ ] arr){ int max = arr[0]; for(int i =1;i<arr.length;i++){ //从数组的第二个元素开始遍历 if(max<arr[i]){ //如果max记录的值小于数组中的元素 max = arr[i]; //max记录较大值 } } return max; }

7、数组的反序

public static void main(String[ ] args){
        int[ ] arr ={11,22,33,44,55};
        reverseArray(arr);
        print(arr);
}


/*
   1、明确返回值类型void
   2、明确参数列表int[ ] arr
*/

public static void reverseArray(int[ ] arr){
         for(int i=0;i<arr.length/2;i++){
               //arr[0]和arr[arr.length-1]交换
               //arr[1]和arr[arr.length-1-1]交换
               //arr[2]和arr[arr.length-1-2]交换
               //……
          int temp = arr[0];
           arr[0] = arr[arr.length-1-i];
           arr[arr.length-1-i] = temp;
         }
}

/*
   数组遍历
1、明确返回值类型void
2、明确参数列表int[ ] arr
*/
public static void print(int[ ] arr){
     for(int i = 0;i<arr.length;i++){   //遍历数组中的每一个元素
         System.out.print(arr[i]+" ");
           }
}

 8、查表法

//数组查表法,根据键盘录入索引,查找对应星期

public static void main(String[] args){
       Scanner sc = new Scanner(System.in);
        System.out.println("");
         int week = sc.nextInt();

         System.out.println("星期"+getWeek(week));
}

/*
     根据索引返回对应的星期
1、返回值类型char
2、参数列表 int week    
*/

public static char getWeek(int week){
        char[ ] arr = {' ','一','二','三','四','五','六','日');   //定义一张星期表
        return arr[week];   //通过索引获取表中的元素
}

9、基本查找

//例子
    public static void main(String[] args) {
        int[] arr = {11,22,33,44,55,66,77};    
        int index = getIndex(arr,33);
        System.out.println(index);
    }
    
    /**
     * 查找元素索引
     * 1、返回值类型int
     * 2、明确参数列表,int[] arr,int value
     */
    
    public static int getIndex(int[] arr,int value){
        for(int i=0;i<arr.length;i++){ //数组的遍历
            if(arr[i] == value){  
                return i;
            }
        }
        
        return -1;
    }

}

10、二维数组

格式:数据类型 数组名 [ ] [ ] = new 数据类型 [ ] [ ];

//例子
    public static void main(String[] args) {
        int arr [][] = new int[3][2];
        /**
         * 这是一个二维数组
         * 这个二维数组中有三个一维数组
         * 每个一维数组中有两个元素
         */
        
        //输出二维数组名称,一维数组名称,一个元素
        System.out.println(arr);
        System.out.println(arr[0]);
        System.out.println(arr[0][0]);
    }

11、二维数组求和

//例子
    
    /**
     * 需求:公司年销售额求和
     * 某公司按照季度和月份统计的数据如下:单位(万元)
     * 第一季度:22,66,44
     * 第二季度:77,33,88
     * 第三季度:25,45,65
     * 第四季度:11,66,99
     * 
     */
    
    public static void main(String[] args) {
        int [][] arr = {{22,66,44},{77,33,88},{25,45,65},{11,66,99}};
        
        int sum=0;    //定义变量,记录每次增加的结果
        for(int i=0;i<arr.length;i++){  //获取每一个一维数组
            for(int j=0;j<arr[i].length;j++){  //获取每一个一维数组中的元素
                sum=sum+arr[i][j];
            }
        }
        System.out.println(sum);
    }

 

posted @ 2019-04-10 17:09  LC97  阅读(409)  评论(0编辑  收藏  举报