JavaSE进阶三 数组

2021-06-09  本文已影响0人  SimonLike

数组的定义

代码示例
public class Array01 {
    public static void main(String[] args) {
        //使用静态初始化方式声明一个int类型数组
        int[] arr1 = {1,3,4,6,62};
        // 数组中的length属性
        System.out.println("数组中元素的个数:" + arr1.length);

        // 使用下标对数组中的元素进行存取
        // 取(读)
        System.out.println("数组中第一个元素:" + arr1[0]);
        System.out.println("数组中最后一个元素:" + arr1[arr1.length - 1]);

        // 存(修改)
        // 把第一个元素修改为11
        arr1[0] = 11;
        // 把最后一个元素修改为119
        arr1[arr1.length - 1] = 119;

        System.out.println("数组中第一个元素:" + arr1[0]);
        System.out.println("数组中最后一个元素:" + arr1[arr1.length - 1]);

       //遍历数组
        for (int i = 0 ;i < arr1.length; i++ ){
            System.out.println(arr1[i]);
        }
        // 下标为5表示第6个元素,数组中没有第6个元素,越界了;会出现异常
        // System.out.println(arr1[6]);//ArrayIndexOutOfBoundsException(数组越界异常)

        // 倒序遍历数组
        for (int i = arr1.length - 1 ; i >=0 ; i-- ){
            System.out.println("倒序-->" + arr1[i]);
        }
       
        // -------------------------------------------------------------------------------
       
        // 初始化动态数组
        int[] arr = new int[4];
        for (int i = 0;i < arr.length; i++){
            System.out.println("数组中下标" + i + "的元素是:" + arr[i]);
        }

        //初始化一个Object类型的数组,采用动态方式初始化
        Object[] objs = new Object[3]; // 3个长度,动态初始化,每个元素默认值是null
        for (int i = 0 ; i < objs.length; i++){
            System.out.println(objs[i]);
        }
        
        
    }
}

数组存储 "引用数据类型"

代码示例
public class Array02 {
    public static void main(String[] args) {
        // 创建一个Animal类型的数组
        Animal a1 = new Animal();
        Animal a2 = new Animal();
        Animal[] animals = {a1,a2};
        // 对Animal数组进行遍历
        for (int i = 0; i < animals.length; i++){

            // Animal a = animals[i];
            // a.move();
            // 代码合并
            animals[i].move();
        }

        //------------------------------------------------

        // 动态初始化一个长度为2的Animal类型的数组
        Animal[] animals2 = new Animal[2];
        animals2[0] = new Animal();
        // Animal数组中可以存储Cat类型数据,因为Cat是一个Animal。
        // Cat 是Animal的子类。
        animals2[1] = new Cat();

        //------------------------------------------------

        // 创建一个Animal类似的数组,数组中存储Cat和Bird
        Animal[] animals3 = {new Cat(),new Bird()};
        // 对Animal数组进行遍历
        for (int i = 0; i < animals3.length; i++){

            // 调用的方法是父类型中存在的方法不需要向下转型,直接使用父类引用调用即可。
            animals3[i].move();

            // 调用子类特有方法,父类中没有的方法  需要向下转型(多态)
            if (animals3[i] instanceof Cat){
                ((Cat) animals3[i]).moveCat();
            }else if (animals3[i] instanceof Bird){
                ((Bird) animals3[i]).moveBird();
            }

        }
    }
}
class Animal{
    public void move(){
        System.out.println("Animal move--");
    }
}

class Cat extends Animal{
    public void move(){
        System.out.println("Cat move--");
    }

    public void moveCat(){
        System.out.println("猫在抓老鼠--");
    }
}

class Bird extends Animal{
    public void move(){
        System.out.println("Bird move--");
    }
    public void moveBird(){
        System.out.println("鸟儿在飞翔--");
    }
}

数组的扩容

代码示例
public class Array03 {
    public static void main(String[] args) {
        // java中的数组是如何进行拷贝的
        // 拷贝源 (从这个数组中拷贝)
        int[] arr = {1,3,5,7,6};
        // 拷贝目标(拷贝到这个目标数组上)
        int[] dest = new int[10];// 每个默认元素为0

        // 调用JDK System类中的arraycopy方法,来完成数组的拷贝。
        // 将arr数组中的数据从下标1开始,拷贝2个元素
        // 放入dest数组中,从下标3开始。
        System.arraycopy(arr,1,dest,3,2);

        // 将arr数组中的数据全部拷贝到dest数组中,dest数组从下标0开始。
        // System.arraycopy(arr,0,dest,0,arr.length);

        for (int i = 0;i< dest.length; i++){
            System.out.println("dest-->" + dest[i]);
        }

    }
}

二维数组

代码示例
public class Array04 {
    public static void main(String[] args) {
        // 一维数组
        int[] array = {1,3,2,5,9};
        int[] array1 = {32,23,54,95};
        int[] array2 = {15,36,22,53,92,23,55};

        // 二维数组
        // 里面是3个一维数组
        int[][]arr = {array,array1,array2};

        System.out.println("二维数组长度:" + arr.length);// 3

        for (int i = 0;i<arr.length;i++){
            System.out.println(arr[i].length);// 输出arr中元素(一维数组)的长度: 5 4 7
        }

        System.out.println("--------------------------------------------------");

        // 取二维数组中第1个元素(一维数组)中的第1个元素
        System.out.println(arr[0][0]);
        // 取二维数组中第2个元素(一维数组)中的第3个元素
        System.out.println(arr[1][2]);
        // 取二维数组中第3个元素(一维数组)中的第4个元素
        System.out.println(arr[2][3]);

        // 修改二维数组中第1个元素(一维数组)中的第1个元素
        arr[0][0] = 320;
        System.out.println(arr[0][0]);

        System.out.println("--------------------------------------------------");

        // 遍历二维数组
        for (int i = 0;i<arr.length;i++){
            for (int j = 0; j < arr[i].length; j++){
                System.out.print( arr[i][j] + " " );
            }
            System.out.println("这是第" + (i + 1) + "个一维数组");
        }

        System.out.println("--------------------------------------------------");

        // 动态初始化二维数组
        // 3个一维数组,每个一维数组有4个元素

        int[][] a34 = new int[3][4];

        for (int a = 0;a<a34.length;a++){
            
            for (int j = 0; j < a34[a].length; j++){
                System.out.print( a34[a][j] + " " );
            }
            System.out.println("这是第" + (a + 1) + "个一维数组");
        }
    }
}

数组--冒泡排序算法

代码示例
public class Sort01 {
    public static void main(String[] args) {
        int[] arr = {2,8,6,3,1,9,4};
        int count = 0;
        // 使用冒泡排序算法进行排序
        for (int i = arr.length-1 ; i > 0; i--) {
            System.out.println("i-->" + i);

            for (int j = 0; j < i ; j++) {
                System.out.println("j=" + j + ";" + "arr[j]=" + arr[j] + ";" + "arr[j+1]=" + arr[j+1]);

                if (arr[j] > arr[j+1]){
                    count++;
                    int temp ;
                    temp = arr[j];
                    arr[j] = arr[j+1];
                    arr[j+1] = temp;
                }
            }
        }

        System.out.println("交换位置次数:"+ count);

        // 排序之后遍历输出
        for (int a = 0;a < arr.length;a++){
            System.out.println(arr[a]);// 从小到大
        }
    }
}

数组--选择排序

代码示例
public class Sort02 {
    public static void main(String[] args) {
        int[] arr = {2,8,6,3,1,9,4};

        int count = 0;

        // 使用选择排序算法进行排序(7条数据循环6次)
        for (int i = 0 ; i < arr.length - 1; i++) {
            int min = i;
            for (int j = i+1; j < arr.length; j++){
                if (arr[min] > arr[j]){
                    min = j;// 最小值元素的下标
                }
            }
            int temp ;
            // 当i和min相等时,不交换位置,
            // 当i和min不相等是,表示有更小的元素,需要拿更小的元素和最左边的元素交换位置。
            if (min != i){
                count++;
                // arr[min] 最小的元素
                // arr[i] 最前面的元素
                temp = arr[min];
                arr[min] = arr[i];
                arr[i] = temp;
            }
        }
        // 相对于冒泡排序 交换位置次数变少了
        System.out.println("交换位置次数:"+ count);

        // 排序之后遍历输出
        for (int a = 0;a < arr.length;a++){
            System.out.println(arr[a]);// 从小到大
        }
    }
}

数组--元素的查找

代码示例
public class Search {
    public static void main(String[] args) {
        int[] arr ={2,34,55,66,22,42,68,88};
        // 需求找到22的下标,如果没找到返回-1

        // 一个一个挨着找
        int index = ArrSearch(arr,68);
        System.out.println(index== -1 ? "该元素不存在!":"该元素的下标是:"+index);

        // --------------------------------------------------------------------

        //  二分法查找
        Arrays.sort(arr);// 对数组进行排序
        int index2 = ArrUtilSearch(arr,42);

        // 以下写法是sun公司封装好的二分法查询
        //int index2 = Arrays.binarySearch(arr,42);

        System.out.println(index2== -1 ? "该元素不存在!":"该元素的下标是:"+index2);
    }

    /**
     * 从数组中查找目标元素的下标(二分法查找)
     * @param array  被检索的数组(必须是已经排序的)
     * @param i 目标元素
     * @return -1表示该元素不存在,大于等于0的数表示元素的下标
     */
    private static int ArrUtilSearch(int[] array, int i) {

        int begin = 0;// 开始下标
        int end = array.length -1; // 最后一个元素的下标

       while (begin <= end){
           int mid = (begin + end) / 2; // 中间元素下标

           if (array[mid] == i){
                return mid;
            }else if (array[mid] < i){
                // 目标元素在中间元素的右边
                // 开始元素的下标重新赋值
                begin = mid + 1;
            }else {
                // 目标元素在中间元素的左边
                // 最后一个元素的下标需要重新赋值
                end = mid - 1;
            }
       }

        // 程序执行到此处,表示没有找到元素
        return -1;
    }

    /**
     * 从数组中检索某个元素的下标(一个一个的查找)
     * @param array 被检索的数组
     * @param a 被检索的元素
     * @return -1表示该元素不存在,大于等于0的数表示元素的下标
     */
    public static int ArrSearch(int[] array,int a){
        for (int i = 0;i<array.length;i++){
            if (array[i] == a){
                return i;
            }
        }
         // 程序执行到此处,表示没有找到元素
        return -1;
    }
}

上篇:JavaSE进阶二 Object中的方法
下篇:JavaSE进阶四 String

上一篇下一篇

猜你喜欢

热点阅读