您的位置:首页 > 编程语言 > Java开发

java--集合框架(List,Set,Map)——Set

2019-05-05 21:17 579 查看
/**
* HashSet存储数据的特点:
* 1.底层是以哈希表(数组+链表/红黑树)的方式进行存储数据
* 2.是一个无序的容器(你怎么存进去的 不一定怎么取出来)
* 3.不能存储相同元素
* 4.因为没有下标,所以不能使用普通for循环进行遍历
*/
Set<Integer> s = new HashSet<Integer>();
s.add(1);
s.add(2);
s.add(3);
s.add(4);
s.add(6);
s.add(9);
s.add(1);

//遍历Set集合可以使用迭代器进行遍历
//1.把Set集合转换为迭代器
Iterator<Integer> iter = s.iterator();
//2.通过while循环遍历迭代器
//iter.hasNext()判断是否有下一个元素
//iter.next();取出当前元素
while(iter.hasNext()){
System.out.println(iter.next());
}

Set<String> s2 = new HashSet<String>();

s2.add("a");
s2.add("b");
s2.add("c");
s2.add("d");
s2.add("e");
s2.add("a");

Iterator<String> iter2 =s2.iterator();
while(iter2.hasNext()){
System.out.println(iter2.next());
}

//Java的任何对象 都对应一个hashcode值(系统为我们随机生成的一个十进制整数逻辑值 不是真正的地址)
String s3 = "abc";
int i = s.hashCode();
System.out.println(i);

Set<String> str = new HashSet<String>();
String ss1 = "abc";
String ss2 = "重地";
String ss3 = "通话";
String ss4 = "abc";

str.add(ss1);		//96354
str.add(ss2);		//1179395
str.add(ss3);		//1179395
str.add(ss4);		//96354

System.out.println(ss1.hashCode());
System.out.println(ss2.hashCode());
System.out.println(ss3.hashCode());
System.out.println(ss4.hashCode());
//当调用set集合中的add方法时,会调用hashcode方法和equals方法
//1.首先获取当前元素的哈希值,判断当前的哈希值是否在set集合中
//2.当前添加元素的值和已经存在哈希值对应的元素进行equals比较
//3.如果当前元素的哈希值和内容值都相等,就不把当前元素添加到对应的链表中了

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 里面不允许保存重复数据

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: