Java中数组操作 java.util.Arrays 类常用方法的使用

任何一门编程语言,数组都是最重要和常用的数据结构之一,但不同的语言对数组的构造与处理是不尽相同的。

Java中提供了java.util.Arrays 类能方便地操作数组,并且它提供的所有方法都是静态的。下面介绍一下Arrays类最常用的几个方法。

1. 数组排序

Arrays工具类提供了一个sort方法,只需要一行代码即可完成排序功能。

2. 数组转换为字符串

Arrays提供了一个toString方法,可以直接把一个数组转换为字符串,这样可以方便观察数组里的元素。

//来源:公众号【时光与字节】
//数组排序与转换为字符串
package BaseCode;
import java.util.Arrays;
public class j4_1028_11 {
    public static void main(String[] args) {
        int[] ff= {11,3,25,71,9};
        System.out.print("数组ff未排序: ");
        for(int n:ff)
            System.out.print(n+"  ");
        Arrays.sort(ff); // 对数组进行排序
        System.out.printf("\n数组ff排序后: ");
        for(int n:ff)
            System.out.print(n+"  ");
        //将数组转换为字符串
        System.out.printf("\n数组ff转为字符串: "+Arrays.toString(ff));
    } 
}

运行结果

数组ff未排序:11 3 25 71 9
数组ff排序后:3 9 11 25 71
数组ff转为字符串:[3, 9, 11, 25, 71]

3. 数组元素的填充与替换

Arrays提供了fill方法对数组(或数组指定位置)填充或替换为指定的值。

4. 判断数组是否相同

Arrays.equals可以比较两个数组中的元素是否一样。

//来源:【时光与字节】
//fill方法和equals方法
package BaseCode;
import java.util.Arrays;
public class j4_1028_12 {
    public static void main(String[] args) {
        int[] ff= new int[5];
        Arrays.fill(ff, 5);
        System.out.print("数组全部元素填充为5: ");
        for(int n:ff)
            System.out.print(n+"  ");
        //将数组从第1个元素至第3个元素填充为7
        //含第1个元素,不含第3个元素
        Arrays.fill(ff,1,3,7);
        System.out.print("\n数组指定位置填充为7: ");
        for(int n:ff)
            System.out.print(n+"  ");
        int[] nn= new int[5];
        Arrays.fill(nn, 5);
        System.out.printf("\nff与nn相同:"+Arrays.equals(ff, nn));
    }
}

运行结果

数组全部元素填充为5:5 5 5 5 5
数组指定位置填充为7:5 7 7 5 5
ff与nn相同:false

5. 复制数组

Arrays类的copyOf()方法和copyRange()方法可以实现对数组的复制。

\color{red}{copyOf(arr, int newlength)}

参数newlength为新数组的长度,即从数组arr的第0个位置开始,直到newlength结束,如果newlength大于arr的长度,后面按默认值填充。

\color{red}{copyOfRange(arr, int formIndex, int toIndex)}

参数formIndex为从数组arr中取元素的开始位置,toIndex为结束位置,但不包括该位置的元素,如toIndex超出arr的长度,后面按默认值填充。

//来源:公众号【时光与字节】
//数组的复制,copyOf与copyOfRange的使用
package BaseCode;
import java.util.Arrays;
public class j4_1028_10 {
    public static void main(String[] args) {
        int[] ff= {1,3,5,7,9};
        //Arrays.copyOf复制数组至指定长度,从0开始
        int[] newff1=Arrays.copyOf(ff, 3);
        int[] newff2=Arrays.copyOf(ff, 6);
        System.out.print("copyOf的使用:\n数组newff1: ");
        for(int n:newff1)
            System.out.print(n+"  ");
        System.out.printf("\n数组newff2: ");
        for(int n:newff2)
            System.out.print(n+"  ");
        //Arrays.copyOfRange第二个参数为开始位置
        //第三个参数为结束位置
        int[] newff3=Arrays.copyOfRange(ff, 1, 4);
        int[] newff4=Arrays.copyOfRange(ff, 1, 7);
        System.out.printf("\ncopyOfRange的使用:\n数组newff3: ");
        for(int n:newff3)
            System.out.print(n+"  ");
        System.out.printf("\n数组newff4: ");
        for(int n:newff4)
            System.out.print(n+"  ");
    }
}

运行结果

copyOf的使用:
数组newff1:1 3 5
数组newff2:1 3 5 7 9 0
copyOfRange的使用:
数组newff3:3 5 7
数组newff4:3 5 7 9 0 0

6. 元素查询

Arrays类的binarySearch 方法可以查询元素出现的位置,返回元素的索引。但是注意,使用binarySearch进行查找之前,必须使用sort进行排序。并且如果数组中有多个相同的元素,查找结果是不确定的。

\color{red}{binarySearch(arr, object key)}

如果key在数组中,则返回搜索值的索引;否则返回-1或者负的插入点值。

所谓插入点值就是第一个比key大的元素在数组中的索引,而且这个索引是从1开始的。

\color{red}{binarySearch(arr, int fromIndex, int endIndex, object key)}

  • fromIndex:指定范围的开始处索引(包含)

  • toIndex:指定范围的结束处索引(不包含)

其搜索结果可分为以下四种情况:

  1. 该搜索键不在范围内,且大于范围(数组)内元素,返回 –(toIndex + 1);

  2. 该搜索键不在范围内,且小于范围(数组)内元素,返回–(fromIndex + 1);

  3. 该搜索键在范围内,但不是数组元素,由1开始计数,返回负的插入点索引值;

  4. 该搜索键在范围内,且是数组元素,由0开始计数,返回搜索值的索引值;

可参看下面的示例代码及注释

//来源:公众号【时光与字节】
//查找数组元素:binarySearch 方法的使用
package BaseCode;
import java.util.Arrays;
public class j4_1028_13 {
    public static void main(String[] args) {
        int[] fn= {1,3,5,7,9};
        Arrays.sort(fn);//查找前先排序
        int cx1=Arrays.binarySearch(fn,5);//返回2 ,找到了关键字,索引从0开始
        //未找到6,返回的是负的插入点值,
        //6在数组中的插入点是元素7的索引,
        //元素7的索引从1开始算就是4,所有返回-4
        int cx2=Arrays.binarySearch(fn,6);//未找到,返回-4,插入点7的索引是4
        int cx3=Arrays.binarySearch(fn,4);//未找到,返回-3,插入点5的索引是3
        System.out.println("不指定查找范围示例:");
        System.out.println("数组fn的内容:"+Arrays.toString(fn));
        System.out.printf("[5]找到:cx1=%d%n", cx1);
        System.out.printf("[6][4]未找到:cx2=%d, cx3=%d%n", cx2,cx3);

        //在数组的指定位置查找元素,参数范围(1,3)包含的数组元素为[3,5]
        //该搜索键不在范围内,且大于范围(数组)内元素,返回 –(toIndex + 1)。
        int cx4=Arrays.binarySearch(fn,1,3,10);
        //该搜索键不在范围内,且小于范围(数组)内元素,返回–(fromIndex + 1);
        int cx5=Arrays.binarySearch(fn,1,3,-3);
        //该搜索键在范围内,但不是数组元素,由1开始计数,返回负的插入点索引值
        int cx6=Arrays.binarySearch(fn,1,3,4);
        //该搜索键在范围内,且是数组元素,由0开始计数,返回搜索值的索引值
        int cx7=Arrays.binarySearch(fn,1,3,5);
        System.out.println("-------------------------");
        System.out.println("用参数指定查找范围示例:");
        System.out.println("第一种情况:cx4= "+cx4);
        System.out.println("第二种情况:cx5= "+cx5);
        System.out.println("第三种情况:cx6= "+cx6);
        System.out.println("第四种情况:cx7= "+cx7);
    }
}

运行结果

不指定查找范围示例:
数组fn的内容:[1, 3, 5, 7, 9]
[5]找到:cx1=2
[6][4]未找到:cx2=-4, cx3=-3


用参数指定查找范围示例:
第一种情况:cx4= -4
第二种情况:cx5= -2
第三种情况:cx6= -3
第四种情况:cx7= 2

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,098评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,213评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,960评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,519评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,512评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,533评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,914评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,574评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,804评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,563评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,644评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,350评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,933评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,908评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,146评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,847评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,361评论 2 342

推荐阅读更多精彩内容

  • 1.遍历数组 遍历数组就是获取数组中的每个元素。通常遍历数组都是使用for循环来实现。下面是遍历一个二维数组 2....
    赵哥窟阅读 636评论 0 0
  • 1.单行注释:“//”2.多行注释:“/ /” if条件语句 1. if(bloolean 表达式){pass;...
    再也不喊饿阅读 562评论 0 0
  • 一、数组简介 数组对于每一门编程语言来说都是重要的数据结构之一,当然不同语言对数组的实现及处理也不尽相同。Java...
    无剑_君阅读 249评论 1 1
  • 四、集合框架 1:String类:字符串(重点) (1)多个字符组成的一个序列,叫字符串。生活中很多数据的描述都采...
    佘大将军阅读 732评论 0 2
  • 文|王不二 这是一个最好的时代,也是一个最坏的时代;这是一个娱乐至胜的时代,也是一个娱乐至死的时代。 花了整整半个...
    旅人还有平凡阅读 412评论 1 22