代码编织梦想

目录

1.数组的定义与初始化

2.遍历数组

3.认识null

4.引用变量

5.返回多个值

6.数组拷贝

7.数组逆序 

8.数组填充

9.小练习

//将整形数组转化为字符串

//二分查找优化

//冒泡排序优化

10.二维数组

//遍历二维数组 

//不规则的二维数组


1.数组的定义与初始化

int [ ] arr1 = { 0, 1, 2, 3, 4};

int [ ] arr2 = new int [ ]{ 0, 1, 2, 3, 4};

int [ ] arr3 = new int [5];

注意:1> 不同于C语言中未初始化默认为随机值,Java中未初始化默认为0

           2> 当需要整体初始化时,必须在定义的时候初始化,即不能先定义再初始化

           3> 第二点中用上述arr3中的new方式可以先定义再初始化,但是需要分开初始化;

           4> boolean类型数组默认值为false,string类型数组默认值为null(注意是小写)。

2.遍历数组

public static void main(String[] args) {
    int[] arr = {1, 2, 3, 4, 5};
    //法一
    //获取长度:遍历对象.length 
    for(int i = 0;i< arr.length;i++){
        System.out.print(arr[i]);
    }
    System.out.println();
    //法二:for-each,增强for循环
    //把arr中的每个元素都取出来放到x里面
    //与for循环区别:无法获取数组下标
    for (int x:arr) {
        System.out.print(x+" ");
    }
    System.out.println();
    //法三:要导入import java.util.Arrays;
    //Java自己将数组里的值以字符串形式组织后进行打印
    System.out.println(Arrays.toString(arr));
}

 

这里使用了Java自带的方法打印字符串 Array.toString(),顺便说一下排序方法 Array.sort()

这类方法还有很多,之后碰见了再一一叙述(下方二分查找中就有另一种方法)。

 

3.认识null

public static void main(String[] args) {
    int[] arr = null;//arr这个引用,不指向任何对象
    System.out.println(arr.length);//空指针异常
    System.out.println(arr[0]);//空指针异常
}

 null在Java中表示“空引用”,也就是一个不指向对象的引用,作用类似于C语言中的NULL(空指针)

4.引用变量

public static void main(String[] args) {
    int[] arr1 = {1,2,3,4,5};
    int[] arr2 = arr1;
    arr2[0] = 9;
    System.out.println(Arrays.toString(arr1));//[9, 2, 3, 4, 5]
    System.out.println(Arrays.toString(arr2));//[9, 2, 3, 4, 5]
}

 arr2这个引用指向了arr1这个引用所指向的对象,即arr1和arr2指向同一内存,修改其中任何一个引用另一个也会被修改。

5.返回多个值

public static int[] fun1(){
    int[] arr = new int[]{1,2,3,4,5};
    return arr;
}
public static int[] fun2(){
    int a = 10;
    int b = 20;
    return new int[]{a,b};
}
public static void main(String[] args) {
    int[] ret1 = fun1();
    int[] ret2 = fun2();
    System.out.println(Arrays.toString(ret1));//[1, 2, 3, 4, 5]
    System.out.println(Arrays.toString(ret2));//[10, 20]
}

6.数组拷贝

public static int[] copy(int[] arr){
    int[] copyArr = new int[arr.length];
    for (int i = 0; i < arr.length; i++) {
        copyArr[i] = arr[i];
    }
    return copyArr;
}
public static void main(String[] args) {
    int[] arr = {1,2,3,4,5};
    //法一:自己实现
    int[] ret1 = copy(arr);
    System.out.println(Arrays.toString(ret1));//[1, 2, 3, 4, 5]
    //法二:Java自带
    int[] ret2 = Arrays.copyOf(arr,arr.length);
    System.out.println(Arrays.toString(ret2));//[1, 2, 3, 4, 5]
    数组扩容
    int[] ret3 = Arrays.copyOf(arr,arr.length*2);
    System.out.println(Arrays.toString(ret3));//[1, 2, 3, 4, 5, 0, 0, 0, 0, 0]
    指定范围拷贝:Arrays.copyOfRange()
    int[] ret4 = Arrays.copyOfRange(arr,1,4);//注意:[1,4),左闭右开
    System.out.println(Arrays.toString(ret4));//[2, 3, 4]
    指定范围拷贝:System.arraycopy()
    int[] ret5 = new int[arr.length];
    System.arraycopy(arr,0,ret5,0,arr.length);//拷贝arr.length个元素从arr的0下标处到ret5的0下标处
    System.out.println(Arrays.toString(ret5));//[1, 2, 3, 4, 5]
}

7.数组逆序 

这个与C语言没有什么区别。

public static void reverse(int[] arr){
    int i = 0;
    int j = arr.length-1;
    while(i < j){
        int tmp = arr[i];
        arr[i] = arr[j];
        arr[j] = tmp;
        i++;
        j--;
    }
}
public static void main(String[] args) {
    int[] arr = {1,2,3,4,5,};
    reverse(arr);
    System.out.println(Arrays.toString(arr));
}

8.数组填充

public static void main(String[] args) {
    int[] arr1 = new int[5];
    int[] arr2 = new int[5];
    Arrays.fill(arr1,6);//全部填充为6
    Arrays.fill(arr2,1,3,8);//[1,3)填充为8
    System.out.println(Arrays.toString(arr1));//[6, 6, 6, 6, 6]
    System.out.println(Arrays.toString(arr2));//[0, 8, 8, 0, 0]
}

9.小练习

//将整形数组转化为字符串

public static String toString(int[] arr){
    if(arr == null){
        return null;
    }
    String ret = "[";
    int i = 0;
    for (i = 0; i < arr.length-1; i++) {
        ret += arr[i];
        ret += ",";
    }
    ret += arr[i];
    ret += "]";
    return ret;
}
public static void main(String[] args) {
    int[] arr = {1,2,3,4,5};
    String ret = toString(arr);
    System.out.println(ret);//[1,2,3,4,5]
}

//二分查找优化

public static int findkey(int[] arr,int key){
    int left = 0;
    int right = arr.length;
    while(left <= right){
        int mid = (left + right)/2;
        if(arr[mid] > key){
            right = mid - 1;
        }else if(arr[mid] < key){
            left = mid + 1;
        }else{
            return mid;
        }
    }
    return -1;
}
public static void main(String[] args) {
    int[] arr = {0,1,2,3,4,5,6,7,8,9};
    Scanner scan = new Scanner(System.in);
    int key = scan.nextInt();
    //法一:自己实现
    int ret = findkey(arr,key);
    System.out.println(ret);
    //法二:Java自带 Arrays.binarySearch
    int index = Arrays.binarySearch(arr,key);
    System.out.println(index);
}

二分查找只能用于有序数组,但有了 Array.sortArray.binarySearch 后,先排序再查找,这样不论是有序还是无序数组都可以查找了,超级方便!! 

//冒泡排序优化

public static void bubbleSort (int[] arr){
    for (int i = 0; i < arr.length-1; i++) {
        boolean flag = false;
        for (int j = 0; j < arr.length-1-i; j++) {
            if(arr[j] > arr[j+1]){
                int tmp = arr[j];
                arr[j] = arr[j+1];
                arr[j+1] = tmp;
                flag = true;
            }
        }//当内层循环发现数组已经有序时,flag为false
        if(flag == false){
            break;
        }
    }
}
public static void main(String[] args) {
    int[] arr = {0,2,4,6,8,1,3,5,7,9};
    bubbleSort(arr);
    System.out.println(Arrays.toString(arr));
}

相较于之前的冒泡排序,这里增加了flag作为标记,如果内层循环发现数组已经有序,flag就会置为true并且跳出循环,之后的循环就没必要进行了,节省时间。

10.二维数组

定义:int[][] arr1 = {{1,2,3},{4,5,6}};
     int[][] arr2 = new int[2][3];
     int[][] arr3 = new int[][]{{1,2,3},{1,2,3}};

//遍历二维数组 

public static void main(String[] args) {
    int[][] arr = {{1,2,3},{4,5,6}};
    System.out.println(arr.length);//2
    System.out.println(arr[1].length);//3
    //法一:for循环
    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();
    }
    //法二:for-each循环
    for (int[] x:arr) {
        for (int y:x) {
            System.out.print(y+" ");
        }
        System.out.println();
    }
    //法三:Arrays.deepToString()
    String ret = Arrays.deepToString(arr);
    System.out.println(ret);//[[1, 2, 3], [4, 5, 6]]
}

//不规则的二维数组

Java中不可省略行,但可省略列

这样一来二维数组就变得十分灵活,可以自定义每一行的列数。

public static void main(String[] args) {
    int[][] arr = new int[2][];
    arr[0] = new int[3];//第一行列数为3
    arr[1] = new int[5];//第二行列数为5
}

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_74455045/article/details/129460046

java数组转list的三种方式及对比_大脑补丁的博客-爱代码爱编程_数组转list

前言: 本文介绍Java中数组转为List三种情况的优劣对比,以及应用场景的对比,以及程序员常犯的类型转换错误原因解析。 一.最常见方式(未必最佳) 通过 Arrays.asList(strArray) 方式,将数组转

Java数组-爱代码爱编程

一. Java数组01 1.数组的定义 数组是相同类型数据的有序集合。数组描述的是相同类型的若干个数据,按照一定的先后次序排列组合而成。其中,每一个数据称作一个数组元素,每个数组元素可以通过一个下标来访问它们。二.Java数组02 1.数组的声明与创建 首先必须声明数组变量,才能在程序中使用数组。下面是声明数组变量的语法: ``··dataTyp

java 数组中插入元素_Java数组添加元素-爱代码爱编程

java 数组中插入元素 How to add elements to an array in java We know that java array size is fixed, so we can’t add elements to an Array. We have to provide size of the array when we ini

java反射,动态代理-爱代码爱编程

1. 反射 1.1 反射的概述: ​ 专业的解释(了解一下): ​ 是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法; ​ 对于任意一个对象,都能够调用它的任意属性和方法; ​ 这种动态获取信息以及

【1.3 api服务网关(springcloudgateway)】基于springcloud gateway的webflux与google的kaptcha实现图形验证码功能_kaptcha和captchautil那个性能好-爱代码爱编程

一、背景 基于SpringCloud 微服务架构的项目中,需要使用图形验证码,以下是使用的记录。 二、验证码功能介绍 有两种工具生成验证码:Captcha 和 kaptcha 2.1 Captcha 介绍 2.1