知识点:
1.Set子接口的操作特点以及常用子类。
2.深入分析两个常用子类的操作特征。
具体内容:
Collection接口的另外一个常用子类是Set接口(20%),并且这个接口没有扩充Collection中的方法,只是简单的继承l了Collection接口,因此就没有了List集合提供的get()方法了。
Set接口有两个常用的子类,分别是:HashSet、TreeSet
范例:观察HashSet子类的特点
package conll;
import java.util.HashSet;
import java.util.Set;
public class TestDemo {
public static void main(String[] args) throws Exception {
Set<String> all = new HashSet<String>();
all.add("nihao");
all.add("Hello");
all.add("Hello");
all.add("world");
System.out.println(all);
}
}
通过以上代码发现,Set集合下没有重复元素(这一点是Set接口的特征),同时还发现是无序的,即:HashSet子类的特征属于无序排列。
范例:使用TreeSet子类
package conll;
import java.util.Set;
import java.util.TreeSet;
public class TestDemo {
public static void main(String[] args) throws Exception {
Set<String> all = new TreeSet<String>();
all.add("X");
all.add("B");
all.add("B"); //重复数据
all.add("A");
System.out.println(all);
}
}
以上代码表明,TreeSet子类没有重复数据,以及所保存的内容自动排序。
关于数据排序的说明:
TreeSet子类保存的内容可以排序。但是集合是一个动态的对象数组,如果要想为一组对象进行排序,在JAVA里面必须要使用比较器,应该使用Comparable完成比较。在比较方法里面需要将类中所有的属性进行比较。
范例:TreeSet排序
package conll;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
class Book implements Comparable<Book>{
private double price;
private String title;
public Book(String title,double price){
this.title=title;
this.price=price;
}
public String toString(){
return "书名:"+this.title+",价格:"+this.price+"\n";
}
@Override
public int compareTo(Book o) {
if(this.price>o.price){
return 1;
} else if(this.price<o.price){
return -1;
} else{
return this.title.compareTo(o.title); //调用String类比较大小
}
}
}
package conll;
import java.util.Set;
import java.util.TreeSet;
public class TestDemo {
public static void main(String[] args) throws Exception {
Set<Book> all = new TreeSet<Book>();
all.add(new Book("JAVA开发",79.8));
all.add(new Book("JAVA开发",79.8)); //全部信息重复
all.add(new Book("JSP开发",79.8)); //价格信息重复
all.add(new Book("Android开发",89.8)); //都不重复
System.out.println(all);
}
}
通过检测可以发现TreeSet类主要是依靠Comparable接口中的compareto进行比较排序的,当返回值为0的时候,那么它就认为是重复数据,不会被保存。comparable管TreeSet不管HashSet,因此HashSet就会现实所有的对象,TreeSet就不能现实所有对象。
关于重复元素的说明:
很明显,Comparable接口只能够负责TreeSet子类进行重复元素的判断,它并不能真的用于重复元素的判断。因为它只有在排序的情况下有这样的功能。如果想要判断重复元素那么只能够依靠Object类中提供的方法:
1.取得哈西码:public int hashCode(),先判断对象的哈哈希码是否相同,依靠哈西码取得一个对象的内容。
2.对象比较:publican boolean equals(Object obj),再将对象的属性进行依次的比较。
代码:
package conll;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
class Book{
private double price;
private String title;
public Book(String title,double price){
this.title=title;
this.price=price;
}
@Override
public String toString(){
return "书名:"+this.title+",价格:"+this.price+"\n";
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
long temp;
temp = Double.doubleToLongBits(price);
result = prime * result + (int) (temp ^ (temp >>> 32));
result = prime * result + ((title == null) ? 0 : title.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Book other = (Book) obj;
if (Double.doubleToLongBits(price) != Double.doubleToLongBits(other.price))
return false;
if (title == null) {
if (other.title != null)
return false;
} else if (!title.equals(other.title))
return false;
return true;
}
}
package conll;
import java.util.HashSet;
import java.util.Set;
import java.util.TreeSet;
public class TestDemo {
public static void main(String[] args) throws Exception {
Set<Book> all = new HashSet<Book>();
all.add(new Book("JAVA开发",79.8));
all.add(new Book("JAVA开发",79.8)); //全部信息重复
all.add(new Book("JSP开发",79.8)); //价格信息重复
all.add(new Book("Android开发",89.8)); //都不重复
System.out.println(all);
}
}
以后在非排序的情况下,只要是判断重复的元素依靠的永远是hashCode()与equals()。
总结:
1.在开发中。Set接口绝对不是首选,如果非得用那也选着HashSet子类.
2.Comparable这种比较器大部分情况下只存在于JAVA理论范畴,例如:要进行TreeSet排序.
3.Set不管如何操作,必须始终保持一个前提:数据不能重复。