java 基础五 -- 数组

1 数组的定义

  • 概念:同一种类型数据的集合,其实数组就是一个容器。
  • 数组的好处:可以自动的给数组中的元素从0开始编号,方便操作这些元素。
  • 格式1:
    • 元素类型[] 数组名 = new 元素类型[元素个数或数组长度];
  • 格式2:
    • 元素类型[] 数组名 = new 元素类型[]{元素1,元素2,……};    

 

  • 示例:  
package java005;

/**
 * 2017/9/3
 * 说明:数组
 */
public class ArrayDemo {
    public static void main(String[] args) {
        int [] arr = new int[5];
    }
}
  • 示例:
package java005;

/**
 * 2017/9/3
 * 说明:数组
 */
public class ArrayDemo {
    public static void main(String[] args) {
        int [] arr = new int[]{};
    }
}
  • 示例:
package java005;

/**
 * 2017/9/3
 * 说明:数组
 */
public class ArrayDemo {
    public static void main(String[] args) {
        int [] arr = new int[]{1,2,3};
    }
}
  • 示例:
package java005;

/**
 * 2017/9/3
 * 说明:数组
 */
public class ArrayDemo {
    public static void main(String[] args) {
        int [] arr = new int[5];
        System.out.println(arr[0]);
        arr[1] = 59;
        for(int x = 0;x<arr.length;x++){
            System.out.println(arr[x]);
        }
    }
}

 

2 数组的内存分配及特点

  • 内存的划分:
    • 寄存器
    • 本地方法区
    • 方法区
    • 堆内存
    • 栈内存  

 

  • 栈内存:存储的都是局部变量,而且变量所属的作用域一旦结束,该变量就自动释放。

 

  • 堆内存:存储的数组和对象(其实数组就是对象)。
    • 每一个对象都有一个首地址值。
    • 堆内存中的每一个变量都有默认初始化值,根据类型的不同而不同。整数为0,小数是0.0,boolean类型是false,char类型是'\u0000'。
    • 垃圾回收机制。  

 

  • 图解:int[] arr = new int[5];
    • ①main方法进栈

    • ②main方法进入到栈中,执行main方法中的代码,当执行到new int[5];的时候,在堆内存开辟了一段连续的空间,长度是5,并初始化堆中数组对象的默认值为对应类型的默认值,并分配堆中数组对象的内存地址。  

    • ③当将堆中地址赋值给左边的arr变量的时候,arr就指向了堆中的数组对象。  

 

3 数组操作常见问题

  • ArrayIndexOutOfBoundsException
package java005;

/**
 * 2017/9/3
 * 说明:数组
 */
public class ArrayDemo {
    public static void main(String[] args) {
        int [] arr = new int[5];
        System.out.println(arr[5]);

    }
}

 

  • NullPointerException
package java005;

/**
 * 2017/9/3
 * 说明:数组
 */
public class ArrayDemo {
    public static void main(String[] args) {
        int [] arr = new int[5];
        System.out.println(arr[arr.length-1]);
        arr = null;
        System.out.println(arr[arr.length-1]);

    }
}

 

4 数组常见操作

4.1 遍历数组

package java005;

/**
 * 2017/9/3
 * 说明:数组
 */
public class ArrayDemo {
    public static void main(String[] args) {
        int[] arr = new int[]{1,2,3,4,5,6,7,8,9,0};
        for(int x = 0 ;x<arr.length;x++){
            System.out.print(arr[x] +"\t");
        }

    }
}

4.2 最值

package java005;

/**
 * 2017/9/3
 * 说明:求最值
 */
public class ArrayDemo2 {
    public static void main(String[] args) {
        int[] arr = new int[]{1,11,33,-1,-10};
        int max = max(arr);
        int min = min(arr);
        System.out.println("最大值是:"+max);
        System.out.println("最小值是:"+min);

    }

    /**
     * 求一个数组的最大值
     * @param arr
     * @return
     */
    public static int max(int[] arr){
       if(arr.length == 0){
           throw new RuntimeException("数组不能为空");
       }
       int max = arr[0];
       for(int x =0;x<arr.length;x++){
           if(max < arr[x]){
               max = arr[x];
           }
       }
       return max;
    }

    /**
     * 求一个数组的最小值
     * @param arr
     * @return
     */
    public static int min(int[] arr){
        if(arr.length == 0){
            throw new RuntimeException("数组不能为空");
        }
        int min = arr[0];
        for(int x =0;x<arr.length;x++){
            if(min > arr[x]){
                min = arr[x];
            }
        }
        return min;

    }



}

4.3 选择排序

 

 

package java005;

/**
 * 2017/9/3
 * 说明:选择排序
 */
public class ArraySortDemo {
    public static void main(String[] args) {
        int[] arr = {34,19,11,103,56};
        //排序前
        printArray(arr);
        //排序
        sortArray(arr);
        //排序后
        printArray(arr);

    }

    /**
     * 打印数组
     * @param arr
     */
    public static void printArray(int[] arr){
        System.out.print("[");
        for(int x = 0;x<arr.length;x++){
            if(x == (arr.length -1)){
                System.out.print(arr[x] +"]");
            }else{
                System.out.print(arr[x]  +"、");
            }


        }
    }

    /**
     * 对数组进行排序
     * @param arr
     */
    public static void sortArray(int[] arr){
        for(int x = 0;x< arr.length-1;x++){
            for(int y = x+1;y<arr.length;y++){
                if(arr[x] > arr[y]){
                    int temp = arr[y];
                    arr[y] = arr[x];
                    arr[x] = temp;
                }

            }


        }
    }


}

4.4 冒泡排序

 

 

package java005;

/**
 * 2017/9/4
 * 说明:冒泡排序
 */
public class ArraySortDemo2 {
    public static void main(String[] args) {
        int[] arr = new int[]{34,19,11,109,3,56};
        //排序前
        printArray(arr);

        sortArray(arr);

        //排序后
        printArray(arr);

    }

    /**
     * 输出数组中的每个元素
     */
    public static void printArray(int[] arr){
        System.out.print("[");
        for (int x = 0;x<arr.length;x++){
            if(x == arr.length-1){
                System.out.println(arr[x] +"]");
            }else{
                System.out.print(arr[x]+"、");
            }
        }
    }

    /**
     * 冒泡排序算法
     * @param arr
     */
    public static void sortArray(int[] arr){
        for(int x =0;x<arr.length -1;x++){
            for(int y = 0; y<arr.length -1 -x;y++){
                if(arr[y] > arr[y+1]){
                    int temp = arr[y];
                    arr[y] = arr[y+1];
                    arr[y+1] = temp;

                }
            }

        }
    }


}

4.5 找出数组中指定数值的位置

4.5.1 普通查找法

package java005;

/**
 * 2017/9/4
 * 说明:冒泡排序
 */
public class ArraySortDemo2 {
    public static void main(String[] args) {
        int[] arr = new int[]{34,19,11,109,3,56};
        int index = commonFindElementIndexByValue(arr,109);
        System.out.println("索引值是:"+index);

    }

    

    public static int commonFindElementIndexByValue(int[] arr,int value){
        if(arr == null || arr.length == 0){
            return -1;
        }
        for(int x =0;x<arr.length;x++){
            if(value == arr[x]){
                return x;
            }
        }
        return -1;

    }




}

4.5.2 二分查找法(折半查找法)--必须先排序

package java005;

/**
 * 2017/9/4
 * 说明:二分查找法
 */
public class BinarySearchDemo {
    public static void main(String[] args) {
        int[] arr = new int[]{34,19,11,109,3,56};
        sort(arr);
        int index = binarySearch(arr,56);
        System.out.print("index:"+index);
    }

    /**
     * 排序
     * @param arr
     */
    public static void sort(int[] arr){
        for(int x =0;x<arr.length -1; x++){
            for(int y = 0; y<arr.length -1 -x;y++){
                if(arr[y] > arr[y+1]){
                    int temp = arr[y];
                    arr[y] = arr[y+1];
                    arr[y+1] = temp;
                }
            }
        }
    }

    /**
     * 二分查找法
     * @param arr
     * @param value
     * @return
     */
    public static int binarySearch(int[] arr,int value){
        if(arr == null || arr.length ==0){
            return -1;
        }
        int min = 0;
        int max = arr.length-1;
        int mid = (min + max) / 2;
        while(arr[mid] != value){
            if(value > arr[mid]){
                min = mid +1 ;
            }else if(value < arr[mid]){
                max = mid - 1;
            }
            if(min > max){
                return  -1;
            }
            mid = (min + max) / 2;


        }

        return mid;
    }

}
  • 二分查找法,是有弊端的,如果当前数组不是排序过的,那么返回的索引不是排序之前的索引值
package java005;

import javax.lang.model.element.VariableElement;

/**
 * 2017/9/4
 * 说明:二分查找法
 */
public class BinarySearchDemo {
    public static void main(String[] args) {
        int[] arr = new int[]{34,19,11,109,3,56};
        sort(arr);
        int index = binarySearch(arr,56);
        System.out.print("index:"+index);
    }

    /**
     * 排序
     * @param arr
     */
    public static void sort(int[] arr){
        for(int x =0;x<arr.length -1; x++){
            for(int y = 0; y<arr.length -1 -x;y++){
                if(arr[y] > arr[y+1]){
                    int temp = arr[y];
                    arr[y] = arr[y+1];
                    arr[y+1] = temp;
                }
            }
        }
    }

    /**
     * 二分查找法
     * @param arr
     * @param value
     * @return
     */
    public static int binarySearch(int[] arr,int value){
        if(arr == null || arr.length ==0){
            return -1;
        }
        int min = 0;
        int max = arr.length-1;
        int mid = 0;
        while(min < max){
            mid = (min + max) >> 1;
            if(value > arr[mid]){
                min = mid + 1;
            }else if(value < arr[mid]){
                max = mid - 1;
            }else{
                return mid;
            }


        }

        return -1;
    }
}

4.6 将一个整数转换为16进制的数

  •  在Java中,整数int是32位,而16进制的数,是从0到15,即每四个二进制就对应16进制,为啥?因为4个二进制最大为1111,对应的16进制是8+4+2+1=15。所以int类型的整数对应的16进制数是8位。

 

 

package java005;

/**
 * 2017/9/5
 * 说明:
 */
public class ConverterHex {
    public static void main(String[] args) {
        toHex(60);
    }

    public static void toHex(int num){

        if(num == 0){
            System.out.print("0");
            return;
        }
        
        char[] chs = {'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};

        char[] arr = new char[6];
        int p = arr.length;

        while (num != 0){
            int temp = num & 15;
            arr[--p] = chs[temp];
            num = num >>>4;
        }

        for(int x = p;x<arr.length;x++){
            System.out.print(arr[x]);
        }


    }

}

 

5 数组中的数组(二维数组)

5.1 数组的定义

5.1.1 格式一

  • int[][] arr = new int[3][2];
  • 定义了名称为arr的二维数组。
  • 二维数组中有3个一维数组。
  • 每一个一维数组中有2个元素。
  • 一维数组的名称分别为arr[0]、arr[1]和arr[2]。
  • 给第一个一维数组中第一个元素赋值89,写法是arr[0][0]=89.

5.1.2 格式二

  • int[][] arr = new int[3][];
  • 二维数组中有3个一维数组。
  • 每一个一维数组的默认初始化值是null。
  • 可以对这三个一维数组分别进行初始化。
arr[0] = new int[3];
arr[1] = new int[9];
arr[x] = new int[50];

5.2 二维数组的示例

package java005;

/**
 * 2017/9/5
 * 说明:
 */
public class Array2Demo {
    public static void main(String[] args) {
        int[][] arr = new int[3][2];
        arr[0][0] = 89;
        for(int x = 0;x<arr.length;x++){
            for(int y = 0;y<arr[x].length;y++){
                System.out.print(arr[x][y] +"\t");
            }
            System.out.println();
        }

    }
}

 

5.3 二维数组的应用场景

  • 某个公司需要统计销售人员每季度的销售额,那么其中销售甲的季度销售额用数组表示为;{30,59,28,17},那么乙同样可以用数组来表示销售乙的季度销售额{37,60,22,19},那么公司统计所有销售人员的销售额应该如下所示。

    • int[][] arr = {{30,59,28,17},{37,60,22,19}};  
  • 虽然,上面的方式是可以满足我们的要求,但是我们并不清楚那个是甲的,那个是乙的,所以在java中使用Map集合来代替了二维数组在此场景下的应用。
发布了0 篇原创文章 · 获赞 7 · 访问量 8万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章