Java 基础之(十一)一维数组(补充)

数组的复制

在程序中,经常需要复制一个数组或一个数组的一部分。这种情况下可能要去尝试用赋值语句(=),如下所示:

int[] a = {1,3,5,7};
int[] b = new int[5];
b = a;

该语句并不能将a引用的数组内容复制给b,而只是将a的引用值复制给了b。在赋值语句之后,a和b都将指向同一个数组,即a引用所指向的数组。b原本指向的数组不能再被引用,就变成了垃圾,将被系统回收。

在Java中国,复制数组有三种方法:

  • 使用循环语句逐个复制数组中的元素
  • 使用System类中的静态方法arraycopy
  • 使用clone方法复制数组

1)可以使用循环将原数组中的每个元素复制到目标数组中的对应元素。例如,下述代码将使用for循环将sourceArray赋值给targetArray:

public class TestTwo {

    public static void main(String[] args){
        int[] sourceArray = {1,3,5,7,9};
        int[] targetArray = new int[sourceArray.length];

        for(int i = 0;i<sourceArray.length;i++){
            targetArray[i] = sourceArray[i];
            System.out.print(" "+targetArray[i]);
        }

    }

}
输出结果:
 1 3 5 7 9

2)使用System类中的静态方法arraycopy复制数组。arraycopy的语法格式如下:

public static void arraycopy(Object src,
                             int srcPos,
                             Object dest,
                             int destPos,
                             int length)
参数解释:
    src - 源数组.
    srcPos - 在原数组中的起始位置.
    dest - 目标数组.
    destPos - 目标数组的起始位置.
    length - 复制的数组元素个数.

例如,以下代码是将源数组的前三个元素复制给目标数组的后三个元素:

public class TestTwo {

    public static void main(String[] args){
        int[] sourceArray = {1,3,5,7,9};
        int[] targetArray = new int[sourceArray.length];

        System.arraycopy(sourceArray, 0, targetArray, 2, 3);
        System.out.print(Arrays.toString(targetArray));

    }

}
输出结果:
[0, 0, 1, 3, 5]

给方法传递数组

数组可以作为参数传递给方法。例如,下面的例子就是一个打印int数组中元素的方法。

public static void printArray(int[] array) {
  for (int i = 0; i < array.length; i++) {
    System.out.print(array[i] + " ");
  }
}

下面例子调用printArray方法打印出 3,1,2,6,4和2:

printArray(new int[]{3, 1, 2, 6, 4, 2});

数组作为函数的返回值

方法也可以返回一个数组。例如下面的方法返回一个与原数组顺序相反的数组:

public class TestTwo {
    public static void main(String[] args){
        int[] list = {1,3,5,7,9};

        int[] list2 = reverse(list);
        System.out.print(Arrays.toString(list2));
    }

    private static int[] reverse(int[] list) {
        // TODO Auto-generated method stub
        int[] result = new int[list.length];
        for(int i = 0,j = result.length-1;i<list.length;i++,j--){
            result[j] = list[i];

        }
        return result;
    }
}
输出结果:
[9, 7, 5, 3, 1]

可变长参数列表

可以把类型相同但个数可变的参数传给方法。方法中的参数声明如下:

typeName...parameterName(类型名...参数名)

在方法声明中,指定类型后紧跟着省略号(…)。只能给方法中指定一个可变长参数,同时该参数必须是最后一个参数。
Java将可变长参数当成数组对待。可以将一个数组或可变的参数个数传递给可变长参数。当用可变的参数个数调用方法时,Java会创建一个数组并把参数传给它。下列程序将打印出个数不定的数列中的最大值:

printMax(34,3,3,2,56.5);
printMax(new double[]{1,2,3});
private static void printMax(double...numbers) {
        // TODO Auto-generated method stub
        if(numbers.length == 0){
            System.out.print("No argument passed");
            return;
        }
        double result = numbers[0];
        for(int i = 1;i < numbers.length;i++){
            if(numbers[i] > result){
                result = numbers[i];
            }
        }
        System.out.println("The max value is" + result);
    }
输出结果:
The max value is 56.5
The max value is 3.0

Arrays类

为实现数组的排序和查找、数组的比较和对数组填充元素,java.util.Arrays包括各种各样的静态方法。具有以下功能:

  • 给数组赋值:通过fill方法。
  • 对数组排序:通过sort方法,按升序。
  • 比较数组:通过equals方法比较数组中元素值是否相等。
  • 查找数组元素:通过binarySearch方法能对排序好的数组进行二分查找法操作。

具体说明请查看下表:
这里写图片描述

  1. 使用sort方法自动升序排序
    调用sort(list)对整个数组进行排序。
int[] list = {10,1,9,2,6,-5};
Arrays.sort(list);
System.out.print(Arrays.toString(list));
输出结果:
[-5,1,2,6,9,10]

调用sort(chars,1,5)对从chars[1]到chars[5-1]的部分数组排序。

char[] chars = {'d','b','z','x','y','i'};
Arrays.sort(chars,1,5);
System.out.print(Arrays.toString(chars));
输出结果:
[d, b, x, y, z, i]
  1. 使用二分查找法(binarySearch方法)在数组中查找关键字。

数组必须提前按增序排列好。返回的值是关键字所对应的下标。

int[] list = {-5,1,4,5,8,9,10};
System.out.print("the index of key is "+ Arrays.binarySearch(list, 8));
输出结果:
the index of key is 4
char[] chars = {'b','d','i','x','y','z'};
System.out.print("the index of key is "+ Arrays.binarySearch(chars, 'i'));
输出结果:
the index of key is 2
  1. 使用equals方法检测两个数组是否相等。在下面的代码中,list1和list2相等,list2和list3不相等。
int[] list1 = {1,3,5,7,9};
int[] list2 = {1,3,5,7,9};
int[] list3 = {2,4,6,8,10};
System.out.println(Arrays.equals(list1, list2));
System.out.print(Arrays.equals(list2, list3));
输出结果:
true
false
  1. 使用fill方法填充整个数组或部分数组。
    例如,下面代码将5填充到list1中,将8填充到list3[1]和list3[3-1]中。
int[] list1 = {1,3,5,7,9};
int[] list3 = {2,4,6,8,10};
Arrays.fill(list1, 5);
Arrays.fill(list3, 1, 3, 8);
System.out.println(Arrays.toString(list1));
System.out.println(Arrays.toString(list3));
输出结果:
[5, 5, 5, 5, 5]
[2, 8, 8, 8, 10]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值