java毕向东听课笔记24(集合框架-Set集合HashSet)
2016-04-23 22:31
447 查看
Set集合在之前讲过,里面的元素是无序的,这里的无序指的是存入和取出的顺序不一定一致,而且元素不可以重复。
Set集合的功能和Collection是一致的。
Set集合常见的子类有两个:HashSet,TreeSet。其中HashSet底层数据结构是哈希表。
可见,HashSet中存放元素是无序的(这里有点特殊,呈现了倒序),而且即使有重复的元素,集合中也只存放一个,这一点可以根据add方法的返回值类型是boolean来验证
可见第一次存放java1成功,第二次存放java1失败。
-----------------------------------------------------------------------------------
HashSet存放自定义元素
添加自定义元素,打印自定义元素,去除重复元素
这里发现,即使在Person类中复写了equals方法,还是出现了重复元素。这是因为对于HashSet,首先判断的是地址值,如果地址值都不一样,那么就不用调用equals方法。
现在要做的就是要在Person类中复写HashCode方法,建立自己的哈希值,根据判断条件建立(这里是根据姓名与年龄),因为每个字符串都有自己的哈希值,所以:
事实上,因为相同字符串的哈希值也一样,所以实际上,本代码中第二次添加“a2”,12的时候,程序先比较了哈希值,发现哈希值相同,接着调用了被复写的equals方法,发现还是相同,才没有被写入到集合中去
结论:HashSet是如何保证元素的唯一性的呢?是通过元素的两个方法:hashCode和equals来完成。如果元素的HashCode值相同,才会判断equals是否为true。如果元素的hashCode值不同,才会调用equals()。
--------------------------------------------------------------------
HashCode判断和删除
对于判断元素是否存在,以及删除等操作,以来的方法是元素的hashcode和equals方法,先判断前者
Set集合的功能和Collection是一致的。
Set集合常见的子类有两个:HashSet,TreeSet。其中HashSet底层数据结构是哈希表。
import java.util.*; class HashSetDemo{ public static void sop(Object obj){ System.out.println(obj); } public static void main(String[] args){ HashSet hs = new HashSet(); hs.add("java1"); hs.add("java1"); hs.add("java2"); hs.add("java3"); hs.add("java4"); Iterator it = hs.iterator(); while(it.hasNext()) sop(it.next()); } }
可见,HashSet中存放元素是无序的(这里有点特殊,呈现了倒序),而且即使有重复的元素,集合中也只存放一个,这一点可以根据add方法的返回值类型是boolean来验证
import java.util.*; class HashSetDemo{ public static void sop(Object obj){ System.out.println(obj); } public static void main(String[] args){ HashSet hs = new HashSet(); sop(hs.add("java1")); sop(hs.add("java1")); hs.add("java2"); hs.add("java3"); hs.add("java4"); Iterator it = hs.iterator(); while(it.hasNext()) sop(it.next()); } }
可见第一次存放java1成功,第二次存放java1失败。
-----------------------------------------------------------------------------------
HashSet存放自定义元素
添加自定义元素,打印自定义元素,去除重复元素
import java.util.*; public class HashSetTest{ public static void main(String[] args){ HashSet hs = new HashSet(); hs.add(new Person("a1",11)); hs.add(new Person("a2",12)); hs.add(new Person("a2",12)); hs.add(new Person("a3",13)); hs.add(new Person("a4",14)); Iterator it = hs.iterator(); while(it.hasNext()){ Person p = (Person)it.next(); sop(p.getName()+"::"+p.getAge()); } } public static void sop(Object obj){ System.out.println(obj); } } class Person{ private String name; private int age; Person(String name,int age){ this.name = name; this.age = age; } public boolean equals(Object obj){ if(!(obj instanceof Person)) return false; Person p =(Person)obj; return this.name.equals(p.name)&&this.age == p.age;//这里的equals是字符串中的equals } public String getName(){ return name; } public int getAge(){ return age; } }
这里发现,即使在Person类中复写了equals方法,还是出现了重复元素。这是因为对于HashSet,首先判断的是地址值,如果地址值都不一样,那么就不用调用equals方法。
现在要做的就是要在Person类中复写HashCode方法,建立自己的哈希值,根据判断条件建立(这里是根据姓名与年龄),因为每个字符串都有自己的哈希值,所以:
import java.util.*; public class HashSetTest{ public static void main(String[] args){ HashSet hs = new HashSet(); hs.add(new Person("a1",11)); hs.add(new Person("a2",12)); hs.add(new Person("a2",12)); hs.add(new Person("a3",13)); hs.add(new Person("a4",14)); Iterator it = hs.iterator(); while(it.hasNext()){ Person p = (Person)it.next(); sop(p.getName()+"::"+p.getAge()); } } public static void sop(Object obj){ System.out.println(obj); } } class Person{ private String name; private int age; Person(String name,int age){ this.name = name; this.age = age; } public int hashCode(){ return name.hashCode()+age; } public boolean equals(Object obj){ if(!(obj instanceof Person)) return false; Person p =(Person)obj; return this.name.equals(p.name)&&this.age == p.age;//这里的equals是字符串中的equals } public String getName(){ return name; } public int getAge(){ return age; } }
事实上,因为相同字符串的哈希值也一样,所以实际上,本代码中第二次添加“a2”,12的时候,程序先比较了哈希值,发现哈希值相同,接着调用了被复写的equals方法,发现还是相同,才没有被写入到集合中去
结论:HashSet是如何保证元素的唯一性的呢?是通过元素的两个方法:hashCode和equals来完成。如果元素的HashCode值相同,才会判断equals是否为true。如果元素的hashCode值不同,才会调用equals()。
--------------------------------------------------------------------
HashCode判断和删除
对于判断元素是否存在,以及删除等操作,以来的方法是元素的hashcode和equals方法,先判断前者
相关文章推荐
- 欢迎使用CSDN-markdown编辑器
- 使用RxJava优化Retrofit请求
- java中常用的数据类型
- 关于springmvc静态资源访问
- JDK
- java --String 常用方法源码整理
- javaMail的java邮件
- Java中的main方法
- Java Nio 十四、Java NIO vs. IO
- JVM 进行线程同步背后的原理
- java --HashMap和HashTable区别
- spring如何下载源码和jar包
- 深入理解Spring--动手实现一个简单的SpringIOC容器
- JAVA基础(一)序列化,反序列化,java的序列化
- HashMap学习
- java开发命名规范
- 输出随机数字的认证图片
- 【结构型模式】桥接模式(Bridge)之23种java设计模式
- 关于spring的那点事
- 重新学javaweb---ServletContext