Java——类集框架:Set集合接口的详解及应用举例
目录
1、Set集合接口
Set也是Collection的子接口,主要特点是保存的数据不允许出现重复。但Set子接口并不像List子接口那样,针对Collection接口进行扩展,而是完整按照Collection接口标准实现了继承,所以没有get方法。
Set子接口有两个常用子类:TreeSet(有序)、HashSet(无序)。
【举例】:观察HashSet子类:HashSet最大特点是不允许保存重复元素,且无序排列。
-
Set<String> all = new HashSet<String>();
-
all.add("Hello");
-
all.add("World");
-
all.add("good");
-
all.add("dog");
-
all.add("cat");
-
all.add("Hello"); //重复元素不保存
-
System.out.println(all);
【举例】:观察TreeSet子类:数据不允许重复,根据升序排列
-
Set<String> all = new TreeSet<String>();
-
all.add("Hello");
-
all.add("World");
-
all.add("good");
-
all.add("dog");
-
all.add("cat");
-
all.add("Hello");
-
System.out.println(all);
2、关于TreeSet排序
可以使用自定义类作为保存数进行排序,但是一定要实现Comparable接口,以作为排序的依据。而在实现Comparable接口时,需要将所有属性参与到比较中,具体查看下面的compareTo方法,若只写return this.age-o.age,则运行输出,发现只有张三和赵五,年龄相同李四没有了。
-
Set<Person> all = new TreeSet<Person>();
-
all.add(new Person("张三",10));
-
all.add(new Person("赵五",12));
-
all.add(new Person("李四",10));
-
all.add(new Person("赵五",12));
-
System.out.println(all);
-
-
class Person implements Comparable<Person>{
-
-
private String name;
-
private int age;
-
-
public Person(String name,int age){
-
this.name = name;
-
this.age = age;
-
}
-
-
@Override
-
public String toString() {
-
return "Person{" +
-
"name='" + name + '\'' +
-
", age=" + age +
-
'}' ;
-
}
-
-
@Override
-
public int compareTo(Person o) {
-
if(this.age > o.age){
-
return 1;
-
}else if(this.age < o.age){
-
return -1;
-
}else{
-
return this.name.compareTo(o.name);
-
}
-
}
-
-
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;
-
}
-
}
只要Java中牵扯到一组对象的排序操作,永远要使用Comparable接口完成,上例中可以看出,使用TreeSet进行排序,需要将所有属性参与到比较中,比较麻烦,所以一般很少用TreeSet进行比较操作,多用HashSet。
3、关于重复元素
Comparable只是适合于TreeXX类型的集合消除重复元素,而真正意义的重复判断不是利用Comparable接口完成,而是利用Object类的两个方法完成:
- 取得对象的hash码:public int hashCode();
- 对象比较:public boolean equals(Object obj);
-
Set<Person> all = new HashSet<>();
-
all.add(new Person("张三",10));
-
all.add(new Person("赵五",12));
-
all.add(new Person("李四",10));
-
all.add(new Person("赵五",12));
-
System.out.println(all);
-
-
class Person{
-
-
private String name;
-
private int age;
-
-
public Person(String name,int age){
-
this.name = name;
-
this.age = age;
-
}
-
-
@Override
-
public String toString() {
-
return "Person{" +
-
"name='" + name + '\'' +
-
", age=" + 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 &&
-
name.equals(person.name);
-
}
-
-
@Override
-
public int hashCode() {
-
return Objects.hash(name, 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;
-
}
-
}
4、小结
1)Set接口重复数据消除依靠的是子类实现,HashSet基于hashCode()、equals(),TreeSet基于Comparable接口。
2)开发中很少用TreeSet,基本用的是HashSet。
作于202003061510,已归档
———————————————————————————————————
本文为博主原创文章,转载请注明出处!
若本文对您有帮助,轻抬您发财的小手,关注/评论/点赞/收藏,就是对我最大的支持!
祝君升职加薪,鹏程万里!
文章来源: winter.blog.csdn.net,作者:Winter_world,版权归原作者所有,如需转载,请联系作者。
原文链接:winter.blog.csdn.net/article/details/104696425
- 点赞
- 收藏
- 关注作者
评论(0)