java 基础五 -- 数组

来源:互联网 发布:中俄列车大劫案知乎 编辑:程序博客网 时间:2024/06/07 06:45

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集合来代替了二维数组在此场景下的应用。
原创粉丝点击