详细理解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模式
``````