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

Java中的Arrays,这一篇就够了

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

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

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

常用方法

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

数组拷贝的4种方法

1. for循环

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

2. clone

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

protected native Object clone() throws CloneNotSupportedException;

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

3. System.arraycopy()

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

4. Arrays.copyof()

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

结语

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

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

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

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

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

标签:
  • 热门焦点
  • MIX Fold3包装盒泄露 新机本月登场

    小米的全新折叠屏旗舰MIX Fold3将于本月发布,近日该机的真机包装盒在网上泄露。从图上来看,新的MIX Fold3包装盒在外观设计方面延续了之前的方案,变化不大,这也是目前小米旗舰
  • 服务存储设计模式:Cache-Aside模式

    Cache-Aside模式一种常用的缓存方式,通常是把数据从主存储加载到KV缓存中,加速后续的访问。在存在重复度的场景,Cache-Aside可以提升服务性能,降低底层存储的压力,缺点是缓存和底
  • 企业采用CRM系统的11个好处

    客户关系管理(CRM)软件可以为企业提供很多的好处,从客户保留到提高生产力。  CRM软件用于企业收集客户互动,以改善客户体验和满意度。  CRM软件市场规模如今超过580
  • Flowable工作流引擎的科普与实践

    一.引言当我们在日常工作和业务中需要进行各种审批流程时,可能会面临一系列技术和业务上的挑战。手动处理这些审批流程可能会导致开发成本的增加以及业务复杂度的上升。在这
  • 当家的盒马,加速谋生

    来源 | 价值星球Planet作者 | 归去来自己&ldquo;当家&rdquo;的盒马,开始加速谋生了。据盒马官微消息,盒马计划今年开放生鲜供应链,将其生鲜商品送往食堂。目前,盒马在上海已经与
  • 阿里大调整

    来源:产品刘有媒体报道称,近期淘宝天猫集团启动了近年来最大的人力制度改革,涉及员工绩效、层级体系等多个核心事项,目前已形成一个初步的&ldquo;征求意见版&rdquo;:1、取消P序列
  • 华为将推出盘古数字人大模型 可帮助用户12小时完成数字人生成

    在今日举行的2023年华为云数字文娱AI创新峰会上,华为云全球Marketing与销售服务总裁石冀琳表示,华为云将在后续推出盘古数字人大模型,可帮助用户12小
  • 支持aptX Lossless无损传输 iQOO TWS 1赛道版发布限时优惠价369元

    2023年7月4日,“无损音质,声动人心”iQOO TWS 1正式发布,支持aptX Lossless无损传输,限时优惠价369元。iQOO TWS 1耳机率先支持端到端aptX Lossless无
  • 英特尔Xe HPG游戏显卡:拥有512EU,单风扇版本

    据10 月 30 日外媒 TheVerge 消息报道,英特尔 Xe HPG Arc Alchemist 的正面实被曝光,不仅拥有 512 EU 版显卡,还拥有 128EU 的单风扇版本。另外,这款显卡 PCB
Top