有没有办法比较Java(或两个不同数组)中char数组的两个区域而不在堆中创建新对象?
我知道我可以这样做:
char[] region1 = Arrays.copyOfRange(bigbuffer,0,100);
char[] region2 = Arrays.copyOfRange(bigbuffer,100,200);
if (Arrays.equals(region1,region2))
System.out.printf("Equal");
但是这将创建两个对象,以后必须进行垃圾回收并遍历数组缓冲区两次。如果有一个功能可以比较这两个区域,那将会好得多。我想象这样的事情:
if (Arrays.compareRegions(bigBuffer,0,100,bigBuffer,100,200)==0)
System.out.printf("Equal");
Java中有这样的东西吗?
答案 0 :(得分:2)
您不必创建新阵列 - 单个for
循环就足够了。
for(int i=0; i < 100; i++) {
if (bigbuffer[i] != bigbuffer[i+100]) {
System.out.println("Not Equal");
break;
}
}
答案 1 :(得分:1)
快速搜索并且至少在Java和最着名的帮助程序库(Commons Lang和Guava)中似乎没有内置解决方案。
自己写一个应该是微不足道的。这是一个样本(在伪代码中)进行相等比较(而不是比较)。增强它以满足您的需求
public static <T> boolean arrayEquals(T[] arr1, int startIndex1, T[] arr2, int startIndex2, int lengthToCompare) {
if (arr1 == null || arr2 == null) {
throws new NullPointerException();
}
if (arr1.length - lengthToCompare < startIndex1
|| arr2.length - lengthToCompare < startIndex2) {
throw new ArrayIndexOutOfBoundException();
}
// some extra checking like startIndex > 0 etc.
// This is the real logic anyway
for (int i = 0; i < lengthToCompare; ++i) {
if (! Objects.equals(arr1[startIndex + i], arr2[startIndex2 + i]) {
return false;
}
}
return true;
}
如果你不处理原始类型数组,另一种只在堆中创建几个小对象的方法是:
Foo[] arr1 = ....;
Foo[] arr2 = ....;
if (Arrays.asList(arr1).subList(0,100).equals(
Arrays.asList(arr2).subList(100,200)) {
....
}
这取决于以下属性:
Arrays.asList()
返回List
impl,由输入数组内部备份subList()
返回原始列表的视图,而不是副本