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

Java中的Arrays,这一篇就够了

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

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

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

常用方法

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

示例代码UNG28资讯网——每日最新资讯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);    }}

运行结果:UNG28资讯网——每日最新资讯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)UNG28资讯网——每日最新资讯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)UNG28资讯网——每日最新资讯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)UNG28资讯网——每日最新资讯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一个个复制高。UNG28资讯网——每日最新资讯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个元素改变,并不会影响到目标数组。UNG28资讯网——每日最新资讯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 ,*/

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

数组拷贝的4种方法

1. for循环

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

2. clone

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

protected native Object clone() throws CloneNotSupportedException;

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

3. System.arraycopy()

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

4. Arrays.copyof()

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

结语

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

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

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

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

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

标签:
  • 热门焦点
  • 影音体验是真的强 简单聊聊iQOO Pad

    大公司的好处就是产品线丰富,非常细分化的东西也能给你做出来,例如早先我们看到了新的vivo Pad2,之后我们又在iQOO Neo8 Pro的发布会上看到了iQOO的首款平板产品iQOO Pad。虽
  • 印度登月最关键一步!月船三号今晚进入环月轨道

    8月5日消息,据印度官方消息,月船三号将于北京时间今晚21时30分左右开始近月制动进入环月轨道。这是该探测器能够成功的最关键步骤之一,如果成功将开始围
  • 摸鱼心法第一章——和配置文件说拜拜

    为了能摸鱼我们团队做了容器化,但是带来的问题是服务配置文件很麻烦,然后大家在群里进行了“亲切友好”的沟通图片图片图片图片对比就对比,简单对比下独立配置中心和k8s作为配
  • Python异步IO编程的进程/线程通信实现

    这篇文章再讲3种方式,同时讲4中进程间通信的方式一、 Python 中线程间通信的实现方式共享变量共享变量是多个线程可以共同访问的变量。在Python中,可以使用threading模块中的L
  • 每天一道面试题-CPU伪共享

    前言:了不起:又到了每天一到面试题的时候了!学弟,最近学习的怎么样啊 了不起学弟:最近学习的还不错,每天都在学习,每天都在进步! 了不起:那你最近学习的什么呢? 了不起学弟:最近在学习C
  • 10天营收超1亿美元,《星铁》比《原神》差在哪?

    来源:伯虎财经作者:陈平安即便你没玩过《原神》,你一定听说过的它的大名。恨它的人把《原神》开服那天称作是中国游戏史上最黑暗的一天,有粉丝因为索尼在PS平台上线《原神》,怒而
  • 冯提莫签约抖音公会 前“斗鱼一姐”消失在直播间

    来源:直播观察提起&ldquo;冯提莫&rdquo;这个名字,很多网友或许听过,但应该不记得她是哪位主播了。其实,作为曾经的&ldquo;斗鱼一姐&rdquo;,冯提莫在游戏直播的年代影响力不输于现
  • iQOO 11S评测:行业唯一的200W标准版旗舰

    【Techweb评测】去年底,iQOO推出了“电竞旗舰”iQOO 11系列,作为一款性能强机,该机不仅全球首发2K 144Hz E6全感屏,搭载了第二代骁龙8平台及144Hz电竞
  • 由于成本持续增加,笔记本产品价格预计将明显上涨

    根据知情人士透露,由于材料、物流等成本持续增加,笔记本产品价格预计将在2021年下半年有明显上涨。进入6月下旬以来,全球半导体芯片缺货情况加剧,显卡、处理器
Top