文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Java中的Arrays,这一篇就够了

2024-11-30 00:00

关注

JDK中提供了一个专门用于操作数组的工具类,即Arrays类,位于java.util 包中。

常用方法

返回类型

方法

说明

String

toString(array)

将数组array转换成字符串

void

sort(array)

对数组进行升序排列。注意:排序算法是由Vladimir Yaroslavskiy,Jon Bentley和Joshua Bloch提供的双轴快速排序。

void

fill(arr,val)

将数组arr全部元素赋值为val

boolean

equals(arr1,arr2)

判断两个数组是否相等

与arr类型相同

copyOf(arr,length)

将数组arr复制成一个长度为length的新数组

int

binarySearch(arr, val)

查询元素val在arr中的下标值

示例代码

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);
    }
}

运行结果:

字符串:[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@14fcc96
c:[I@bcbc
ab相等?false
bc相等?true
d:[3,5,7,8,54,23,9]d:[I@671416b:[I@14fcc96
下標是:1

源码解析

将数组array转换成字符串

public static String toString(int[] a)

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)

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)

public static  T[] copyOf(U[] original, int newLength, Class 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一个个复制高。

深复制与浅复制

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

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();
    }

}

可以看到,源数组第0个元素改变,并不会影响到目标数组。

多维数组

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();
 }
}

源数组改变后,目标数组也跟改变了,这就是浅复制

数组拷贝的4种方法

1. for循环

使用for循环自己实现数组的复制

2. clone

克隆方法我们在数组中是找不到的,它是object的方法,我们先看看源码

protected native Object clone() throws CloneNotSupportedException;

看到了修饰符native,说明是由c或者c++实现的,它的优点是速度快,它返回了object对象,所以使用的时候需要用对象接收返回值。

3. System.arraycopy()

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

4. Arrays.copyof()

在方法内部调用了System.arraycopy(),相当于换了名字。

结语

本次我们介绍了Java中的Arrays的常用方法,Arrays如何去操作数组、拷贝数组和打印数组的方法。

来源:Java技术指北内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯