阅读kvstore\ArrayWrappers.java(1)
用来包装数组对象,将数组对象包装成一个能够比较的东东。
class ArrayWrappers {
public static Comparable<Object> forArray(Object a) {}
private static class ComparableIntArray implements Comparable<ComparableIntArray> {}
private static class ComparableLongArray implements Comparable<ComparableLongArray> {}
private static class ComparableByteArray implements Comparable<ComparableByteArray> {}
private static class ComparableObjectArray implements Comparable<ComparableObjectArray> {}
}
看看测试代码怎么用的。
public class ArrayWrappersSuite {
@Test
public void testGenericArrayKey() {
byte[] b1 = new byte[] { 0x01, 0x02, 0x03 };
byte[] b2 = new byte[] { 0x01, 0x02 };
int[] i1 = new int[] { 1, 2, 3 };
int[] i2 = new int[] { 1, 2 };
String[] s1 = new String[] { "1", "2", "3" };
String[] s2 = new String[] { "1", "2" };
// 这里主要使用 ArrayWrappers.forArray() 函数, 得到一个Comparable<Object>对象 得到的对象可以用来比较
// 类型和值都一样才会比较成功
assertEquals(ArrayWrappers.forArray(b1), ArrayWrappers.forArray(b1));
assertNotEquals(ArrayWrappers.forArray(b1), ArrayWrappers.forArray(b2));
assertNotEquals(ArrayWrappers.forArray(b1), ArrayWrappers.forArray(i1));
// 虽然都是1,2,3 但是类型不一样
assertNotEquals(ArrayWrappers.forArray(b1), ArrayWrappers.forArray(s1));
assertEquals(ArrayWrappers.forArray(i1), ArrayWrappers.forArray(i1));
assertNotEquals(ArrayWrappers.forArray(i1), ArrayWrappers.forArray(i2));
assertNotEquals(ArrayWrappers.forArray(i1), ArrayWrappers.forArray(b1));
assertNotEquals(ArrayWrappers.forArray(i1), ArrayWrappers.forArray(s1));
assertEquals(ArrayWrappers.forArray(s1), ArrayWrappers.forArray(s1));
assertNotEquals(ArrayWrappers.forArray(s1), ArrayWrappers.forArray(s2));
assertNotEquals(ArrayWrappers.forArray(s1), ArrayWrappers.forArray(b1));
assertNotEquals(ArrayWrappers.forArray(s1), ArrayWrappers.forArray(i1));
assertEquals(0, ArrayWrappers.forArray(b1).compareTo(ArrayWrappers.forArray(b1)));
assertTrue(ArrayWrappers.forArray(b1).compareTo(ArrayWrappers.forArray(b2)) > 0); //两个不同的数组比大小 {1,2,3} 比 {1,2}要大
assertEquals(0, ArrayWrappers.forArray(i1).compareTo(ArrayWrappers.forArray(i1)));
assertTrue(ArrayWrappers.forArray(i1).compareTo(ArrayWrappers.forArray(i2)) > 0);
assertEquals(0, ArrayWrappers.forArray(s1).compareTo(ArrayWrappers.forArray(s1)));
assertTrue(ArrayWrappers.forArray(s1).compareTo(ArrayWrappers.forArray(s2)) > 0);
}
}
assertEquals是怎么做比较的?
所以 forArray返回的 Comparable<Object> 这个对象肯定对 equals函数做了重构,这样数组返回的对象比较时候使用的是自己重构后的equals方法
浙公网安备 33010602011771号