1.存储特点:
相对无序存储,不可以存储相同的元素(排重),不能通过下标访问
2.Set常用实现类
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
public class SetDemo {
public static void main(String[] args) {
Set sets=new HashSet();
sets.add("bcd");
sets.add("abc");
sets.add(123);
sets.add("abc");
System.out.println(sets);
//遍历Set集合
for(Object o:sets){
System.out.println(o);
}
Iterator it=sets.iterator();
while(it.hasNext()){
System.out.println(it.next());
}
}
}
2.1HashSet
- 此类实现Set接口,由哈希表(实际上是一个HashMap实例)支持。它不保证set的迭代顺序;特别是它不保证该顺序恒久不变。此类允许使用null元素。
- 存储特点:无序,不允许重复,允许null元素
2.2LinkedHashSet
是HashSet的子类.相对有序.
存储特点:有序(通过二叉树实现排序),不允许重复,允许null元素
2.3TreeSet
- 是可以给元素进行重新排序的一个Set接口的实现.使用元素的自然顺序对元素进行排序,或者根据创建Set时提供的Comparator进行排序,具体取决于使用的构造方法
- 存储特点:有序,不重复,不允许null元素,TreeMap实现
例子:
import java.util.HashSet;
import java.util.Iterator;
import java.util.LinkedHashSet;
import java.util.Set;
/**
* @author CC
* HashSet
*/
public class SetDemo2 {
public static void main(String[] args) {
Student gu=new Student();
gu.setStuName("谷丰");
gu.setStuNo("1001");
Student cui=new Student();
cui.setStuName("崔宸");
Set<Student> setStu=new HashSet<Student>();
setStu.add(gu);
setStu.add(cui);
//不允许重复,由于重写了hashCode和equals,所以不会添加进集合
Student wang=new Student();
wang.setStuName("谷丰");
wang.setStuNo("1001");
setStu.add(wang);
//迭代器遍历
Iterator<Student> it=setStu.iterator();
while(it.hasNext()){
Student s=it.next();
System.out.println(s.getStuName());
}
//LinkedSet有序
LinkedHashSet<Student> linkedSet=new LinkedHashSet<Student>();
linkedSet.add(gu);
linkedSet.add(cui);
System.out.println("--------------------------");
for(Student s:linkedSet){
System.out.println(s.getStuName());
}
}
}
3.重写hashCode和equals方法
Java判断对象是否相同的过程:
- 1、先判断hashCode(),如果hashCode不同,则加入集合中
如果hashCode相同,则进一步判断equals - 重写equals
例:
setStu.add(stu1);
自动调用stu1对象的hashCode()
,系统自动判断此hashCode值在HashSet集合中是否已经存值
如果没有存值,则存入到HashSet中
如果有,再次调用eqals()方法,根据equals返回的结果true:值相同,不添加到HashSet
false :值不同,则添加到HashSet
public class Student {
private String stuNo;
private String stuName;
public String toString(){
return stuNo+","+stuName;
}
//重新Object类的hashCode方法
public int hashCode(){
//根据属性值来产生hashCode
final int pri=31;
int result=1;
result=pri+(stuNo==null?0:stuNo.hashCode());
result=result+(stuName==null?0:stuName.hashCode());
return result;
}
//重写Object类的equals方法
public boolean equals(Object o){
//逐个属性值一一对比
//判断地址是否相同
if(this==o){
return true; //同一个对象
}
if(o==null){
return false; //不是同一对象
}
//判断原始类型是否相同
if(this.getClass() !=o.getClass()){
return false; //不同对象
}
//把形参o进行强转
Student s=(Student)o;
if(this.stuName==null){
if(s.stuName!=null){
return false;
}
}else if(!this.stuName.equals(s.stuName)){
return false;
}
if(this.stuNo==null){
if(s.stuNo!=null){
return false;
}
}else if(!this.stuNo.equals(s.stuNo)){
return false;
}
return true;
}
public String getStuNo() {
return stuNo;
}
public void setStuNo(String stuNo) {
this.stuNo = stuNo;
}
public String getStuName() {
return stuName;
}
public void setStuName(String stuName) {
this.stuName = stuName;
}
}