一直以来,对TreeSet的理解受到了HashMap的影响。认为HashSet也是通过equals方法区分对象。最近在一个程序开发中使用了TreeSet,发现TreeSet区分对象是根据对象实现的Comparable或者Comparator接口中的Compare()方法或者CompareTo()方法。如果两个对象通过比较返回值为0,那么将一个对象插入到TreeSet后,另外一个对象将不能插入TreeSet。 HashSet通过HashMap实现,集合中的每一个对象都是一个key,根据根据对象的HashCode和equals方法区分。
可以通过修改以下代码查看结果。
import java.util.*;
public class TestTreeSet {
/**
* @param args
*/
public static void main(String[] args) {
TreeSet<TestClass> treeSetWithComparator = new TreeSet<TestClass>(new TestClassComparator());
HashSet<TestClass> testHashSet = new HashSet<TestClass>();
TestClass testObj1 = new TestClass(5);
TestClass testObj2 = new TestClass(5);
System.out.printf("\ntestObj1.getI == %d && testObj2.getI == %d\n",testObj1.getI(),testObj2.getI());
System.out.println("testObj1 equals testObj2? " + testObj1.equals(testObj2));
System.out.println("testObj1 compares with testObj2? " + treeSetWithComparator.comparator().compare(testObj1, testObj2));
System.out.println("testObj1 == testObj2? " + (testObj1 == testObj2));
System.out.println("Hashcode of testObj1 " + testObj1.hashCode());
System.out.println("Hashcode of testObj2 " + testObj2.hashCode());
System.out.println("Add testObj1 into treeset: " + treeSetWithComparator.add(testObj1));
System.out.println("Add testObj2 into treeset: " + treeSetWithComparator.add(testObj2));
System.out.println("Add testObj1 into HashSet: " + testHashSet.add(testObj1));
System.out.println("Add testObj2 into HashSet: " + testHashSet.add(testObj2));
treeSetWithComparator.clear();
testHashSet.clear();
testObj1.setI(5);
testObj2.setI(6);
System.out.printf("\ntestObj1.getI == %d && testObj2.getI == %d\n",testObj1.getI(),testObj2.getI());
System.out.println("testObj1 equals testObj2? " + testObj1.equals(testObj2));
System.out.println("testObj1 compares with testObj2? " + treeSetWithComparator.comparator().compare(testObj1, testObj2));
System.out.println("testObj1 == testObj2? " + (testObj1 == testObj2));
System.out.println("Hashcode of testObj1 " + testObj1.hashCode());
System.out.println("Hashcode of testObj2 " + testObj2.hashCode());
System.out.println("Add testObj1 into treeset: " + treeSetWithComparator.add(testObj1));
System.out.println("Add testObj2 into treeset: " + treeSetWithComparator.add(testObj2));
System.out.println("Add testObj1 into HashSet: " + testHashSet.add(testObj1));
System.out.println("Add testObj2 into HashSet: " + testHashSet.add(testObj2));
}
}
class TestClass{
private int i = 0;
public TestClass(int i){
this.i = i;
}
int getI(){
return i;
}
void setI(int i){
this.i = i;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + i;
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
TestClass other = (TestClass) obj;
if (i != other.i)
return false;
return true;
}
}
class TestClassComparator implements Comparator<TestClass>{
@Override
public int compare(TestClass obj1, TestClass obj2) {
return obj1.getI() - obj2.getI();
}
}
分享到:
相关推荐
在Java编程中,集合框架是处理数据的重要工具,而`TreeSet`作为其中之一,它是一个有序、不包含重复元素的集合。本知识点主要探讨如何利用Java的`TreeSet`类来实现两个集合的并集算法。 `TreeSet`是基于红黑树(Red...
在Java编程语言中,`TreeSet` 是一种集合框架下的数据结构,它实现了SortedSet接口,提供了有序且无重复元素的存储。在这个“javaTreeSet实现图书管理系统”中,我们可以利用`TreeSet`的特性来构建高效且功能完备的...
Java SE程序 TreeSet类中自定义CompareTo类Java SE程序 TreeSet类中自定义CompareTo类Java SE程序 TreeSet类中自定义CompareTo类Java SE程序 TreeSet类中自定义CompareTo类Java SE程序 TreeSet类中自定义CompareTo类...
Java TreeSet类的简单理解和使用 Java TreeSet类是Set接口的一个实现类,主要作用是用于对对象的排序以及确定存入对象的唯一性。TreeSet类可以自动地对存入的对象进行排序,并且保证存入的对象的唯一性。 在使用...
《Java8数据结构——TreeSet详解》 在Java集合框架中,TreeSet是一个重要的数据结构,它是Set接口的实现类之一,与HashSet和LinkedHashSet不同,TreeSet具有排序功能,这是因为其不仅继承自AbstractSet,还实现了...
* 摊位销售管理 1.有一个水果销售摊位,销售3种水果,重量和单价各不相同,实现多次的销售业务 2.销售时如果为顾客为女性销售金额打8折 3.显示当前各种水果的库存数 4.查询全部销售记录信息 5.加入其它水果品种 ...
在Java集合框架中,`TreeSet`是一个有序、不可重复的集合,它基于红黑树(Red-Black Tree)数据结构实现。`TreeSet`在许多场景下比其他集合如`ArrayList`或`HashSet`更有优势,因为它的元素总是按特定顺序排列,并且...
停车场管理 1.一个停车场,内有多个车位,可停入各种车辆 2.只有具备车牌并高度低于3米的车辆可停入 3.停入时开始计费,按每小时2元 4.查询全部停车位的状态 5.按车牌及停车位号取车,取车时收停车费 ...
TreeSet 是 Java 中的一个集合类,它实现了 SortedSet 接口,并且使用红黑树作为底层数据结构。TreeSet 具有以下主要特点: 排序性:TreeSet 中的元素是有序的,默认按照元素的自然顺序进行排序。或者,可以在创建 ...
使用TreeSet和Comparator,编写TreeSetTest2类,要求对TreeSet中的元素1-元素10进行排列,排序逻辑为奇数在前偶数在后,奇数按照升序排列,偶数按照降序排列。 如果需要的话可以下载,有写成文章的。有写了一点中文...
Java TreeSet实现学生按年龄大小和姓名排序的方法示例 在 Java 中,TreeSet 是一种基于树的集合类,可以自动排序其中的元素。在本篇文章中,我们将学习如何使用 TreeSet 实现学生按年龄大小和姓名排序的方法。 ...
TreeSet 红黑树结构算法是 Java 中的一种数据结构,它是基于红黑树数据结构的实现。红黑树是一种自平衡的排序二叉树,它可以保证快速检索指定节点。TreeSet 和 TreeMap 之间存在着紧密的关系,下面我们将详细讲解 ...
2. **TreeSet**:它是Java集合框架中`Set`接口的一个实现,基于红黑树数据结构。`TreeSet`保证了元素的排序性,无论是自然排序还是自定义比较器排序。它不允许有重复元素,并且提供了一种高效的查找、添加和删除元素...
Java 中 TreeMap 和 TreeSet 实现红黑树 Java 中的 TreeMap 和 TreeSet 都是基于红黑树的数据结构实现的。红黑树是一种自平衡的排序二叉树,它可以保证在插入、删除和搜索操作时都能维持平衡,从而确保搜索、插入...
Class003_TreeSet.java
Java 中 TreeSet 的两种排序方式 TreeSet 是 Java 中一种基于树形结构的 Set 实现,它具有自动排序的功能。在使用 TreeSet 时,我们可以通过实现 Comparable 接口或提供Comparator 对象来指定排序规则。下面,我们...
`TreeSet`是Java集合框架中的一个类,它继承自`AbstractSet`并实现了`NavigableSet`接口。`TreeSet`的主要特点就是它会自动按照一定的顺序对存储的元素进行排序。在这个场景下,我们使用`TreeSet`来实现学生成绩的...
HashSet和TreeSet是Java集合框架中的两种重要数据结构,它们都是Set接口的实现类,用于存储不重复的元素。在编程实践中,理解它们的区别和应用场景至关重要。 HashSet是基于HashMap实现的,它不保证元素的顺序,...
标题中的"(TreeSet) s.subSet(608, true, 611, true)"是一个Java编程中关于TreeSet集合的操作。TreeSet是Java集合框架中的一种有序、可重复的元素集合,它实现了SortedSet接口,内部基于红黑树(Red-Black Tree)...
·基于JDK 11,将Java8、Java9、Java10、Java11新特性一网打尽 ·课程中,Eclipse和IDEA这两种企业一线开发环境都使用到了 3.技术讲解更深入、更全面: ·课程共30天,715个知识视频小节,涉及主流Java使用的...