java集合框架————Set集合接口
Set接口与List接口最大的不同在于Set接口中的内容是不允许重复的。同时需要注意的是,Set接口并没有对Collection接口进行扩充,而List对Collection进行了扩充。因此,在Set接口中没有get()方法。
在Set子接口中有两个常用子类:HashSet(无序存储)、TreeSet(有序存储)
1.set接口常用字类
范例:观察HashSet使用
import java.util.HashSet;
import java.util.Set;
public class HashSetDemo {
public static void main(String[] args) {
Set<String> set = new HashSet<>();
set.add("hello");
set.add("I'm");
set.add("fish");
set.add("hey");
set.add("Fish");
System.out.println(set);
}
}
范例:观察TreeSet使用
import java.util.Set;
import java.util.TreeSet;
public class TreeSetDemo {
public static void main(String[] args) {
Set<String> set = new TreeSet<>();
set.add("hey");
set.add("Hey");
set.add("I'm");
set.add("Fish");
set.add("fish");
System.out.println(set);
}
}
TreeSet使用的是升序排列的模式完成的。
2.TreeSet排序分析
既然TreeSet子类可以进行排序,所以我们可以利用TreeSet实现数据的排列处理操作。此时要想进行排序实际上是针对于对象数组进行的排序处理,而如果要进行对象数组的排序,对象所在的类一定要实现Comparable接口并且覆写compareTo()方法,只有通过此方法才能知道大小关系。
需要提醒的是如果现在试用Comparable接口进行大小关系匹配,所有属性必须全部进行比较操作。
范例:使用TreeSet排序
import java.util.Set;
import java.util.TreeSet;
class Person implements Comparable<Person>{
private String name;
private Integer age;
@Override
public String toString() {
return "Person{" +
"name=" + name +
", age=" + age +
'}';
}
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 Person(String name, Integer age){
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
}
public class TreeSetDemo1 {
public static void main(String[] args) {
Set<Person> set = new TreeSet<>();
set.add(new Person("张三",20));
set.add(new Person("王五",15));
set.add(new Person("赵四",18));
System.out.println(set);
}
}
在实际使用之中,使用TreeSet过于麻烦了。项目开发之中,简单java类是根据数据表设计得来的,如果一个类的属性很多,那么比较起来就很麻烦了。所以我们一般使用的是HashSet。
3.重复元素判断
在使用TreeSet子类进行数据保存的时候,重复元素的判断依靠的ComParable接口完成的。但是这并不是全部Set接口判断重复元素的方式,因为如果使用的是HashSet子类,由于其跟Comparable没有任何关系,所以它判断重复元素的方式依靠的是Object类中的两个方法:
- hash码: public native int hashCode();
- 对象比较:public boolean equals(Object obj);
在Java中进行对象比较的操作有两步:第一步要通过一个对象的唯一编码找到一个对象的信息,当编码匹配之后再调用equals()方法进行内容的比较。
范例:覆写hashCode()与equals()方法消除重复
如果要想标识出对象的唯一性,一定需要equals()与hashCode()方法共同调用。
面试题:如果两个对象的hashCode()相同,equals()不同结果是什么?不能消除
面试题:如果两个对象的hashCode()不同,equals()相同结果是什么?不能消除
对象判断必须两个方法equals()、hashCode()返回值都相同才判断为相同。
个人建议:
- 保存自定义对象的时候使用List接口;
- 保存系统类信息的时候使用Set接口(避免重复)。