Java 在TreeSet和TreeMap中使用hashCode()和equals()
从下面的代码中,我了解到,对于TreeSet和TreeMap,不需要重写equals()和hashCode()方法,也不需要进行排序和搜索Java 在TreeSet和TreeMap中使用hashCode()和equals(),java,treemap,treeset,Java,Treemap,Treeset,从下面的代码中,我了解到,对于TreeSet和TreeMap,不需要重写equals()和hashCode()方法,也不需要进行排序和搜索 public class ComparableTest implements Comparable<ComparableTest> { private String username; public ComparableTest(String name) { this.username = name;
public class ComparableTest implements Comparable<ComparableTest> {
private String username;
public ComparableTest(String name) {
this.username = name;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public int compareTo(ComparableTest o) {
return username.compareTo(o.getUsername());
}
@Override
public String toString() {
return this.getUsername();
}
@SuppressWarnings("unchecked")
public static void main(String[] args) {
ArrayList<ComparableTest> comparableTestsList = new ArrayList<ComparableTest>();
ArrayList<ComparableTest> comparableTestsList2;
comparableTestsList.add(new ComparableTest("Second Name"));
comparableTestsList.add(new ComparableTest("First name"));
System.out.println("Orignal Array List = " + comparableTestsList);
// making a clone to test this list in Treeset
comparableTestsList2 = (ArrayList<ComparableTest>) comparableTestsList
.clone();
// Sorting the first arraylist which works
Collections.sort(comparableTestsList);
System.out.println("Sorted Array List = " + comparableTestsList);
// searching the first array which does not work as equals method has
// not been overriden
int position = comparableTestsList.indexOf(new ComparableTest(
"First name"));
System.out.println("The position of First name is = " + position);
//using the cloned collection in TreeSet
TreeSet<ComparableTest> ts = new TreeSet<ComparableTest>(
comparableTestsList2);
System.out.println("The value in Tree Set is = " + ts);
System.out.println("The position of First name is = " + ts.contains(new ComparableTest("First name")));//works fine
//using the cloned collection in TreeMap
TreeMap<ComparableTest, String> tMap = new TreeMap<>();
for(ComparableTest ct: comparableTestsList2) {
tMap.put(ct, "anushree");
}
System.out.println("The value in Tree Map is = " + tMap);
System.out.println(tMap.get(new ComparableTest("First name")));//works fine
}
}
公共类ComparableTest实现了Comparable{
私有字符串用户名;
公共可比性测试(字符串名称){
this.username=名称;
}
公共字符串getUsername(){
返回用户名;
}
public void setUsername(字符串用户名){
this.username=用户名;
}
公共国际比较(可比测试o){
返回username.compareTo(o.getUsername());
}
@凌驾
公共字符串toString(){
返回这个.getUsername();
}
@抑制警告(“未选中”)
公共静态void main(字符串[]args){
ArrayList CompariableTestsList=新的ArrayList();
ArrayList可比测试列表2;
可比性测试列表。添加(新的可比性测试(“第二个名称”);
可比性测试列表。添加(新的可比性测试(“名字”));
System.out.println(“原始数组列表=“+CompariableTestsList”);
//制作克隆以在Treeset中测试此列表
comparableTestsList 2=(ArrayList)comparableTestsList
.clone();
//对第一个有效的arraylist进行排序
Collections.sort(可比测试列表);
System.out.println(“排序数组列表=“+CompariableTestsList”);
//搜索不作为equals方法工作的第一个数组时
//未被覆盖
int position=comparableTestsList.indexOf(新的ComparableTest(
"姓名);;
System.out.println(“名字的位置是=”+位置);
//在TreeSet中使用克隆的集合
树集ts=新树集(
可比测试2);
System.out.println(“树集中的值为=“+ts”);
System.out.println(“First name的位置是=“+ts.contains(new ComparableTest(“First name”)));//工作正常
//在树映射中使用克隆的集合
TreeMap tMap=新的TreeMap();
用于(可比测试ct:可比测试SLIST2){
tMap.put(ct,“anushree”);
}
System.out.println(“树映射中的值为=“+tMap”);
System.out.println(tMap.get(newcomparabletest(“First name”));//工作正常
}
}
这与javadoc中的内容非常吻合
TreeSet实例使用其compareTo(或compare)方法执行所有元素比较,因此,从集合的角度来看,此方法认为相等的两个元素是相等的。即使集合的顺序与equals不一致,集合的行为也是定义良好的;它只是没有遵守Set接口的总合同
还写了:
请注意,如果要正确实现set接口,set维护的顺序(无论是否提供显式比较器)必须与equals一致
equals()和hashCode()如何出现在TreeSet和TreeMap的图片中?能给我一个代码示例吗。谢谢 你刚才说过:
TreeSet实例使用其compareTo(或compare)方法执行所有元素比较
equals()
和hashCode
在处理TreeSet
和TreeMap
时不会出现在图片中。但是,如果您将来将此对象用作HashMap
(例如)的键,则正确地重写它们是一种良好的做法。同意@Tunaki的输入。TreeSet和TreeMap不需要hashCode和equals方法,因为排序取决于compareTo或客户端提供的compare方法。我认为这就是为什么这些DS的containsKey方法和TreeMap的get(key)方法都在log(n)时间内运行,而不是在O(1)时间内运行的原因,因为它们不是基于散列的数据结构,比如HashMap或HashTable,通过在键上应用散列函数,可以在O(1)时间内找到元素的位置。对于树集和树映射,将应用二进制搜索来定位元素。同意。。我期待着同样的答案