Java基础内容 (4) ---- 数组,算法入门

Java基础内容 (4) ---- 数组的基本使用,数组的常见算法

1.数组的基本使用

1.1定义数组

1.2访问数组

1.3数组中的常见异常

        //1.1动态,静态定义数组
        int[] arr0  = new int[6];
        //数组类型与元素类型一致:int[] arr0 = new double[6]错于int类型数组不能存储double类型的数据
        //[]表示数组:int arr0[]或者 int[] arr0都可以表示int类型数组
        //new关键字在堆中为数组申请内存空间:int[] new = new int[6]错于标识符于关键字同名
        //数组长度必须指定,指定后不能更改:int[] arr0 =new int[]错于没有指定数组长度
        //
        int[] arr0 = new int[]{0,1,2,3,4,5};
        int[] arr0 = {0,1,2,3,4,5};
        //数组动态定义指定长度不指定元素,静态定义自定长度的同时指定元素
        //-------------------------------------------------------------------
        //1.2获得数组长度,访问数组首末元素,为元素赋值
        System.out.println(arr0.length);
        int a = arr0[0];
        int b = arr0[arr0.length-1];
        arr0[0]=10;
        //---------------------------------------------------------------------
        //1.3 数组常见异常
        //1.3.1ArrayIndexOutOfBoundsException数组越界异常
        System.out.println(arr0[8]);
        //arr0数组不存在[8]索引,访问越界

        //1.3.2NullPointerException空指针异常
        arr0 = null;
        System.out.println(arr0[0]);
        //arr0 = null; 变量arr0不再保存数组的内存地址,则不能继续对数组进行操作

1.4以数组为方法参数,方法返回数组

  • 数组作为方法参数传递,传递的参数是数组内存的地址。
  • 数组作为方法的返回值,返回的是数组的内存地址。

public class arrayCode0 {
    public static void main(String[] args) {
        //1.4数组作为方法的参数,方法返回数组
            int[] arr = getArray();
            System.out.println("方法返回arr的内存地址");
            System.out.println(arr);
            adrArray(arr);
        }
    public static int[] getArray(){
        int arr[] = new int[]{1,2,3};
        return arr;
    }
    public static void adrArray(int[] arr){
            System.out.println("传递的参数是arr的内存地址");
            System.out.println(arr);
        }

    }
方法返回arr的内存地址
[I@1b6d3586
传递的参数是arr的内存地址
[I@1b6d3586

 

2.数组的常见算法

2.1 遍历: 将数组中的每个元素分别获取出来,遍历数组是其他算法的基石。

2.2 最值:从数组的所有元素中找出最大(小)值。在遍历数组的基础上,元素一一与最值变量比较并更新最值变量实现。

2.3反转:数组中的元素颠倒顺序。在遍历数组的基础上,将对应位置一一对换元素实现。

public class arrayCode {
    public static void main(String[] args) {
        System.out.println("遍历数组");
        //2.1 遍历数组--- 一一打印
        int[] arr1 = new int[]{0, 2, 3};
        System.out.println(arr1[0]);
        System.out.println(arr1[1]);
        System.out.println(arr1[2]);
        //2.1遍历数组---循环打印
        int[] arr2 = new int[]{1, 2, 3, 4, 5, 6, 7, 8};
        for (int i = 0; i < arr1.length; i++) {
            System.out.print(arr1[i]+"\t");
        }
        System.out.println();
        //---------------------------------------------------------------
        System.out.println("查找数组最大值");
        //2.2找最大值
        int max = arr2[0];
        for (int i = 1; i < arr2.length; i++) {
            if (max < arr2[i]) {
                max = arr2[i];
            }
        }
        System.out.println(max);
        //---------------------------------------------------------------
        System.out.println("数组反转");
        //2.3反转
        for (int end = arr2.length - 1, head = 0; head<end ;end--, head++){
            int mediate = arr2[head];
            arr2[head] = arr2[end];
            arr2[end] = mediate;
        }
        for (int i = 0; i < arr2.length; i++) {
            System.out.print(arr2[i]+"\t");
        }
           System.out.println();
        //方法二
        //for(int i = 0; i<arr2.length/2; i++){
        //    mediate = arr2[i] ;
        //    arr2[i] = arr2[arr2.length-1-i];
        //    arr2[arr2.length-1-i] = mediate;
        //}
    }
}
遍历数组
0
2
3
0	2	3	
查找数组最大值
8
数组反转
8	7	6	5	4	3	2	1	

2.4复制(赋值):将数组1的元素(arr1[])复制给数组2(arr2[])。在遍历数组的基础上,将数组1的元素一一赋给数组2对应位置实现。

注意:区分“复制” 与 “将变量arr1的内存地址赋给变量arr2”。

package com.baishi.stage1.day05;

public class arrayCode1 {
    public static void main(String[] args) {
        int[] arr1 = new int[]{1, 2, 3, 4, 5, 6, 7, 8};
        System.out.println("数组1赋值给数组2");
        //2.4复制(赋值)
        int [] arr2 = new int[arr1.length];
        for (int i = 0; i < arr2.length; i++) {
            arr2[i] = arr1[i];
            //将arr1的元素复制给arr2,arr1和arr2内存地址不同但是数组元素值相同
        }
        //
        //对arr2做出的改变不影响arr1
        for(int i=0; i < arr2.length; i++){
            if(i%2==0){
                arr2[i]=0;
            }
        }
        //
        //打印arr1和arr2对比
        for (int i = 0; i < arr1.length; i++) {
            System.out.print(arr1[i]+"\t");
        }
        System.out.println();

        for (int i = 0; i < arr2.length; i++) {
            System.out.print(arr2[i]+"\t");
        }
        System.out.println();

        //2.4* 复制区别于两个应用变量指向同一内存地址
        System.out.println("两个变量指向同一个数组");
        arr2 = arr1;
        //将arr1的内存地址赋给arr2,arr1与arr2指向同一个数组,修改arr2意味着arr1也会被修改  
        //
        for(int i=0; i < arr2.length; i++){
            if(i%2==0){
                arr2[i]=1;
            }
        }
        //    
        //打印arr1和arr2对比
        for (int i = 0; i < arr1.length; i++) {
            System.out.print(arr1[i]+"\t");
        }
        System.out.println();

        for (int i = 0; i < arr2.length; i++) {
            System.out.print(arr2[i]+"\t");
        }
        System.out.println();

    }
}
数组1赋值给数组2
1	2	3	4	5	6	7	8	
0	2	0	4	0	6	0	8	
两个变量指向同一个数组
1	2	1	4	1	6	1	8	
1	2	1	4	1	6	1	8	

 

2.5 查找:在数组中找到指定元素的位置。

  • 线性查找:在遍历数组的基础上,一一判断元素是否与指定的元素相等实现。
  • 二分法查找:前提是有序数组。每次中间元素与指定元素比较,直接得到结果或者排除掉一半的元素。比较次数低于线性查找。
package com.baishi.stage1.day05;

public class arrayCode2 {
    public static void main(String[] args) {
        int[] arr2 = new int[]{1, 2, 3, 4, 5, 6, 7, 8};
        //2.5.1线性查找
        for (int i = 0,count = 0; i < arr2.length; i++) {
            count++;
            if (arr2[i] == 5) {
                System.out.println("5在第" + (i + 1) + "个位置");
                System.out.println("共比较了"+count+"次");
            }

        }
        System.out.println();

        //2.5.2二分查找
        //二分查找的前提是有序数组
        int left = 0, right = arr2.length - 1;
        int count = 0;
        while (left <= right) {
            int mid = (left + right) / 2;
            count++;
            if (arr2[mid] == 5) {
                System.out.println("5在第" + (mid + 1) + "个位置");
                System.out.println("共比较了"+count+"次");
                break;
            } else if (arr2[mid] < 5) {
                left = mid + 1;
            } else {
                right = mid - 1;
            }
        }


    }
}
5在第5个位置
共比较了5次

5在第5个位置
共比较了3次

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值