--------------------ASP.Net+Android+IOS开发.Net培训、期待与您交流! --------------------

1.Set

Set是Collection接口的子接口,此集合中不能存放重复元素,对于比较方式是根据他们的底层结构决定的,常见的子类有:HashSet和TreeSet

2.HashSet

1. 概述

底层是哈希表:哈希值是Object类中哈希方法返回的值,读取此集合中的元素是必须使用迭代器,比较的时候,先是比较的哈希值,如果哈希值相同那么就比较equals方法。

2. 无序性

 package www.fuxi.jihe;

import java.util.HashSet;
import java.util.Iterator; public class HashSetDemo {
public static void main(String[]args) {
HashSet set = new HashSet();// HashSet对象
set.add("java01");
set.add("java02");// 添加元素
set.add("java03");
Iterator it = set.iterator();// 迭代器读取数据
while (it.hasNext()) {
System.out.println(it.next());
} } }
结果:
java02
java03
java01

从结果可以看出,他们的读取出来的顺序和存入的顺序是不同的,所以说明他们元素是无序的。

3. 不可重复性


 package www.fuxi.jihe;
import java.util.HashSet;
import java.util.Iterator;
public class HashSetDemo {
public static void main(String[] args) {
HashSet set = new HashSet();// HashSet对象
set.add("java01");
set.add("java02");// 添加元素
set.add("java03");
System.out.println("java02是否存储集合中:"+set.add("java02"));
Iterator it = set.iterator();// 迭代器读取数据
while (it.hasNext()) {
System.out.println(it.next());
} } }
结果:
java02是否存储集合中:false
java02
java03
java01
从结果可以看出他们java02没有存储里面,所以,集合中不能存储相同的元素

4.比较的原理


他们首先比较的哈希值,如果哈希值相同,那么他们就开始比较他们的equals方法,同时也可以自定义比较规则,就是重写HashCode()和equals()方法。

重写的时候一定要和Object类中定义的一样,equals的参数是Object类型,public boolean equals(Object ob){},public int hashCode();

在这里也说一下ArrayList和LinkedList集合,他们的比较方式,他们就是基于equals方法

package www.fuxi.jihe;
public class Person {
private String name;// 姓名
private int age;// 年龄 public Person(String name, int age) {
super();
this.name = name;
this.age = age;
} public String getName() {
return name;
} public int getAge() {
return age;
} /*
* 这个重写hashCode()方法,在这里返回的哈希值是一样的,为了测试是不是调用的此方法,若哈希值相同,调用的是否是equals()方法
*/
public int hashCode() {
System.out.println(this.getName() + "--hashCode()");
return 20;
} /* equals()方法重写 */
public boolean equals(Object ob) {
if (!(ob instanceof Person)) {
return false;
} Person p = (Person) ob;
System.out.println(this.getName() + "--equals---" + p.getName());
return this.name.equals(p.name) && this.age == p.age;
}
}
package www.fuxi.jihe;
import java.util.HashSet;
import java.util.Iterator;
public class HashSetDemo {
publicstatic void main(String[] args) {
HashSetset = new HashSet();// HashSet对象
set.add(newPerson("zhangsan",21));
set.add(newPerson("lisi",22));// 添加元素
set.add(newPerson("zhangsan",21)); System.out.println("读取集合中的元素:");
Iteratorit = set.iterator();// 迭代器读取数据
while(it.hasNext()) {
Personob=(Person)it.next();
System.out.println(ob.getName()+":"+ob.getAge());
} } }
结果:
zhangsan--hashCode()
lisi--hashCode()
lisi--equals---zhangsan
zhangsan--hashCode()
zhangsan--equals---lisi
zhangsan--equals---zhangsan
读取集合中的元素:
lisi:22
zhangsan:21

从结果中可以看出,每次存储对象后,都会调用hashCode()方法,在这个哈希值都一样,所以她们都会再次调用equals方法,

但是如果你没有重写hashCode()方法,那么每次添加新的对象若都使用了new创建的对象,那么他们的hashCode()的是不一样,所以我们可以自定义hashCode和equals方法

如果我们hashCode()方法重写的恰到好处的话,那么equals方法减少了比较次数。

package www.fuxi.jihe;

public class Person {
private String name;// 姓名
private int age;// 年龄 public Person(String name, int age) {
super();
this.name = name;
this.age = age;
} public String getName() {
return name;
} public int getAge() {
return age;
} /*
* 重写hashCode()方法,这样的哈希值差不多都很难不一样的
*/
public int hashCode() {
return this.name.hashCode()+this.age*56;
} /* equals()方法重写 */
public boolean equals(Object ob) {
if (!(ob instanceof Person)) {
return false;
} Person p = (Person) ob;
System.out.println(this.getName() + "--equals---" + p.getName());
return this.name.equals(p.name) && this.age == p.age;
}
}

在这里说一下,对于集合存储的自定义对象,那么使用读取出来的是Object类型,所以我们要是使用对象的方法,那么我需要把其强制类型转换为我们需要的类型。

3. HashSet的删除和判断

package www.fuxi.jihe;

public class Person {
private String name;// 姓名
private int age;// 年龄 public Person(String name, int age) {
super();
this.name = name;
this.age = age;
} public String getName() {
return name;
} public int getAge() {
return age;
} /*
* 重写hashCode()方法,这样的哈希值差不多都很难不一样的
*/
public int hashCode() {
int code = this.name.hashCode() + this.age * 56;
System.out.println(this.name + ":"+this.age+"---Code=" + code);
return code;
} /* equals()方法重写 */
public boolean equals(Object ob) {
if (!(ob instanceof Person)) {
return false;
} Person p = (Person) ob;
System.out.println(this.getName() + "--equals---" + p.getName());
return this.name.equals(p.name) && this.age == p.age;
}
}
packagewww.fuxi.jihe;
importjava.util.HashSet;
importjava.util.Iterator;
public classHashSetDemo {
public static void main(String[] args) {
HashSet set = new HashSet();//HashSet对象
set.add(newPerson("zhangsan",21));
set.add(newPerson("lisi",22));// 添加元素
set.add(newPerson("zhangsan",21)); System.out.println("是否存此对象:"+set.contains(new Person("lisi",22))); System.out.println("是否存此对象:"+set.contains(newPerson("wangwu",20))); System.out.println("移除此对象:"+set.remove(newPerson("zhangsan",21)));
} }
结果:
zhangsan:21---Code=-1432603380
lisi:22---Code=3323235
zhangsan:21---Code=-1432603380
zhangsan--equals---zhangsan
lisi:22---Code=3323235
lisi--equals---lisi
是否存此对象:true
wangwu:20---Code=-795135871
是否存此对象:false
zhangsan:21---Code=-1432603380
zhangsan--equals---zhangsan
移除此对象:true

从结果中可以看出也是在判断的时候也是依赖于hashCode()和equals()方法,在这里hashCode()方法设置的比较巧妙,哈希值都不一样,所以没有机会执行equals方法

--------------------ASP.Net+Android+IOS开发.Net培训、期待与您交流! --------------------

黑马程序员_<<Set,HashSet>>的更多相关文章

  1. 黑马程序员_<<String类>>

    --------------------ASP.Net+Android+IOS开发..Net培训.期待与您交流! -------------------- 1. String类 1.概述 String ...

  2. 大数据-将MP3保存到数据库并读取出来《黑马程序员_超全面的JavaWeb视频教程vedio》day17

    黑马程序员_超全面的JavaWeb视频教程vedio\黑马程序员_超全面的JavaWeb教程-源码笔记\JavaWeb视频教程_day17-资料源码\day17_code\day17_1\ 大数据 目 ...

  3. 2016年8月17日 内省(1)18_黑马程序员_使用beanUtils操纵javabean

    8.内省(1):18_黑马程序员_使用beanUtils操纵javabean 1.导入两个包: 2.调用静态方法. 9.泛型 map.entrySet() :取出map集合的键值对组成一个set集合. ...

  4. 黑马程序员_高新技术之javaBean,注解,类加载器

    ----------- android培训.java培训.java学习型技术博客.期待与您交流! ---------- 第一部分 javaBean 一,由内省引出javaBean 1,内省: 内省对应 ...

  5. JavaWeb开发之四:servlet技术 黑马程序员_轻松掌握JavaWeb开发之四Servlet开发 方立勋老师视频教程相当的经典

    总结: 记住:servlet对象在应用程序运行的过程中只创建一次,浏览器每次访问的时候,创建reponse对象 request对象,然后调用servlet的service方法,reponse对象和re ...

  6. 黑马程序员_ JAVA中的多线程

    ------- android培训.java培训.期待与您交流! ---------- 尽管线程对象的常用方法可以通过API文档来了解,但是有很多方法仅仅从API说明是无法详细了解的. 本来打算用一节 ...

  7. 黑马程序员_ Objective-c 面向对象笔记详解

    1)类,对象,方法 类 类名: 1) 类名的第一个字母必须是大写 2) 不能有下划线 3) 多个英文单词,用驼峰标识 类的声明和实现 类的声明 @interface 类名 : NSObject { @ ...

  8. 黑马程序员_ Objective-c 概述及面向对象与三大特性

    -----------android培训.java培训.java学习型技术博客.期待与您交流!------------ (一).语法概述 1. oc介绍:(.m文件) 1> c语言的基础上,增加 ...

  9. 黑马程序员_ Objective-c 之block、protocol学习笔记

    一):block学习总结 block :用来保存一段代码. 1.block 特点:  1> Block封装了一段代码,可以在任何时候执行   2> Block可以作为函数或者函数的返回值, ...

  10. 黑马程序员——OC语言 类和对象

    Java培训.Android培训.iOS培训..Net培训.期待与您交流! (以下内容是对黑马苹果入学视频的个人知识点总结) (一)类 1)类的声明 代码编写 ①定义一个Car类,拥有2个属性:轮子数 ...

随机推荐

  1. HBase 5、Phoenix使用

    1.建表 执行建表语句 $ . ../examples/stock_symbol.sql 其中../examples/stock_symbol.sql是建表的sql语句 CREATE TABLE IF ...

  2. hdu 5441 Travel(并查集)

    Problem Description Jack likes to travel around the world, but he doesn’t like to wait. Now, he is t ...

  3. Html、CSS、JavaScript 实时效果在线编辑器 - 学习的好工具,算不算?!

    关于 二维码 与 NFC 之间的出身贫贱说 太阳火神的漂亮人生 (http://blog.csdn.net/opengl_es) 本文遵循"署名-非商业用途-保持一致"创作公用协议 ...

  4. 面试前的准备---C#知识点回顾----01

    过完年来,准备找份新工作,虽然手里的工作不错,但树挪死,人挪活.咱不能一直在一个坑里生活一辈子,外面的世界毕竟是很美好的. 为了能正常的找到自己中意的工作,最近是将所有的基础知识拿出来复习了一次.仅作 ...

  5. Hortonworks 用于做 Sentimental Analysis的Hiveddl.sql 文件

    The hiveddl.sql script has performed the following steps to refine the data: Converted the raw Twitt ...

  6. 使用 Camtasia Recorder显示 “ camtasia an error occurred in the recorder: video codec open failed ”

    这是因为本机没有codec的缘故,可以下载一个:tscc解码器(TechSmith Screen Capture Codec) 2.0.3.0 安装版 http://www.cngr.cn/dir/2 ...

  7. Spring整合Hibernate 一 - 注入SessionFactory

    Spring3 整合 Hibernate4 - 注入SessionFactory 版本: spring-framework-3.2.4.RELEASE hibernate-release-4.2.5. ...

  8. SDP协议

    会话描述协议(SDP)为会话通知.会话邀请和其它形式的多媒体会话初始化等目的提供了多媒体会话描述.它只是用来描述,而不是一种传输协议.举例,在SIP协议的Message Header的Content- ...

  9. UVA 11214 Guarding the Chessboard

    题意: 皇后防御的范围是他所在横.竖.对角线,地图上的#为可以放旗子的地方.问最少放几个皇后能防守所有#. 分析: vis数组开4维,对应行.列.主对角线.副对角线 代码: #include < ...

  10. 设计模式之桥接模式(Bridge)--结构模型

    1.意图 将抽象部分与它的实现部分分离,使它们可以独立地变化. 2.适用性 你不希望在抽象和它的实现部分之间有一个固定的绑定关系. 类的抽象与它的实现都应该可以通过子类的方式加以扩展. 抽象部分与实现 ...