亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

詳解Java合并數(shù)組的兩種實(shí)現(xiàn)方式

 更新時(shí)間:2019年04月29日 16:37:59   作者:冷血有情556  
這篇文章主要介紹了Java合并數(shù)組的兩種實(shí)現(xiàn)方式,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

最近在寫(xiě)代碼時(shí)遇到了需要合并兩個(gè)數(shù)組的需求,突然發(fā)現(xiàn)以前沒(méi)用過(guò),于是研究了一下合并數(shù)組的方式,總結(jié)如下。

1.System.arraycopy()方法

(1) 解析

通過(guò)閱讀JDK源碼,我可以知道方法原型如下:

public static native void arraycopy(Object src, int srcPos, Object dest, int destPos, int length);

其中:
src是源數(shù)組
srcPos是源數(shù)組復(fù)制的起始位置
dest是目標(biāo)數(shù)組
destPos是目標(biāo)數(shù)組接收復(fù)制數(shù)據(jù)的起始位置
length是復(fù)制的長(zhǎng)度(源數(shù)組中從復(fù)制起始位置srcPos開(kāi)始需要復(fù)制的長(zhǎng)度)

可以看到,該方法是本地方法,我們不能更深一步的了解其中的原理,但是我們可以知道其作用就是將源數(shù)組從起始位置srcPos開(kāi)始將length長(zhǎng)度的元素復(fù)制到目標(biāo)數(shù)組,目標(biāo)數(shù)組從destPos位置開(kāi)始接收復(fù)制元素。

(2) 示例

String[] aa = {"11","22","33"};
String[] bb = {"44","55","66"};
String[] cc = {"77","88","99"};

// 合并兩個(gè)數(shù)組
String[] dd = new String[aa.length + bb.length];
System.arraycopy(aa, 0, dd, 0, aa.length);
System.arraycopy(bb, 0, dd, aa.length, bb.length);

// 合并三個(gè)數(shù)組
String[] ee = new String[aa.length + bb.length + cc.length];
System.arraycopy(aa, 0, ee, 0, aa.length);
System.arraycopy(bb, 0, ee, aa.length, bb.length);
System.arraycopy(cc, 0, ee, aa.length + bb.length, cc.length);

2.ArrayUtils.addAll()方法

(1) 解析

ArrayUtils工具類(lèi)在apache commons-lang3-3.5中的commons-lang3-3.5.jar(jar包下載地址)中,所以使用之前需要導(dǎo)入這個(gè)包。通過(guò)閱讀其源碼,我們可以發(fā)現(xiàn),其實(shí)addAll()方法本質(zhì)上還是調(diào)用System.arraycopy()方法。

public static <T> T[] addAll(final T[] array1, final T... array2) {
   if (array1 == null) {
     return clone(array2);
   } else if (array2 == null) {
     return clone(array1);
   }
   final Class<?> type1 = array1.getClass().getComponentType();
   @SuppressWarnings("unchecked") // OK, because array is of type T
   final
   // a處
   T[] joinedArray = (T[]) Array.newInstance(type1, array1.length + array2.length);
   System.arraycopy(array1, 0, joinedArray, 0, array1.length);
   try {
     // b處
     System.arraycopy(array2, 0, joinedArray, array1.length, array2.length);
   } catch (final ArrayStoreException ase) {
     // Check if problem was due to incompatible types
     /*
     * We do this here, rather than before the copy because:
     * - it would be a wasted check most of the time
     * - safer, in case check turns out to be too strict
     */
     final Class<?> type2 = array2.getClass().getComponentType();
     if (!type1.isAssignableFrom(type2)) {
       throw new IllegalArgumentException("Cannot store " + type2.getName() + " in an array of "
           + type1.getName(), ase);
     }
     throw ase; // No, so rethrow original
   }
   return joinedArray;
 }

這個(gè)方法關(guān)鍵的兩個(gè)部分就是代碼中標(biāo)注的a、b兩處。a處首先通過(guò)反射的方式定義了一個(gè)長(zhǎng)度為array1、array2長(zhǎng)度之和的數(shù)組joinedArray,然后將array1拷貝到j(luò)oinedArray,b處將array2拷貝到j(luò)oinedArray中。除了這兩處,還有異常處理需要注意,在捕獲異常后,判斷了type1是不是繼承于type2,也就是判斷array1所對(duì)應(yīng)的類(lèi)型是否與array2對(duì)應(yīng)類(lèi)型相同,或者array1所對(duì)應(yīng)的類(lèi)型是否是array2對(duì)應(yīng)類(lèi)型的子類(lèi),否則將出現(xiàn)不兼容的情況。

(2) 示例

// 合并兩個(gè)數(shù)組
String[] ff = ArrayUtils.addAll(aa, bb);

// 將多個(gè)字符串合并到數(shù)組構(gòu)成新數(shù)組
String[] gg = ArrayUtils.addAll(aa, "12", "13");
String[] hh = ArrayUtils.addAll(aa, "12", "13", "14");
String[] ii = ArrayUtils.addAll(aa, "12", "13", "14", "15");

// 合并三個(gè)數(shù)組
String[] jj = ArrayUtils.addAll(aa, bb);
String[] kk = ArrayUtils.addAll(jj, cc);

需要說(shuō)明的是,addAll()的第二個(gè)參數(shù)是可變參數(shù),可以傳入多個(gè)相同類(lèi)型的值,或者一個(gè)該類(lèi)型的數(shù)組。

(3) 錯(cuò)誤處理

我在使用過(guò)程中遇到一個(gè)問(wèn)題,具體如下:
代碼1:

String[] ll = ArrayUtils.addAll(aa, bb, cc);

根據(jù)提示發(fā)現(xiàn),addAll()返回值類(lèi)型是Serializable[],所有不能喝String[]兼容。于是我將代碼改成如下代碼:
代碼2:

ArrayUtils.addAll(aa, bb, cc);

我以為不接收返回值只是合并就不會(huì)報(bào)錯(cuò)了,雖然通過(guò)了編譯,但是運(yùn)行還是報(bào)錯(cuò)了。錯(cuò)誤信息如下:

Exception in thread "main" java.lang.IllegalArgumentException: Cannot store java.io.Serializable in an array of java.lang.String
  at org.apache.commons.lang3.ArrayUtils.addAll(ArrayUtils.java:5084)
  at com.liu.date20170524.MergeArrays.main(MergeArrays.java:44)
Caused by: java.lang.ArrayStoreException
  at java.lang.System.arraycopy(Native Method)
  at org.apache.commons.lang3.ArrayUtils.addAll(ArrayUtils.java:5073)
  ... 1 more

由于當(dāng)時(shí)陷入了慣性思維,認(rèn)為addAll和List等的addAll()方法類(lèi)型,可以將多個(gè)列表(這里是數(shù)組)進(jìn)行合并,所以一直沒(méi)想明白錯(cuò)誤出在哪里。后來(lái)才發(fā)現(xiàn),addAll()的第二個(gè)參數(shù)的類(lèi)型是T,不是T[],所以不能合并兩個(gè)以上的數(shù)組。望各位引以為戒。

參考:http://chabaoo.cn/article/129962.htm

以上所述是小編給大家介紹的Java合并數(shù)組的兩種實(shí)現(xiàn)方式詳解整合,希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!

相關(guān)文章

  • Java編程實(shí)現(xiàn)的二維數(shù)組轉(zhuǎn)置功能示例

    Java編程實(shí)現(xiàn)的二維數(shù)組轉(zhuǎn)置功能示例

    這篇文章主要介紹了Java編程實(shí)現(xiàn)的二維數(shù)組轉(zhuǎn)置功能,結(jié)合實(shí)例形式分析了Java二維數(shù)組的遍歷、運(yùn)算、賦值等實(shí)現(xiàn)轉(zhuǎn)置的相關(guān)操作技巧,需要的朋友可以參考下
    2018-01-01
  • Springboot簡(jiǎn)單熱部署實(shí)現(xiàn)步驟解析

    Springboot簡(jiǎn)單熱部署實(shí)現(xiàn)步驟解析

    這篇文章主要介紹了Springboot簡(jiǎn)單熱部署實(shí)現(xiàn)步驟解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-12-12
  • SpringBoot項(xiàng)目中配置application.yml中server.port不生效的問(wèn)題

    SpringBoot項(xiàng)目中配置application.yml中server.port不生效的問(wèn)題

    這篇文章主要介紹了SpringBoot項(xiàng)目中配置application.yml中server.port不生效的問(wèn)題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-12-12
  • 分享Java性能調(diào)優(yōu)的11個(gè)實(shí)用技巧

    分享Java性能調(diào)優(yōu)的11個(gè)實(shí)用技巧

    這些建議中的大多數(shù)都是基于Java的,但是也不一定,也有一些是可以應(yīng)用于所有的應(yīng)用程序和編程語(yǔ)言的。在我們分享基于Java的性能調(diào)優(yōu)技巧之前,讓我們先討論一下這些通用的性能調(diào)優(yōu)技巧
    2017-11-11
  • SpringBoot結(jié)合FreeMarker視圖渲染的實(shí)現(xiàn)

    SpringBoot結(jié)合FreeMarker視圖渲染的實(shí)現(xiàn)

    FreeMarker它允許開(kāi)發(fā)人員使用模板和數(shù)據(jù)來(lái)生成輸出文本,如HTML網(wǎng)頁(yè)、電子郵件、配置文件和源代碼等,本文主要介紹了SpringBoot結(jié)合FreeMarker視圖渲染的實(shí)現(xiàn),感興趣的可以了解一下
    2024-03-03
  • SpringCloud OpenFeign超詳細(xì)講解模板化遠(yuǎn)程通信的實(shí)現(xiàn)

    SpringCloud OpenFeign超詳細(xì)講解模板化遠(yuǎn)程通信的實(shí)現(xiàn)

    這篇文章主要介紹了SpringCloudSpringboot集成OpenFeign實(shí)現(xiàn)模板化遠(yuǎn)程通信,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2022-07-07
  • Spring Boot與React集成的示例代碼

    Spring Boot與React集成的示例代碼

    這篇文章主要介紹了Spring Boot與React集成的示例代碼,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-11-11
  • SpringBoot中yml多環(huán)境配置的3種方法

    SpringBoot中yml多環(huán)境配置的3種方法

    這篇文章主要給大家介紹了SpringBoot中yml多環(huán)境配置的3種方法,文中有詳細(xì)的代碼示例供大家參考,對(duì)大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下
    2023-10-10
  • Java中的AQS框架原理詳解

    Java中的AQS框架原理詳解

    這篇文章主要介紹了Java中的AQS框架原理詳解,AQS核心思想是,如果被請(qǐng)求的共享資源(state)空閑,則將當(dāng)前請(qǐng)求資源的線程設(shè)置為有效的工作線程,并且將共享資源設(shè)置為鎖定狀態(tài),需要的朋友可以參考下
    2023-12-12
  • 使用socket實(shí)現(xiàn)網(wǎng)絡(luò)聊天室和私聊功能

    使用socket實(shí)現(xiàn)網(wǎng)絡(luò)聊天室和私聊功能

    這篇文章主要介紹了使用socket實(shí)現(xiàn)網(wǎng)絡(luò)聊天室和私聊功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-12-12

最新評(píng)論