Java——数组的定义和使用

Posted 地火轰雷

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java——数组的定义和使用相关的知识,希望对你有一定的参考价值。

Java中数组的定义和使用

1.数组的基本用法

1.1什么是数组

数组本质上就是让我们能“批量”创建相同类型的变量。

例如:

如果需要表示两个数据,那么直接创建两个变量即可int a; int b;

如果需要表示五个数据,那么可以创建五个变量int a1; int a2; int a3; int a4; int a5;

但是如果需要表示一万个数据,那么就不能创建一万个变量了,这时候就需要使用数组,帮我们批量创建变量。

注意事项:在Java中,数组中包含的变量必须是相同类型

1.2创建数组

基本语法

//动态初始化
数据类型[] 数组名称 = new 数据类型 [] {初始化数据};

//静态初始化
数据类型[] 数组名称 = {初始化数据};

代码示例

int[] arr = new int[]{1, 2, 3};

int[] arr = {1, 2, 3};

注意事项:静态初始化的时候,数组元素个数和初始化数据的个数是一致的。

1.3数组的使用

代码示例:获取长度&访问元素

int[] arr = {1, 2, 3};

//获取数组长度
System.out.println("length: "+array.length);    //  执行结果:3

//访问数组中的元素
System.out.println(array[1]);    // 执行结果:2
System.out.println(array[0]);    // 执行结果:1
arr[2] = 100;
System.out.println(array[2]);    // 执行结果:100

注意事项

  1. 使用arr.length能够获取到数组的长度。.这个操作为成员访问操作符。
  2. 使用[ ]按小标取数组元素。需要注意,下标从0开始计数。
  3. 使用[ ]操作既能读取数据,也能修改数据。
  4. 下标访问操作不能超出有效范围[0,length-1],如果超出有效范围,会出现下标越界异常。

代码示例:下标越界

int[] arr={1,2,3};
System.out.println(arr[100]);

//执行结果
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 100
	at TestDemo.main(TestDemo.java:14)

抛出了java.lang.ArrayIndexOutOfBoundsException异常。使用数组一定要下标谨防越界。

代码示例:遍历数组

所谓"遍历"是将数组中的所有元素都访问一遍,不重不漏。通常需要搭配循环语句。

int[] array={1,2,3};
for (int i = 0; i < array.length; i++) {
     System.out.println(array[i]);
}

//执行结果
1
2
3

代码示例:使用for-each遍历数组

int[] arr = {1,2,3};
for (int x : array){
    System.out.println(x);
}

//执行结果
1
2
3

for-each是for循环的另外一种使用方式。能够更方便的完成对数组的遍历。可以避免循环条件和更新语句写错。

2.数组作为方法的参数

2.1基本用法

代码示例:打印数组内容

public static void printfArray(int[] a){
    for(int x : a){
        System.out.println(x);
    }
}

public static void main(String[] args){
    int[] arr={1,2,3};
	printArray(arr);
}

//执行结果
1
2
3

在这个代码中

int[] a是函数的形参,int[] arr是函数实参。

如果需要获取到数组长度,同样可以使用a.length

2.2理解引用类型(重点/难点)

我们尝试以下代码

代码示例 参数传数组类型

public static void func1(int[] array){
    array = new int[]{11,2,13,4,51,61};
}
public static void func2(int[] array){
    array[0]=899;
}

public static void main(String[] args) {
    int[] array={1,2,3,4,5,6};
    System.out.println(Arrays.toString(array));
    func1(array);
    func2(array);
    System.out.println(Arrays.toString(array));
}

//执行结果
func1:
1 2 3 4 5 6
[1,2,3,4,5,6]
func2:
1 2 3 4 5 6
[899,2,3,4,5,6]

我们发现,修改形参的值,不影响实参的的值。

我们发现,在函数内部修改数组内容,函数外部也发生改变。此时数组名arr是一个"引用",当传参的时候,是按照引用传参。

2.3认识 null

null在Java中表示"空引用",也就是一个无效的引用。

int[] arr = null;
System.out.println(arr[0]);

//执行结果
Exception in thread "main" java.lang.NullPointerException
	at TestDemo.main(TestDemo.java:13)

null的作用类似于C语言中的NULL(空指针),都是表示一个无效的内存位置。因此不能对这个内存进行任何读写操作,一旦尝试读写,就会抛出NullPointerException

注意:Java中并没有约定null和0号地址的内存有任何关联。

3.数组作为方法的返回值

代码示例:写一个方法,将数组中的每个元素都*2

public static void func(int[] array){
        for (int i = 0; i < array.length; i++) {
            array[i]=2*array[i];
        }
    }//    在原来的数组上扩大二倍

    public static int[] transform(int[] array){
        int[] ret = new int[array.length];
        for (int i = 0; i < array.length; i++) {
            ret[i]=2*array[i];
        }
        return ret;
    }//    在新的数组上扩大二倍

    public static void main(String[] args) {
        int[] array={1,2,3,4,5};
        int[] ret=transform(array);
        System.out.println(Arrays.toString(ret));
        //func(array);
        //System.out.println(Arrays.toString(array));
    }

这样的话就不会破坏原有数组了。

另外由于数组是引用类型,返回的时候只是将这个数组的首地址返回给函数调用者,没有拷贝数组内容,从而比较高效。

4.数组练习

4.1数组转字符串

代码示例

import java.util.Arrays;

int[] arr = {1,2,3,4,5,6};

String newArr = Arrays.toString(arr);
System.out.println(newArr);

//执行结果
[1, 2, 3, 4, 5, 6]

使用这个方法后续打印数组就更方便一些。

Java中提供了java.util.Arrays;包,其中包含了一些操作数组的常用方法。

我们实现一个自己版本的数组转字符串

public static String myToString(int[] array){
    if(array==null) return "null";
    String str="[";
    for (int i = 0; i < array.length ; i++) {
        str=str+array[i];
        //除了最后一个元素之外,其他元素后面都要加上","
        if(i!= array.length-1){
            str=str+",";
        }
    }
    str=str+"]";
    return str;
}//[1,2,3,4,5]

public static void main(String[] args) {
    int[] array={1,2,3,4,5};
    System.out.println(myToString(array));
}

4.2数组拷贝

代码示例1

public static int[] copyArray(int[] array){
    int[] copy=new int[array.length];
    for (int i = 0; i < array.length; i++) {
        copy[i]=array[i];
    }
    return copy;
}

public static void main(String[] args) {
    int[] array={1,2,3,4,5,6};
    int[] ret=copyArray(array);
    System.out.println(Arrays.toString(ret));
}

代码示例2

public static void main(String[] args) {
    int[] array={1,2,3,4,5,6};
    int[] ret=Arrays.copyOf(array,array.length*2);
    System.out.println(Arrays.toString(ret));
}

代码示例3

public static void main(String[] args) {
    int[] array={1,2,3,4,5,6};
    int[] ret=Arrays.copyOfRange(array,1,3);//[1,3)
    System.out.println(Arrays.toString(ret));
}

代码示例4

public static void main(String[] args) {
    int[] array={1,2,3,4,5,6};
    int[] copy=new int[array.length];
    System.arraycopy(array,0,copy,0,array.length);
    System.out.println(Arrays.toString(copy));
}//C++/C 已经实现了,特点:快

代码示例5

public static void main(String[] args) {
    int[] array={1,2,3,4,5,6};
    int[] copy=array.clone();
    System.out.println(Arrays.toString(copy));
}//产生一个副本

4.3找数组中的最大元素

给定一个整型数组,找到其中的最大元素(找最小元素同理)

代码示例

public static int maxNum(int[] array){
    if(array==null) return -1;// 业务上的处理
    if(array.length==0) return -1;
    int max=array[0];
    for (int i = 0; i < array.length; i++) {
        if(max<array[i]){
            max=array[i];
        }
    }
    return max;
}
    
public static void main(String[] args) {
    int[] array={12,8,1,2,10};
    maxNum(array);
    System.out.println(maxNum(array));
}

//执行结果
12

4.4求数组中元素的平均值

给定一个整型数组,求平均值

代码示例

public static double avg(int[] arr){
    int sum=0;
    for (int x : arr) {
        sum += x;
    }
    return (double)sum/(double)arr.length;
}

public static void main(String[] args) {
    int[] array={1,2,3,4,5,6};
    System.out.println(avg(arr));
}

//执行结果
3.5

注意事项:结果要用double来表示。

4.5查找数组中指定元素(顺序查找)

给定一个数组,再给定一个元素,找出该元素在数组中的位置。

代码示例

public static int findNum(int[] array,int key){
    for (int i = 0; i < array.length; i++) {
        if(array[i]==key){
            return i;
        }
    }
    return -1;// 因为数组的下标 不可能存在负数
}

public static void main(String[] args) {
    int[] array={1,9,4,2,15,17};
    System.out.println(findNum(array,2));
}

//执行结果
3

4.6查找数组中指定元素(二分查找)

针对有序数组,可以使用更高效的二分查找。

以升序数组为例,二分查找的思路是先取中间位置的元素,看要找的值比中间元素大还是小,如果小,就去左边找;否则就去右边找。

代码示例

public static int binarySearch(int[] array,int key){
    int left=0;
    int right=array.length-1;
    while(left<=right){
        int mid=(left+right)/2;
        if(array[mid]>key){