假设我需要TreeSet使用某些域逻辑排序的元素.通过这个逻辑,一些元素的顺序并不重要,因此比较方法可以返回0,但在这种情况下我无法将它们放入TreeSet.
所以,问:我将从这样的代码中得到什么缺点:
class Foo implements Comparable<Foo>{}
new TreeSet<Foo>(new Comparator<Foo>(){
@Override
public int compare(Foo o1, Foo o2) {
int res = o1.compareTo(o2);
if(res == 0 || !o1.equals(o2)){
return o1.hashCode() - o2.hashCode();
}
return res;
}
});
Run Code Online (Sandbox Code Playgroud)
更新:
好.如果它应该永远是方法之间的一致性equals(),hashcode()并且compareTo(),作为@SPFloyd - seanizer和其他人说.如果它会更好,甚至是很好的,如果我将删除Comparable界面和移动这样的逻辑Comparator(我能做到这一点不破封装)?所以它将是:
class Foo{}
new TreeSet<Foo>(new Comparator<Foo>(){
@Override
public int compare(Foo o1, Foo o2) {
//some logic start
if(strictliBigger(o1, o2)){ return 1;}
if(strictliBigger(o2, o1)){ return -1;}
//some logic …Run Code Online (Sandbox Code Playgroud) 我正在研究源代码,java.util.HashMap我想看看hashcode函数在Entrys 的内部数组(这是一个软件包私有变量)中分配密钥的效果如何.所以我java.util在我的项目中创建了一个名为查看天气I 的软件包可以欺骗编译器认为它是相同的包.令人惊讶的是它工作,我写了以下代码:
package java.util;
public class HashMapExt<K, V> extends HashMap<K, V> implements Map<K, V> {
public static void main(String[] args) {
HashMapExt<Integer, String> mp = new HashMapExt<Integer, String>();
mp.put(1, "Hello");
mp.put(2, "Map");
mp.put(3, "Extention");
mp.printData();
}
void printData() {
System.out.println(Arrays.toString(table));
}
}
Run Code Online (Sandbox Code Playgroud)
它成功编译但在运行时它给出了一个例外:
Exception in thread "main" java.lang.SecurityException: Prohibited package name: java.util
at java.lang.ClassLoader.preDefineClass(Unknown Source)
at java.lang.ClassLoader.defineClass(Unknown Source)
at java.security.SecureClassLoader.defineClass(Unknown Source)
at java.net.URLClassLoader.defineClass(Unknown Source)
at java.net.URLClassLoader.access$000(Unknown Source)
at java.net.URLClassLoader$1.run(Unknown Source)
at …Run Code Online (Sandbox Code Playgroud)