当前位置:首页 > 科技  > 软件

Java中的Arrays,这一篇就够了

来源: 责编: 时间:2024-04-11 09:06:37 121观看
导读哈喽,大家好,我是了不起。JDK中提供了一个专门用于操作数组的工具类,即Arrays类,位于java.util 包中。常用方法返回类型
方法
说明
String
toString(array)
将数组array转换成字符串
void
sort(array)
对数组进行升序排列。注

哈喽,大家好,我是了不起。2tw28资讯网——每日最新资讯28at.com

JDK中提供了一个专门用于操作数组的工具类,即Arrays类,位于java.util 包中。2tw28资讯网——每日最新资讯28at.com

常用方法

返回类型
2tw28资讯网——每日最新资讯28at.com

方法
2tw28资讯网——每日最新资讯28at.com

说明
2tw28资讯网——每日最新资讯28at.com

String
2tw28资讯网——每日最新资讯28at.com

toString(array)
2tw28资讯网——每日最新资讯28at.com

将数组array转换成字符串
2tw28资讯网——每日最新资讯28at.com

void
2tw28资讯网——每日最新资讯28at.com

sort(array)
2tw28资讯网——每日最新资讯28at.com

对数组进行升序排列。注意:排序算法是由Vladimir Yaroslavskiy,Jon Bentley和Joshua Bloch提供的双轴快速排序。
2tw28资讯网——每日最新资讯28at.com

void
2tw28资讯网——每日最新资讯28at.com

fill(arr,val)
2tw28资讯网——每日最新资讯28at.com

将数组arr全部元素赋值为val
2tw28资讯网——每日最新资讯28at.com

boolean
2tw28资讯网——每日最新资讯28at.com

equals(arr1,arr2)
2tw28资讯网——每日最新资讯28at.com

判断两个数组是否相等
2tw28资讯网——每日最新资讯28at.com

与arr类型相同
2tw28资讯网——每日最新资讯28at.com

copyOf(arr,length)
2tw28资讯网——每日最新资讯28at.com

将数组arr复制成一个长度为length的新数组
2tw28资讯网——每日最新资讯28at.com

int
2tw28资讯网——每日最新资讯28at.com

binarySearch(arr, val)
2tw28资讯网——每日最新资讯28at.com

查询元素val在arr中的下标值
2tw28资讯网——每日最新资讯28at.com

示例代码2tw28资讯网——每日最新资讯28at.com

public class Test {    public static void main(String[] args) {        int a[]={12,20,13,42,72,26,35,10,46,26,53};        int b[]={3,5,7,8,54,23,9};        int c[]={3,5,7,8,54,23,9};         String str=Arrays.toString(a);       //将特定数组转换成字符串        System.out.println("字符串:"+str);                Arrays.sort(a);                      //对数组array的元素进行升序排列        System.out.println("排序后:"+Arrays.toString(a));                 Arrays.fill(a,10);                   //所以元素都赋值成特定值        System.out.println("赋值后:"+Arrays.toString(a));                 boolean boo=Arrays.equals(a,b);      //判断两个数组是否相等(对应位置上的元素是否相等)        boolean boo2=Arrays.equals(b, c);        System.out.println("a:"+a);        System.out.println("b:"+b);        System.out.println("c:"+c);        System.out.println("ab相等?"+boo);        System.out.println("bc相等?"+boo2);                 int d[]=Arrays.copyOf(b,b.length);   //把数组复制成特定长度的数组,与直接赋值(引用传递)不同        System.out.println("d:"+Arrays.toString(d));        System.out.println("d:"+d);        System.out.println("b:"+b);                int i=Arrays.binarySearch(b, 5);     //查询特定因素在数组中的下标        System.out.println("下标是:"+i);    }}

运行结果:2tw28资讯网——每日最新资讯28at.com

字符串:[12,20,13,42,72,26,35,10,46,26,53]排序后:[10,12,13,20,26,26,35,42,46,53,72]賦值后:「10,10,10,10,10,10,10,10,10,10,10]a:[I@1606bf5b:[I@14fcc96c:[I@bcbcab相等?falsebc相等?trued:[3,5,7,8,54,23,9]d:[I@671416b:[I@14fcc96下標是:1

源码解析

将数组array转换成字符串

public static String toString(int[] a)2tw28资讯网——每日最新资讯28at.com

int[] arr = { 24, 69, 80, 57, 13 };System.out.println("排序前:" + Arrays.toString(arr)); public static String toString(int[] a) { //a -- arr -- { 24, 69, 80, 57, 13 }     if (a == null)        return "null"; //说明数组对象不存在    int iMax = a.length - 1; //iMax=4;    if (iMax == -1)        return "[]"; //说明数组存在,但是没有元素。     StringBuilder b = new StringBuilder();    b.append('['); //"["    for (int i = 0; ; i++) {        b.append(a[i]); //"[24, 69, 80, 57, 13"        if (i == iMax)         //"[24, 69, 80, 57, 13]"            return b.append(']').toString();        b.append(", "); //"[24, 69, 80, 57, "    }}

二分查找

public static int binarySearch(int[] a,int key)2tw28资讯网——每日最新资讯28at.com

int[] arr = {13, 24, 57, 69, 80};System.out.println("binarySearch:" + Arrays.binarySearch(arr, 577));public static int binarySearch(int[] a, int key) {    //a -- arr -- {13, 24, 57, 69, 80}    //key -- 577    return binarySearch0(a, 0, a.length, key);}private static int binarySearch0(int[] a, int fromIndex, int toIndex,                                 int key) {    //a -- arr --  {13, 24, 57, 69, 80}    //fromIndex -- 0    //toIndex -- 5    //key -- 577                                                                                                 int low = fromIndex; //low=0    int high = toIndex - 1; //high=4    while (low <= high) {        int mid = (low + high) >>> 1; //mid=2,mid=3,mid=4        int midVal = a[mid]; //midVal=57,midVal=69,midVal=80        if (midVal < key)            low = mid + 1; //low=3,low=4,low=5        else if (midVal > key)            high = mid - 1;        else            return mid; // key found    }    return -(low + 1);  // key not found.}

复制

public static int[] copyOf(int[] original, int newLength)2tw28资讯网——每日最新资讯28at.com

public static <T,U> T[] copyOf(U[] original, int newLength, Class<? extends T[]> newType) {    @SuppressWarnings("unchecked")    T[] copy = ((Object)newType == (Object)Object[].class)        ? (T[]) new Object[newLength]        : (T[]) Array.newInstance(newType.getComponentType(), newLength);    System.arraycopy(original, 0, copy, 0,                     Math.min(original.length, newLength));    return copy;}

可以看到,最终调用的是System.arraycopy()方法,由虚拟机实现,效率自然比用java一个个复制高。2tw28资讯网——每日最新资讯28at.com

深复制与浅复制

  • 当数组为一维数组,且元素为基本类型或String类型时,属于深复制,即原数组与新数组的元素不会相互影响。
  • 当数组为多维数组,或一维数组中的元素为引用类型时,属于浅复制,原数组与新数组的元素引用指向同一个对象。这里说的影响,是两个数组复制后对应的元素。String的特殊是因为它的不可变性。

一维数组,元素为基本类型

public class SystemArrayCopy { public static void main(String[] args) {     String str1 = "aa";     String str2 = "bb";     String str3 = "cc";     String str4 = "dd";      String[] src = {str1, str2, str3, str4};     String[] dest = new String[4];     System.arraycopy(src, 0, dest, 0, 4);     System.out.println("改变前");     print("src = ", src);     print("dest = ", dest);     src[0] = "abcd";     System.out.println("改变后");     print("src = ", src);     print("dest = ", dest);   }    private static void print(String string, String[] arr) {        System.out.print(string);        for (String str : arr) {            System.out.print(str + " ");        }        System.out.println();    }}/*改变前src = aa bb cc dd dest = aa bb cc dd 改变后src = abcd bb cc dd dest = aa bb cc dd */

可以看到,源数组第0个元素改变,并不会影响到目标数组。2tw28资讯网——每日最新资讯28at.com

多维数组

public class SystemArrayCopy { public static void main(String[] args) {     int[] arr1 = {1, 2};     int[] arr2 = {3, 4};     int[] arr3 = {5, 6};     int[] arr4 = {7, 8};     int[][] src = new int[][]{arr1, arr2, arr3, arr4};     int[][] dest = new int[4][];     System.arraycopy(src, 0, dest, 0, 4);     System.out.println("改变前");     print("src = ", src);     print("dest = ", dest);     src[0][0] = 11111;     System.out.println("改变后");     print("src = ", src);     print("dest = ", dest);      } // 简单输出二维int数组的方法 private static void print(String string, int[][] arr) {     System.out.print(string);     for (int[] a : arr) {         for (int i : a) {             System.out.print(i + " ");         }         System.out.print(",");     }     System.out.println(); }}/*改变前src = 1 2 ,3 4 ,5 6 ,7 8 ,dest = 1 2 ,3 4 ,5 6 ,7 8 ,改变后src = 11111 2 ,3 4 ,5 6 ,7 8 ,dest = 11111 2 ,3 4 ,5 6 ,7 8 ,*/

源数组改变后,目标数组也跟改变了,这就是浅复制2tw28资讯网——每日最新资讯28at.com

数组拷贝的4种方法

1. for循环

使用for循环自己实现数组的复制2tw28资讯网——每日最新资讯28at.com

2. clone

克隆方法我们在数组中是找不到的,它是object的方法,我们先看看源码2tw28资讯网——每日最新资讯28at.com

protected native Object clone() throws CloneNotSupportedException;

看到了修饰符native,说明是由c或者c++实现的,它的优点是速度快,它返回了object对象,所以使用的时候需要用对象接收返回值。2tw28资讯网——每日最新资讯28at.com

3. System.arraycopy()

通过上述源码我们看到也是native修饰的,所以底层也是用c或者c++实现的,但是可以看到没有返回值,clone()还需要对返回值进行类型转换,所以它的速度是要比clone()要快的,这也是牛客网的一道题,问的就是四种拷贝哪种是最快的,答案肯定是System.arraycopy()。2tw28资讯网——每日最新资讯28at.com

4. Arrays.copyof()

在方法内部调用了System.arraycopy(),相当于换了名字。2tw28资讯网——每日最新资讯28at.com

结语

本次我们介绍了Java中的Arrays的常用方法,Arrays如何去操作数组、拷贝数组和打印数组的方法。2tw28资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-26-82762-0.htmlJava中的Arrays,这一篇就够了

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: Vue 3高级响应式数据探秘:原理、用法详解与实战示例!

下一篇: 2024 抖音欢笑中国年之AnnieX互动容器创新玩法解析

标签:
  • 热门焦点
Top