java数据结构02–set
Java中使用Set接口描述一个集合,集合Set是Collection的子接口,Set不允许其数据元素重复出现,也就是说在Set中每一个数据元素都是唯一的。Set接口定义的常用方法如下:
retainAll(Collection c),其返回的是Set和集合C的交集
containsAll(Collection c),其返回是一个布尔型的,判断Set是否包含c中的全部数据元素,如果全部包含返回true,否则返回false
removeAll(Collection c),从Set中移除c包含的全部数据元素(差集)
addAll(Collection c),向Set中添加c包含的全部数据元素(并集)
其余的方法和List中的差不多,详情见上篇博客;
正如List分为ArrayList和LinkedList,Set分为HashSet和TreeSet
HashSet和TreeSet的区别:
1、HashSet与TreeSet接口的一点不同,HashSet 保存的数据是无序的,TreeSet保存的数据是有序的,所以如果要想保存的数据有序应该使用TreeSet子类。
2、利用TreeSet保存自定义类对象的时候,自定义所在的类一定要实现Comparable接口,如果没有实现这个接口那么就无法区分大小关系,而且在TreeSet中如果要进行排序,那么就要将所有的字段都进行比较,就是说在TreeSet中是依靠comparato()方法返回的是不是0来判断是不是重复元素的。
3、如果是HashSet子类,那么其判断重复数据的方式不是依靠的comparable接口而是Object类之中的两个方法:(1)取得对象的哈希码 hashCode();(2)对象比较:equals(); 这俩个方法均不需要自己编写,在eclipse里面可以使用右键source 选择自动生成。就像生成Getter 和Setter 方法一样。
总结:TreeSet 依靠的是Comparable 来区分重复数据;
HashSet 依靠的是hashCode()、equals()来区分重复数据
Set 里面不允许保存重复数据。
这是HashSet中的一个代码
import java.util.Collection;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
public class SetDemo {
public static void main(String[] args) {
Set<String> set = new HashSet<String>();
set.add("唐僧");
set.add("孙悟空");
set.add("八戒");
set.add("沙僧");
set.add("张三");
set.add("张三");
set.add("张三");
Iterator<String> itor = set.iterator();
while(itor.hasNext()){
System.out.println("------------>" + itor.next());
}
System.out.println("************************************************");
}
}
运行结果:
————>张三
————>沙僧
————>孙悟空
————>唐僧
————>八戒
HashSet就是采用哈希算法存取对象的集合,它内部采用对某个数字n进行取余的方式对哈希码进行分组和划分对象的存储区域。Object类中定义了一个hashCode()方法来返回每个Java对象的哈希码,当从HashSet集合中查找某个对象时,Java系统首先调用对象的hashCode()方法获得该对象的哈希码,然后根据哈希码找到相应的存储区域,最后取出该存储区域内的每个元素与该对象进行equals方法比较,这样不用遍历集合中的素有元素就可以的到结论。可见,HashSet集合具有很好的对象检索性能,但是,HashSet集合存储对象的效率相对要低些,因为向HashSet集合中添加一个对象时,要先计算出对象的哈希码和根据这个哈希码确定对象在集合中的存放位置。
这是TreeSet的一段代码
import java.util.Set;
import java.util.TreeSet;
/**
* TreeSet是一个有序集合,其元素按照升序排列,默认是按照自然顺序排列
* TreeSet是红黑树的一个实现
*
* @author Administrator
*
*/
public class TreeSetDemo {
public static void main(String[] args) {
// TODO Auto-generated method stub
addDemo();
setTest();
}
public static void addDemo(){
Set<String> stuSet = new TreeSet<String>();
stuSet.add("唐僧");
stuSet.add("孙悟空");
stuSet.add("孙悟空");
stuSet.add("八戒");
stuSet.add("沙僧");
for(String stu : stuSet){
System.out.println("--------------->" + stu);
}
}
public static void setTest(){
Set<Integer> stuSet = new TreeSet<Integer>();
stuSet.add(89);
stuSet.add(69);
stuSet.add(59);
stuSet.add(99);
stuSet.add(99);
stuSet.add(100);
for(Integer stu : stuSet){
System.out.println("--------------->" + stu);
}
}
其运行结果:
—————>八戒
—————>唐僧
—————>孙悟空
—————>沙僧
—————>59
—————>69
—————>89
—————>99
—————>100
这个的排序方式就比较简单方便,是按照升序,从小到大排列的,类似于二叉树里的中序遍历