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

Java中的Arrays,这一篇就够了

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

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

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

常用方法

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

数组拷贝的4种方法

1. for循环

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

2. clone

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

protected native Object clone() throws CloneNotSupportedException;

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

3. System.arraycopy()

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

4. Arrays.copyof()

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

结语

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

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

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

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

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

标签:
  • 热门焦点
  • 中兴AX5400Pro+上手体验:再升级 双2.5G网口+USB 3.0这次全都有

    2021年11月的时候,中兴先后发布了两款路由器产品,中兴AX5400和中兴AX5400 Pro,从产品命名上就不难看出这是隶属于同一系列的,但在外观设计上这两款产品可以说是完全没一点关系
  • 7月安卓手机性价比榜:努比亚+红魔两款新机入榜

    7月登场的新机有努比亚Z50S Pro和红魔8S Pro,除了三星之外目前唯二的两款搭载超频版骁龙8Gen2处理器的产品,而且努比亚和红魔也一贯有着不错的性价比,所以在本次的性价比榜单
  • 线程通讯的三种方法!通俗易懂

    线程通信是指多个线程之间通过某种机制进行协调和交互,例如,线程等待和通知机制就是线程通讯的主要手段之一。 在 Java 中,线程等待和通知的实现手段有以下几种方式:Object 类下
  • 把LangChain跑起来的三个方法

    使用LangChain开发LLM应用时,需要机器进行GLM部署,好多同学第一步就被劝退了,那么如何绕过这个步骤先学习LLM模型的应用,对Langchain进行快速上手?本片讲解3个把LangChain跑起来
  • 让我们一起聊聊文件的操作

    文件【1】文件是什么?文件是保存数据的地方,是数据源的一种,比如大家经常使用的word文档、txt文件、excel文件、jpg文件...都是文件。文件最主要的作用就是保存数据,它既可以保
  • 本地生活这块肥肉,拼多多也想吃一口

    出品/壹览商业 作者/李彦编辑/木鱼拼多多也看上本地生活这块蛋糕了。近期,拼多多在App首页&ldquo;充值中心&rdquo;入口上线了本机生活界面。壹览商业发现,该界面目前主要
  • 7月4日见!iQOO 11S官宣:“鸡血版”骁龙8 Gen2+200W快充加持

    上半年已接近尾声,截至目前各大品牌旗下的顶级旗舰都已悉数亮相,而下半年即将推出的顶级旗舰已经成为了数码圈爆料的主流,其中就包括全新的iQOO 11S系
  • 电博会与软博会实现"线下+云端"的双线融合

    在本次“电博会”与“软博会”双展会利好条件的加持下,既可以发挥展会拉动人流、信息流、资金流实现快速交互流动的作用,继而推动区域经济良性发展;又可以聚
  • 外交部:美方应停止在网络安全问题上不负责任地指责他国

      中国外交部今天(16日)举行例行记者会。会上,有记者问,美国情报官员称,他们正在阻拦来自中国以及其他国家的黑客获取相关科研成果。 中方对此有何评论?对此
Top