首页 > 编程知识 正文

java合并数组,java spi详解

时间:2023-05-05 16:14:45 阅读:180172 作者:1344

详细理解Java统一数组的两种实现方法

2020-7-27|发布|

复制链接

摘录:最近编写代码时需要合并两个数组,突然发现以前不用了,讨论了合并数组的方法,总结如下。 1.System.arraycopy ) )方法1 )通过阅读解析JDK源代码,您可以看到该方法的原型如下所示:

` ` ` java

publicstaticnativevoidarraycopy (obje .

最近编写代码时需要合并两个数组,突然发现以前没有用过,于是研究合并数组的方法,总结如下。 1.System.arraycopy ) )方法1 )通过阅读解析JDK源代码,您可以看到该方法的原型如下所示:

` ` ` java

publicstaticnativevoidarraycopy (object src,int srcPos,Object dest,int destPos,int length );

``````

其中:

src是源数组

srcPos是源数组复制的开始位置

dst是目标数组

destPos是目标数组接收复制数据的开始位置

length是复制的长度(源数组中必须从目标srcPos复制的长度),此方法是本地方法,虽然无法更好地理解其原理,但其作用是将源数组从目标srcPos复制到其中)2)例

` ` ` java

String[] aa={'11 ',' 22 ',' 33'};

String[] bb={'44 ',' 55 ',' 66'};

String[] cc={'77 ',' 88 ',' 99'};

//组合两个数组

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 );

//组合三个数组

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工具类为apache commons-lang3-3.5的commons-lang3-3.5.jar(jar软件包下载到)

` ` ` java

公共静态t [ ] addall (finalt [ ] array 1,final T. array2) {

if (阵列1==null ) {

返回克隆(阵列2;

} else if (阵列2==null ) )。

返回克隆(阵列1;

() ) ) ) )。

final classtype1=array1. getclass ().getComponentType );

@suppresswarnings('unchecked ' )//OK,because array is of type T

最终

//a处

T[] joinedArray=(T[] ) Array.newInstance(type1,array1.length array2.length );

system.arraycopy (array 1,0,joinedArray,0,array1.length );

try {

//b处

system.arraycopy (array 2,0,joinedArray,array1.length,array2.length );

} catch (finalarraystoreexceptionase )

//checkifproblemwasduetoincompatibletypes

/*

* We do this here,ratherthanbeforethecopybecause :

*-itwouldbeawastedcheckmostofthetime

* - safer,incasecheckturnsouttobetoostrict

*/

final classtype2=array2. getclass ().getComponentType );

if (! type1.isassignablefrom(type2) }

thrownewillegalargumentexception (' cannot store ' type2. getname ' in an array of ) )。

type1.getName (,ase );

() ) ) ) )。

throw ase; //No,so rethrow original

() ) ) ) )。

return joinedArray;

() ) ) ) )。

``````

该方法的两个重要部分是代码中标记的a、b两个地方。 在a中,首先通过反射定义了数组,该数组为数组joinedArray1、array2的长度之和,然后将array1复制到joinedArray,在b中将array2复制到joinedArray。 除了这两个地方以外,还需要注意例外处理。 捕获异常后,确定了type1是否由type2继承,即对应于array1的类型是否与对应于array2的类型相同,或者对应于array1的类型是否是对应于array2的类型的子类。 否则,可能会不兼容。 )2)例

` ` ` java

//组合两个数组

string [ ] ff=array utils.addall (aa,bb );

//将多个字符串合并到数组中以构成新数组

string [ ] gg=array utils.addall (aa,' 12 ',' 13 ' );

string [ ] hh=array utils.addall (aa,' 12 ',' 13 ',' 14 ' );

string [ ] ii=array utils.addall (aa,' 12 ',' 13 ',' 14 ',' 15 ' );

//组合三个数组

String[]高兴的叔叔=Arrayutils.addall(aa,bb );

String[] kk=ArrayUtils.addAll (快乐叔叔,抄送);

``````

addAll ()的第二个参数是可变参数,可以传递多个相同类型的值,也可以传递一个该类型的数组。 )3)错误处理我在使用中遇到了一个问题。 具体情况如下。

代码1 :

` ` ` java

string [ ] ll=array utils.addall (aa、bb、cc );

``````

提示中,addAll ()的返回类型为Serializable[] ),并与String[] )兼容。 所以我把代码改为:

代码2 :

` ` ` java

arrayutils.addall(aa、bb、cc );

``````

我以为只合并而不接收返回值不会报告错误,但编译通过了,但执行报告了错误。 错误消息如下所示。

` ` ` java

exceptioninthread ' main ' Java.lang.illegalargumentexception : cannotstorejava.io.serializableinanarrrayofjava.land

atorg.Apache.com mons.lang3. array utils.addall (array utils.Java 33605084 ) ) ) ) ) ) )。

atcom.Liu.date 2017 05 24.merge arrays.main (merge arrays.Java :44 ) )。

caused by : Java.lang.arraystoreexception

at Java.lang.system.arraycopy (native method ) )。

atorg.Apache.com mons.lang3. array utils.addall (array utils.Java 33605073 ) ) ) ) ) ) )。

. 1模式

``````

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。