怎么制作网站链接手机,怎么做才能让网站人气提升,电脑网址打不开网页怎么办,西安 网站建设 培训学校当涉及到在Java中处理数组时#xff0c;有许多方法可供选择#xff0c;其中一些包括System.arraycopy()、Arrays.copyOf()和Arrays.copyOfRange()。这些方法允许您在不同的数组之间复制数据#xff0c;但它们之间有一些细微的差异。在本篇博客文章中#xff0c;我们将深入探…当涉及到在Java中处理数组时有许多方法可供选择其中一些包括System.arraycopy()、Arrays.copyOf()和Arrays.copyOfRange()。这些方法允许您在不同的数组之间复制数据但它们之间有一些细微的差异。在本篇博客文章中我们将深入探讨这些方法以便您了解何时使用它们以及如何正确使用它们。
System.arraycopy()
System.arraycopy方法是Java中的本地方法其实际实现是由Java虚拟机的底层实现提供的。
public static native void arraycopy(Object src, int srcPos,Object dest, int destPos,int length);参数说明
src源数组srcPos源数组中的起始位置dest目标数组destPos目标数组中的起始位置length要复制的元素个数
System.arraycopy()方法的性能非常高因为它是由底层代码实现的并且能够利用硬件的特性来进行快速的数据复制。它通常比使用循环逐个复制数组元素要快得多。
System.arraycopy() 可以用于向上或向下转型但在使用时要谨慎确保数据类型兼容性和运行时类型检查。如果数据类型不匹配虽然可通过编译但运行时会跑出运行时异常java.lang.ArrayStoreException。最好的做法是尽量避免不必要的类型转换以保持代码的清晰性和可维护性。
示例
public static void main(String[] args) {String[] strArray new String[]{xj1,xj2,xj3,xj4,xj5};String[] strArrayCopy new String[5];System.arraycopy(strArray,0,strArrayCopy,0,3);//向下转型TestEntity[] testArray new TestChildEntity[]{new TestChildEntity(xiuji,xj)} ;TestChildEntity[] testChildArrayCopy new TestChildEntity[2];System.arraycopy(testArray,0,testChildArrayCopy,0,1);System.out.println(Arrays.toString(strArrayCopy));System.out.println(Arrays.toString(testChildArrayCopy));
}
运行结果
[xj1, xj2, xj3, null, null]
[TestChildEntity{nickNamexjnamexiuji}, null]Arrays.copyOf()
语法
不转换类型
copyOf(T[] original, int newLength)转换类型
copyOf(U[] original, int newLength, Class? extends T[] newType)参数说明
original要复制的原始数组。newLength新数组的长度它可以比原始数组的长度长或短。newType新数组的类型是一个Class对象通常是一个数组类。它用于确定新数组的类型。
源码
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;
}SuppressWarnings(unchecked)这个注解用于告诉编译器忽略未经检查的转换警告。因为在这个方法中进行了类型转换所以使用这个注解来抑制警告。 T[] copy ((Object)newType (Object)Object[].class): 这个三元条件运算符它根据newType的类型创建一个新的数组copy。如果newType是Object[].class则创建一个Object类型的新数组否则使用Array.newInstance()方法创建一个新数组其类型由newType的组件类型确定。 System.arraycopy(original, 0, copy, 0,Math.min(original.length, newLength)): System.arraycopy()方法用于将原始数组的元素复制到新数组中。它的参数包括原始数组、原始数组的起始位置0表示从第一个元素开始、目标数组即新数组、目标数组的起始位置0表示从第一个位置开始复制以及要复制的元素数量数量由原始数组长度和newLength中较小的那个确定。
示例
public static void main(String[] args) {String[] strArray new String[]{xj1,xj2,xj3,xj4,xj5};String[] strArrayCopy Arrays.copyOf(strArray,8);//向下转型TestEntity[] testArray new TestChildEntity[]{new TestChildEntity(xiuji,xj)} ;TestChildEntity[] testChildArrayCopy Arrays.copyOf(testArray,3,TestChildEntity[].class);System.out.println(Arrays.toString(strArrayCopy));System.out.println(Arrays.toString(testChildArrayCopy));}运行结果:
[xj1, xj2, xj3, xj4, xj5, null, null, null]
[TestChildEntity{nickNamexjnamexiuji}, null, null]Arrays.copyOfRange()
语法
不转换类型
copyOfRange(U[] original, int from, int toe) 转换类型
copyOfRange(U[] original, int from, int to, Class? extends T[] newType) original这是要复制元素的原始数组。from这是要复制的范围的起始索引。to这是要复制的范围的结束索引不包括在内。newType这是新数组的类型通常是一个数组类。
源码
public static T,U T[] copyOfRange(U[] original, int from, int to, Class? extends T[] newType) {int newLength to - from;if (newLength 0)throw new IllegalArgumentException(from to);SuppressWarnings(unchecked)T[] copy ((Object)newType (Object)Object[].class)? (T[]) new Object[newLength]: (T[]) Array.newInstance(newType.getComponentType(), newLength);System.arraycopy(original, from, copy, 0,Math.min(original.length - from, newLength));return copy;
}int newLength to - from;此行计算新数组的长度基于指定的from和to索引。 if (newLength 0) throw new IllegalArgumentException(from to);此行检查newLength是否为负数即from是否大于to。如果满足此条件它将抛出IllegalArgumentException指示from索引大于to索引。 SuppressWarnings(unchecked)此注解用于抑制未检查的类型转换警告。 T[] copy ((Object)newType (Object)Object[].class) ? (T[]) new Object[newLength] : (T[]) Array.newInstance(newType.getComponentType(), newLength); 此行根据指定的newType创建一个新数组copy。它使用反射来创建所需类型的数组。 如果newType等于Object[].class则创建一个新的Object数组其长度为newLength。 否则它使用Array.newInstance创建一个新的数组该数组的组件类型与newType的组件类型相同长度为newLength。这使您能够创建特定类型的数组。 System.arraycopy(original, from, copy, 0, Math.min(original.length - from, newLength)); 此行使用System.arraycopy执行实际的数组复制操作。它将元素从original数组的from索引开始复制到copy数组的0索引开始的位置。要复制的元素数量由Math.min(original.length - from, newLength)确定确保仅复制指定的范围。
示例
public static void main(String[] args) {String[] strArray new String[]{xj1,xj2,xj3,xj4,xj5};String[] strArrayCopy Arrays.copyOfRange(strArray,2,4);//向下转型TestEntity[] testArray new TestChildEntity[]{new TestChildEntity(xiuji,xj)} ;TestChildEntity[] testChildArrayCopy Arrays.copyOfRange(testArray,0,1,TestChildEntity[].class);System.out.println(Arrays.toString(strArrayCopy));System.out.println(Arrays.toString(testChildArrayCopy));}运行结果:
[xj3, xj4]
[TestChildEntity{nickNamexjnamexiuji}]注意事项
在使用数组复制时需要注意以下几点 如果新数组的长度小于源数组的长度那么新数组将截取源数组的前几个元素。 如果源数组中的元素是对象引用那么新数组中的元素将仍然引用相同的对象这意味着对新数组的修改可能会影响到源数组。 如果源数组包含基本数据类型如int、char等新数组将包含这些基本数据类型的默认值如0或’\0’。
总结
在处理数组时选择合适的复制方法取决于您的具体需求。以下是一些使用这些方法的一些建议
如果您需要高效的底层复制操作并且能够手动计算起始位置和元素数量那么System.arraycopy可能是一个不错的选择。如果您想要创建一个新数组其长度与源数组相同并且将源数组的内容全部复制到新数组中那么Arrays.copyOf是一个方便的选择。如果您需要复制源数组的一部分内容到一个新数组中那么Arrays.copyOfRange是最适合的。
不管您选择哪种方法都可以确保在处理数组时能够更加灵活、高效和安全地进行操作。希望本文能够帮助您更好地理解和使用这些数组复制方法。