原文之部分某处有争论,读者谨慎阅读,后期本人再进行本文内容修正
public class Person {
String name;
int age;
public Person(String name, int age) {
super();
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "Person [name=" + name + ", age=" + age + "]";
}
}
@Test
public void testHashSet(){
Person p1 = new Person("钟梅", 25);
Person p2 = new Person("王兴", 34);
Person p3 = new Person("张三", 18);
Person p4 = new Person("李四", 21);
Person p5 = new Person("李四", 21);
HashSet hashSet = new HashSet<>();
hashSet.add(p1);
hashSet.add(p2);
hashSet.add(p3);
hashSet.add(p4);
hashSet.add(p5);
for (Person person : hashSet) {
System.out.println(person.getName()+ "----------" + person.getAge());
}
}
//判断判断两个对象是否相等,对象是否存在,对象的name和age是否相等
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Person person = (Person) o;
return age == person.age &&
Objects.equals(name, person.name);
}
//返回对象的name和age的hash值
@Override
public int hashCode() {
return Objects.hash(name, age);
}
//如果TreeSet采用了定制顺序,则该方法返回定制排序所使用的Comparator,如果TreeSet采用自然排序,则返回null;
Comparator comparator();
//返回集合中的第一个元素;
Object first();
//返回集合中的最后一个元素;
Object last();
//返回指定元素之前的元素。
Object lower(Object e);
//返回指定元素之后的元素。
Object higher(Object e);
//返回此Set的子集合,含头不含尾;
SortedSet subSet(Object fromElement,Object toElement);
//返回此Set的子集,由小于toElement的元素组成;
SortedSet headSet(Object toElement);
//返回此Set的子集,由大于fromElement的元素组成;
SortedSet tailSet(Object fromElement);
@Test
public void testTreeSet(){
TreeSet nums = new TreeSet<>();
//向集合中添加元素
nums.add(5);
nums.add(2);
nums.add(15);
nums.add(-4);
//输出集合,可以看到元素已经处于排序状态
System.out.println(nums);//[-4, 2, 5, 15]
System.out.println("集合中的第一个元素:"+nums.first());//集合中的第一个元素:-4
System.out.println("集合中的最后一个元素:"+nums.last());//集合中的最后一个元素:15
System.out.println("集合小于4的子集,不包含4:"+nums.headSet(4));//集合小于4的子集,不包含4:[-4, 2]
System.out.println("集合大于5的子集:"+nums.tailSet(2));//集合大于5的子集:[2, 5, 15]
System.out.println("集合中大于等于-3,小于4的子集:"+nums.subSet(-3,4));//集合中大于等于-3,小于4的子集:[2]
}
TreeSet会调用集合元素的compareTo(Objec obj)方法来比较元素之间的大小关系,然后将集合元素按升序排列,这就是自然排序。
拓展:
Java提供了一个Comparable接口,该接口里定义了一个compareTo(Object obj)方法,该方法返回一个整数值,实现该接口的类必须实现该方法,实现了该接口的类必须实现该方法,实现接口的类就可以比较大小了。当调用一个一个对象调用该方法与另一个对象进行比较时, compareTo(Object obj)如果返回0表示两个对象相等;如果返回正整数则表明obj1大于obj2,如果是负整数则相反。
案例:
实现存储Person类的集合,排序方式,按年龄大小,如果年龄相等,则按name字符串长度,如果长度相等则比较字符。如果name和age都相等则视为同一对象。
public class Person implements Comparable{
String name;
int age;
public Person(String name, int age) {
super();
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "Person [name=" + name + ", age=" + age + "]";
}
@Override
public int compareTo(Person o) {
//比较age
int num=this.age-o.age;
//如果age相等则比较name长度
int num1=num==0?this.name.length()-o.name.length():num;
//如果前两者都相等则比较name字符串
int num2=num1==0?this.name.compareTo(o.name):num1;
return num2;
}
}
@Test
public void testTreeSet(){
TreeSet tree = new TreeSet<>();
//向集合中添加元素
tree.add(new Person("孙悟空",16));
tree.add(new Person("孙悟空",17));
tree.add(new Person("孙悟空",16));
tree.add(new Person("唐僧",16));
tree.add(new Person("沙悟净",23));
tree.add(new Person("唐僧",30));
//遍历
System.out.println(tree);
}
@Test
public void testTreeSet2(){
TreeSet nums = new TreeSet<>((a,b)->-(a-b));
//向集合中添加元素
nums.add(5);
nums.add(2);
nums.add(15);
nums.add(-4);
//输出集合,可以看到元素已经处于排序状态
System.out.println(nums);//[15, 5, 2, -4]
}
原文地址 https://blog.csdn.net/mashaokang1314/article/details/83721792