Java数组

数组的实例化

使用new的两种方式:
1.动态初始化
第一种方式: new+直接初始化具体元素
第二种方式: new+长度
2. 静态初始化
数据类型[] 变量 = {元素1,元素
public class _01ArrayDemo {
    public static void main(String[] args) {
        //new+直接初始化具体元素
        String[] names = new String[]{"小红","小明","小强","张三","李四"};
        //new+长度:   注意,其实是有长度个默认元素
        int[] nums = new int[5]; // byte,short,int,long对应的默认元素是0
        System.out.println(Arrays.toString(nums));
        double[] prices = new double[5]; // float double 对应的默认元素0.0
        System.out.println(Arrays.toString(prices));
        char[] chars = new char[5];      //char 对应的默认元素 \u0000
        System.out.println(Arrays.toString(chars));
        boolean[] bools = new boolean[5];  //boolean 对应的默认元素  false
        System.out.println(Arrays.toString(bools));
        String[] adds = new String[5];      //引用类型 对应的默认元素 null
        System.out.println(Arrays.toString(adds));

        //使用静态初始化的方式,实例化一个数组, 注意:该方式不能先声明,再初始化
        int[] numbers = {1,2,3,4,5};
    }
}

数组的访问

1. 通过下标访问:  下标就是元素对应的索引值。 下标从0开始,最后一个元素下标length-1
2. 数组的长度:  变量名.length
3. 如何通过下标访问:  变量名[index]
public class _02ArrayDemo {
    public static void main(String[] args) {
        int[] ages = new int[]{20,18,19,20,19,30};
        //获取ages中的第一个元素
        int first = ages[0];
        System.out.println("first: " + first);
        //获取ages中的第4个元素
        int four = ages[3];
        System.out.println("four: " + four);
        //打印ages的长度
        System.out.println("长度:"+ages.length);
        //直接打印ages中的最后一个元素
        System.out.println("最后一个元素:"+ages[ages.length-1]);

        //将年龄39,存入到第二个位置
        ages[1] = 39;
        //将年龄50,存入到最后一个位置
        ages[ages.length-1] = 50;
        System.out.println(Arrays.toString(ages));

        //创建一个具有5个长度的long类型数组
        long[] ns = new long[5];
        //将数字10,20,30,40,50分别存入。
        ns[0] = 10;
        ns[1] = 20;
        ns[2] = 30;
        ns[3] = 40;
        ns[4] = 50;
        System.out.println(Arrays.toString(ns));

        //将数字1~10存入到int类型的数组scores里
        int[] scores = new int[10];
        for (int i = 0; i < scores.length  ; i++) {
            scores[i]=i+1;
        }
        System.out.println(Arrays.toString(scores));
    }
}

数组下标越界

数组下标越界异常:ArrayIndexOutOfBoundsException
1. 什么时候发生的?在运行期间发生的。
2. 怎么发生的?当输入的下标大于等于数组的长度或者是小于0发生的。
3. 运行时异常,如果不做任何处理操作,那么jvm会暴力终止该程序。
空指针异常:NullPointerException
1. 运行时异常,运行期间发生的
2. 如何发生的, 即使用null去访问各种方法或者属性
比如:  null.length()   null.name等等操作

public class _03ArrayDemo {
    public static void main(String[] args) {
        int[] nums = {1,3,2,4,5};
//        int e1 = nums[5];
//        System.out.println(e1);
//        int e2 = nums[nums.length+10];
//        System.out.println(e2);

        String[] names = {"小明","michael",null,""};
        //打印每个元素的字符长度
        for (int i = 0; i < names.length; i++) {
            //处理null的情况
            if(names[i]==null){
                continue;
            }
            System.out.println(names[i].length());
        }
    }
}

数组的遍历

1. 使用经典for循环,通过下标进行遍历
2. 使用foreach循环:也叫增强for循环。底层使用的是迭代器。
for(元素类型 变量名:数组|集合|枚举){

 }
 3. 两者的对比
- 增强for循环中,没有下标的概念
- 增强for循环中,不能对数组中的元素进行改动
- 增强for循环比遍历下标的执行效率要高

public class _04ArrayDemo {
    public static void main(String[] args) {
        int[] nums = new int[5];
        nums[0] = 10;
        nums[1] = 20;
        nums[2] = 30;
        nums[3] = 40;
        nums[4] = 50;
        //直接打印数组的变量
        System.out.println("数组变量:"+nums); //直接打印数组名,得到的是类全名+@+内存地址的16进制数字
        //调用Arrays.toString();
        System.out.println("数组字符串:"+ Arrays.toString(nums));

        //使用经典for循环,通过下标进行遍历
        for (int i = 0; i < nums.length; i++) {
            //i充当下标
            System.out.print(nums[i]+" ");
            //System.out.println(nums[i]);
        }
        System.out.println();
        System.out.println("---------增强for循环-----------");

        //使用foreach循环遍历上面的数组nums
        for(int n:nums){
            System.out.print(n+" ");
        }
    }
}

数组的排序之: 选择排序

原理:
 第一轮:拿0索引处的元素与后面的元素一一做比较,满足条件就交换。每次交换都保证0索引处是较小值。
一轮结束,0索引处,就是最小值
第二轮:拿1索引处的元素与后面的元素一一做比较,满足条件就交换。每次交换都保证1索引处是较小值。
一轮结束,1索引处,就是第二最小值
每轮依次比较下去。
比较的轮数: 元素个数-1

通过分析:  轮数是有外层循环控制,
 每一轮的比较由内层循环控制

 0-1,2,3,4,5
   1-2,3,4,5
     2-3,4,5
       3-4,5
         4-5
public class _05ArrayDemo {
    public static void main(String[] args) {
        int[] nums = {6,5,3,2,4,1};
        //控制着轮数
        for (int i = 0; i < nums.length -1 ; i++) {
            //控制着每轮的比较
            for (int j = i+1; j < nums.length ; j++) {
                //  nums[i]:  就是每轮要判断是否是最小的元素的位置。
                //  nums[j]:  就是依次要比较的后续元素
                if(nums[i] > nums[j]){ //条件成立,做交换操作
                    //定义一个临时变量,保存i处的元素
                    int temp = nums[i];
                    // 将j处的元素存储i处
                    nums[i] = nums[j];
                    // 将临时变量里的原i处的元素,放入j处。
                    nums[j] = temp;
                }
            }
        }
        System.out.println(Arrays.toString(nums));
    }
}

冒泡排序

   从左到右,紧挨着的两个元素进行比较,满足条件就交换。
 数组里有6元素。
第一轮:  能找到最大值,冒泡到最右边。
  比较五次
 第二轮:   第二大元素冒泡到倒数第二个为止
比较4次
第五轮:  第五大元素冒泡的正数的第二个为止。  最后一个数不再需要比较了
注意: 每一轮比较时,都是从最左边的两个元素开始的。
6个元素:
 i=0    j=5
 i=1    j=4
 i=2    j=3
 i=3    j=2
 i=4    j=1     j < length-1-i

public class _08ArrayDemo {
    public static void main(String[] args) {
        int[]  nums = {6,2,4,7,1,5};
        //外层循环控制着轮数,轮数是leng-1轮
        for (int i = 0; i < nums.length-1; i++) {
            //内层是控制着每轮如何比较. 每次都要从左边开始比较,因此j从0开始
            for (int j = 0; j < nums.length-1-i ; j++) {
                // 如果前面的大于后面的,就做交换操作
                if (nums[j] > nums[j+1]) {
                    int temp = nums[j];
                    nums[j] = nums[j+1];
                    nums[j+1] = temp;
                }
            }
        }
        System.out.println(Arrays.toString(nums));
    }
}

从数组中查找元素--顺序查找法

public class _09ArrayDemo {
    public static void main(String[] args) {
        int[] nums = {100,23,48,56,10,78};
        //需求:查找数组中是否有56,如果有,返回其坐标,如果没有返回-1
        int index = searchElement(nums,23);
        System.out.println("index:"+index);
    }
    /**
     * 需求:查找int类型的数组arr中是否有元素element,如果有,返回其坐标,如果没有返回-1
     */
    public static int searchElement(int[] arr, int element) {
        int index = -1;
        for (int i = 0; i < arr.length; i++) {
            if(arr[i] == element){
                index = i;
                break;
            }
        }
        return index;
    }
}

数组元素的二分查找法

public class _10ArrayDemo {
    public static void main(String[] args) {
        int[] nums = {1,4,6,7,9,10};
        int index = binarySearch(nums,7);
        System.out.println(index);
    }
    /**
     * 写一个使用二分查找算法,从int类型的数组arr中找元素element的方法
     * 找到,返回其坐标,没找到,返回-1
     */
    public static int binarySearch(int[] arr, int element) {
        int min = 0, max = arr.length - 1;
        //  min<=max时,表示还没有找到该元素, min=max时,是最后一次查找
        while (min <= max) {
            // 找到中间的元素下标
            int mid = (min + max) / 2;
            if (arr[mid] == element) {
                //如果mid位置上的元素就是我们要找的,就返回下标
                return mid;
            }else if (arr[mid] < element) { // 表示要找的元素,在中间值的右侧
                min = mid + 1;  //将min设置为中间下标+1.  然后重新循环
            }else {  //表示要找的元素,在中间值的左侧
                max = mid - 1;  //将max设置为中间下标-1.  然后重新循环
            }
        }
        //循环结束都没有遇到return,说明没有找到,就返回-1
        return -1;
    }
}

Arrays工具类的用法

1. toString():将数组转换为字符串形式。   "["+元素1+","+元素2+","+.....+"]"
2. binarySearch():在已排序的数组中查找指定元素的索引。
3. fill():将数组的所有元素都设置为指定值。
4. sort(数组):对数组进行排序。
5. copyOf():将一个数组的部分或全部元素复制到一个新数组中。
public class _11ArrayDemo {
    public static void main(String[] args) {
        int[] nums = {1,2,3,4,5};
        String info = Arrays.toString(nums);
        System.out.println(info);//[5, 4, 3, 2, 1]
        System.out.println(Arrays.toString(nums)); //[5, 4, 3, 2, 1]

        //注意:工具类里的二分查找法,必须要数组升序排序
        int index = Arrays.binarySearch(nums,4);
        System.out.println(index);

        //使用指定元素,填满整个数组
        Arrays.fill(nums,100);
        System.out.println(Arrays.toString(nums));

        //Arrays.sort(数组名): 只能对已经提前设置好排序规则的类的数组进行排序。
        int[] nums2 = {2,3,4,1,5};
        Arrays.sort(nums2);
        System.out.println(Arrays.toString(nums2));

        // 扩容: 将源数组的所有元素都拷贝到新数组的最前面,然后多余的位置是默认值, 注意:返回的是一个新的数组
        int[] nums3 = Arrays.copyOf(nums2,10); // [1,2,3,4,5,0,0,0,0,0]
        // 指定的长度一样,因此可以理解为,完全拷贝。新数组和源数组一模一样
        int[] nums4 = Arrays.copyOf(nums2,nums.length);  // [1,2,3,4,5]

        // 指定的长度小于源数组的长度,可以理解为部分拷贝。注意是从头开始拷贝
        int[] nums5 = Arrays.copyOf(nums2,3);
        System.out.println(Arrays.toString(nums5));

    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值