------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------
一、Set集合概述
Set集合元素的存入顺序和取出顺序是不一致的,集合中的元素不可以重复。Set集合的两个常用子类:HashSet和TreeSet。
二、HashSet
1.HashSet的常见方法
//HashSet的常见操作方法
add()
addAll()
remove()
removeAll()
iterator()
2.HashSet集合保证元素唯一性的依据:
元素通过调用自己的hashCode和equals方法,比较异同。当hashcode值不同时,直接存入集合不进行equals判断。当hashcode相同时,继续进行equals判断,如果equals返回true则存入失败。
注意:当自定义对象存入HashSet中时,为了避免相同对象的存入,需要对象类根据自身的属性特征复写Object类的hashcode和equals方法。
3.练习题:自定义一个pers类,并将person对象存入HashSet集合,再将人对象的属性获取出来。
/*
* 需求:自定义一个pers类,并将pers对象存入HashSet集合,再将人对象的属性获取出来
* 思路:
* 1.定义Pers类,需要复写hashCode和equals以及toString方法
* 2.定义集合,将pers对象存入
* 3.通过迭代器将元素打印出来
*/
package com.itheima;
import java.util.HashSet;
import java.util.Iterator;
class Demo{
public static void main(String[] args){
HashSet hs =new HashSet();
hs.add(new Pers("zhangsan01",10));
hs.add(new Pers("zhangsan02",20));
hs.add(new Pers("zhangsan03",30));
hs.add(new Pers("zhangsan01",10));//存入重复人对象
hs.add(new Pers("zhangsan04",40));
System.out.println(hs);//打印结果没有重复元素,说明重复元素没有存进来
//定义迭代器取出元素
Iterator it =hs.iterator();
while(it.hasNext()){
Pers p =(Pers)it.next();
System.out.println(p);
}
}
}
//定义一个Pers类,用于描述人对象
class Pers{
private String name;
private int age;
Pers(String name,int age){
this.name=name;
this.age=age;
}
public int hashCode(){ //复写hashCode方法,保证元素存入的唯一性
return name.hashCode()+age*36;
}
public boolean equals(Object obj){ //复写equals方法,保证元素存入的唯一性
if(!(obj instanceof Pers))
throw new RuntimeException("类型不匹配");
Pers p = (Pers)obj;
return this.name.equals(p.name)&&this.age==p.age;
}
public String toString(){ //复写toString方法,使得打印人对象出来的不是地址值
return name+":::::"+age;
}
}
三、TreeSet
1.TreeSet常见操作方法
//TreeSet常见操作方法
add();
addAll();
clear();
remove();
removeAll();
iterator();
2.TreeSet保证元素唯一性的依据:
TreeSet集合中的元素通过调用自己的compareTo方法判断元素是否重复,return 0表示元素重复,return正数或负数表示元素不重复。
注意:TreeSet存入自定义对象时,对象必须具备比较性,即自定义的对象类必须实现comparable接口并复写compareto方法。
当对象自己的比较性不符合需求时,我们可以自己传给TreeSet集合一个比较器X,X只需实现comparator接口即可。
当元素自身具备比较性且集合接收了比较器时,以集合的比较器为准。
3.练习题:将字符串存入TreeSet集合中,按照字符串长度由短到长的顺序取出。
/*
*需求:将字符串存入TreeSet集合中,按照字符串长度由短到长的顺序取出。
*思路:
*1.字符串本身的compareTo方法比较的是自然顺序而非字符串长短
*2.需要自己定义一个比较器并传给TreeSet集合
*/
package com.itheima;
import java.util.Comparator;
import java.util.Iterator;
import java.util.TreeSet;
class Demo{
public static void main(String[] args){
//定义一个TreeSet集合,并将判断字符串长短的比较器传给集合
TreeSet ts =new TreeSet(new lenComp());
ts.add("abcdfdf");
ts.add("abcdkkkdkgg");
ts.add("abcde");
ts.add("abcdeffdf");
//定义迭代器,取出元素
Iterator it = ts.iterator();
while(it.hasNext()){
String s =(String)it.next();
System.out.println(s); //验证打印结果是否为由短到长
}
}
}
//定义一个判断字符串长短的比较器
class lenComp implements Comparator{
public int compare(Object o1,Object o2){
String s1 =(String)o1;//多态,必须强转,否则无法调用length()
String s2 =(String)o2;//多态,必须强转,否则无法调用length()
return new Integer(s1.length()).compareTo(new Integer(s2.length()));
}
}