Java에서 두 개의 프리미티브를 비교 하시겠습니까?
-
08-07-2019 - |
문제
arrays.deepequals (Object [], Object [])에 대해 알고 있지만 원시 유형 (배열 및자가 항폭의 기한 제한 사항에 대해서는 작동하지 않습니다. 이 관련 게시물).
이를 염두에두고 이것이 가장 효율적인 접근법입니까?
boolean byteArrayEquals(byte[] a, byte[] b) {
if (a == null && b == null)
return true;
if (a == null || b == null)
return false;
if (a.length != b.length)
return false;
for (int i = 0; i < a.length; i++) {
if (a[i] != b[i])
return false;
}
return true;
}
해결책
첫 번째 비교를 변경하십시오.
if (a == b)
return true;
이것은 "두 가지 모두"사례를 포착 할뿐만 아니라 "배열 자체를 비교"케이스를 포착합니다.
그러나 더 간단한 대안을 위해 사용하십시오 Arrays.equals
각 원시 유형에 대한 과부하가 있습니다. (구현은 루프에서 배열 길이를 들어 올리는 것을 제외하고는 구현과 매우 유사합니다.
다른 팁
가장 효율적인 것은 도우미 방법을 사용하는 것입니다. 배열 클래스는 더 영리하게 구현 될 수 있기 때문입니다. 이 경우 사용하십시오
Arrays.equals(a, b);
이것이 다른 사람에게 도움이 될지 모르겠지만 이것은 효과가있는 것 같습니다.
if(type == type_BooleanArray) {
boolean eq = Arrays.equals((boolean[]) thisObj, (boolean[]) thatObj);
if(!eq) {
return false;
}
} else if(type == type_ByteArray) {
boolean eq = Arrays.equals((byte[]) thisObj, (byte[]) thatObj);
if(!eq) {
return false;
}
} else if(type == type_ShortArray) {
boolean eq = Arrays.equals((short[]) thisObj, (short[]) thatObj);
if(!eq) {
return false;
}
} else if(type == type_CharArray) {
boolean eq = Arrays.equals((char[]) thisObj, (char[]) thatObj);
if(!eq) {
return false;
}
} else if(type == type_IntArray) {
boolean eq = Arrays.equals((int[]) thisObj, (int[]) thatObj);
if(!eq) {
return false;
}
} else if(type == type_LongArray) {
boolean eq = Arrays.equals((long[]) thisObj, (long[]) thatObj);
if(!eq) {
return false;
}
} else if(type == type_FloatArray) {
boolean eq = Arrays.equals((float[]) thisObj, (float[]) thatObj);
if(!eq) {
return false;
}
} else if(type == type_DoubleArray) {
boolean eq = Arrays.equals((double[]) thisObj, (double[]) thatObj);
if(!eq) {
return false;
}
} else {
if(!thisObj.equals(thatObj)) {
return false;
}
}
보기에 array.equals(otherArray)
a array == otherArray
, 당신이 기대할 수있는 것이 아닙니다.
제휴하지 않습니다 StackOverflow