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

Java中的Arrays,这一篇就够了

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

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

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

常用方法

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

数组拷贝的4种方法

1. for循环

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

2. clone

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

protected native Object clone() throws CloneNotSupportedException;

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

3. System.arraycopy()

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

4. Arrays.copyof()

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

结语

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

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

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

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

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

标签:
  • 热门焦点
  • K60至尊版狂暴引擎2.0加持:超177万跑分斩获性能第一

    Redmi的后性能时代战略发布会今天下午如期举办,在本次发布会上,Redmi公布了多项关于和联发科的深度合作,以及新机K60 Ultra在软件和硬件方面的特性,例如:“K60 至尊版,双芯旗舰
  • CSS单标签实现转转logo

    转转品牌升级后更新了全新的Logo,今天我们用纯CSS来实现转转的新Logo,为了有一定的挑战性,这里我们只使用一个标签实现,将最大化的使用CSS能力完成Logo的绘制与动画效果。新logo
  • 三分钟白话RocketMQ系列—— 如何发送消息

    我们知道RocketMQ主要分为消息 生产、存储(消息堆积)、消费 三大块领域。那接下来,我们白话一下,RocketMQ是如何发送消息的,揭秘消息生产全过程。注意,如果白话中不小心提到相关代
  • 腾讯盖楼,字节拆墙

    来源 | 光子星球撰文 | 吴坤谚编辑 | 吴先之&ldquo;想重温暴刷深渊、30+技能搭配暴搓到爽的游戏体验吗?一起上晶核,即刻暴打!&rdquo;曾凭借直播腾讯旗下代理格斗游戏《DNF》一
  • 签约井川里予、何丹彤,单视频点赞近千万,MCN黑马永恒文希快速崛起!

    来源:视听观察永恒文希传媒作为一家MCN公司,说起它的名字来,可能大家会觉得有点儿陌生,但是说出来下面一串的名字之后,或许大家就会感到震惊,原来这么多网红,都签约这家公司了。根
  • ESG的面子与里子

    来源 | 光子星球撰文 | 吴坤谚编辑 | 吴先之三伏大幕拉起,各地高温预警不绝,但处于厄尔尼诺大&ldquo;烤&rdquo;之下的除了众生,还有各大企业发布的ESG报告。ESG是&ldquo;环境保
  • 华为发布HarmonyOS 4:更好玩、更流畅、更安全

    在8月4日的华为开发者大会2023(HDC.Together)大会上,HarmonyOS 4正式发布。自2019年发布以来,HarmonyOS一直以用户为中心,经历四年多的发展HarmonyOS已
  • iQOO 11S屏幕细节公布:首发三星2K E6全感屏 安卓最好的直屏手机

    日前iQOO手机官方宣布,新一代电竞旗舰iQOO 11S将会在7月4日19:00正式与大家见面。随着发布时间的日益临近,官方关于该机的预热也更加密集,截至目前已
  • 最薄的14英寸游戏笔记本电脑 Alienware X14已可以购买

    2022年1月份在国际消费电子展(CES2022)上首次亮相的Alienware新品——Alienware X14现在已经可以购买了,这款笔记本电脑被誉为世界上最薄的 14 英寸游戏笔
Top