随着Java学习的深入,感觉大一时搞了一年的ACM,简直是明智之举,Java里非常多数据结构、算法类的东西,理解起来就轻松多了

Set集合下有两大子类开发经常使用 HashSet集合 、TreeSet集合

Set集合的元素是不反复且无序

一、HashSet集合

API文档解释:此类实现
Set
接口,由哈希表(实际上是一个 HashMap 实例)支持。

它不保证 set 的迭代顺序;特别是它不保证该顺序恒久不变。此类同意使用null 元素。

此类为基本操作提供了稳定性能,注意。此实现不是同步的。

由上能够总结出:HashSet集合的方法:内部数据结构是哈希表,且不同步,不管反复元素有多少。仅仅存一个。

  1. import java.util.HashSet;
  2. import java.util.Iterator;
  3.  
  4. public class Main
  5. {
  6. public static void main(String[] args)
  7. {
  8. HashSet hash = new HashSet();
  9. hash.add("123");
  10. hash.add("456");
  11. hash.add("asd");
  12. hash.add("789");
  13. Iterator it = hash.iterator();
  14. while(it.hasNext()){
  15. System.out.println(it.next());
  16. }
  17. }
  18. }

哈希表

    数据经过哈希算法存储,会经过两次推断,第一此推断位置。第二次会推断内容。比方“ab”已经存储了,“ba”经过算法得到的位置是“ab”的位置,这时要经过第二次推断,确定内容是否同样。不同样会通过过算法得到新的位置,ACM里通常会经过线性探測再散列或者是链地址法

总结

哈希表推断元素是否同样:

1.推断的是两个元素的哈希值是否同样,假设同样,再推断两个对象的内容是否同样

2.推断哈希值同样。HashCode方法(返回此字符串的哈希码)。推断内容同样。equals方法

注:哈希值不同,就不须要第二次推断内容是否同样

哈希表演示

  1. import java.util.HashSet;
  2. import java.util.Iterator;
  3. class Man extends Object//必须继承Object类才干复写HshCode,equals
  4. {
  5. private String name;
  6. private int age;
  7. public Man() {
  8. super();
  9. // TODO Auto-generated constructor stub
  10. }
  11. public Man(String name, int age) {
  12. super();
  13. this.name = name;
  14. //System.out.println("1号"+this);
  15. this.age = age;
  16. }
  17. @Override
  18. public int hashCode() {
  19. final int prim = 31;
  20. //System.out.println("namecode = "+name.hashCode());
  21. return name.hashCode()+age*prim;
  22. }
  23. @Override
  24. public boolean equals(Object obj) {
  25. if(this == obj)
  26. return true;
  27. //System.out.println("2号"+this);
  28. if(!(obj instanceof Man))
  29. throw new ClassCastException("类型错误");
  30. Man m = (Man)obj;
  31. return this.name.equals(m.name) && this.age == m.age;
  32. }
  33. public String getName() {
  34. return name;
  35. }
  36. public void setName(String name) {
  37. this.name = name;
  38. }
  39. public int getAge() {
  40. return age;
  41. }
  42. public void setAge(int age) {
  43. this.age = age;
  44. }
  45. }
  46. public class Main
  47. {
  48. public static void main(String[] args)
  49. {
  50. HashSet hash = new HashSet();
  51. hash.add(new Man("a",11));
  52. hash.add(new Man("b",12));
  53. hash.add(new Man("c",13));
  54. hash.add(new Man("a",11));
  55. Iterator it = hash.iterator();
  56. while(it.hasNext()){
  57. Man M = (Man)it.next();
  58. System.out.println(M.getName()+"....."+M.getAge());
  59. }
  60. }
  61. }

特别注意:上述代码的1号和2号两个this,代表的对象不同,不能混淆

练习

关于ArrayList的演示

  1. import java.util.ArrayList;
  2. import java.util.HashSet;
  3. import java.util.Iterator;
  4. class Man extends Object
  5. {
  6. private String name;
  7. private int age;
  8. public Man() {
  9. super();
  10. // TODO Auto-generated constructor stub
  11. }
  12. public Man(String name, int age) {
  13. super();
  14. this.name = name;
  15. this.age = age;
  16. }
  17.  
  18. @Override
  19. public boolean equals(Object obj) {
  20. if(this == obj)
  21. return true;
  22. if(!(obj instanceof Man))
  23. throw new ClassCastException("类型错误");
  24. Man m = (Man)obj;
  25. return this.name.equals(m.name) && this.age == m.age;
  26. }
  27. public String getName() {
  28. return name;
  29. }
  30. public void setName(String name) {
  31. this.name = name;
  32. }
  33. public int getAge() {
  34. return age;
  35. }
  36. public void setAge(int age) {
  37. this.age = age;
  38. }
  39. }
  40. public class Main
  41. {
  42. public static void main(String[] args)
  43. {
  44. ArrayList AL = new ArrayList();
  45. AL.add(new Man("a",11));
  46. AL.add(new Man("b",12));
  47. AL.add(new Man("c",13));
  48. AL.add(new Man("a",11));
  49. printf(AL);
  50. AL = ArrayListHashDemo(AL);
  51. printf(AL);
  52. System.out.println(AL.remove(new Man("a",11)));
  53. printf(AL);
  54. }
  55. public static ArrayList ArrayListHashDemo(ArrayList al) {
  56. ArrayList temp = new ArrayList();
  57. Iterator it = al.iterator();
  58. while(it.hasNext())
  59. {
  60. Object obj = it.next();
  61. if(!temp.contains(obj))
  62. temp.add(obj);
  63. }
  64. return temp;
  65. }
  66. public static void printf(ArrayList al)
  67. {
  68. Iterator it = al.iterator();
  69. while(it.hasNext())
  70. {
  71. Man man = (Man)it.next();
  72. System.out.print(man.getName()+".."+man.getAge()+",");
  73. }
  74. System.out.printf("\n");
  75. }
  76. }

API文档关于contains的解释:假设列表包括指定的元素。则返回 true。更确切地讲,当且仅当列表包括满足(o==null ?

e==null : o.equals(e)) 的元素e 时才返回true

所以对于ArrayList集合,contains的推断与equals有关,而HashSet与HashCode和equals有关

  1. System.out.println(AL.remove(new Man("a",11)));//同理。remove也是有equals有关,仅仅推断内容

JAVA学习第三十六课(经常使用对象API)— Set集合:HashSet集合演示的更多相关文章

  1. JAVA学习第三十四课 (经常使用对象API)—List集合及其子类特点

    整个集合框架中最经常使用的就是List(列表)和Set(集) 一.List集合 && Set的特点 Collection的子接口: 1.List:有序(存入和取出的顺序一致),元素都有 ...

  2. JAVA学习第四十六课 — 其它对象API(二)Date类 & Calendar类(重点掌握)

    Date类(重点) 开发时,会时常遇见时间显示的情况,所以必须熟练Date的应用 <span style="font-family:KaiTi_GB2312;font-size:18p ...

  3. JAVA学习第三十二课(经常使用对象API)- 基本数据类型对象包装类

    将基本数据类型(8种:int..)封装成对象的优点就是能够在对象中封装很多其它的功能和方法来操控该数据 常见的操作就是:用于基本数据类型与字符串之间的转换 基本数据类型对象包装类一般用于基本类型和字符 ...

  4. JAVA学习第四十五课 — 其它对象API(一)System、Runtime、Math类

    一.System类 1. static long currentTimeMillis() 返回以毫秒为单位的当前时间. 实际上:当前时间与协调世界时 1970 年 1 月 1 日午夜之间的时间差(以毫 ...

  5. 风炫安全web安全学习第三十六节课-15种上传漏洞讲解(一)

    风炫安全web安全学习第三十六节课 15种上传漏洞讲解(一) 文件上传漏洞 0x01 漏洞描述和原理 文件上传漏洞可以说是日常渗透测试用得最多的一个漏洞,因为用它获得服务器权限最快最直接.但是想真正把 ...

  6. NeHe OpenGL教程 第三十六课:从渲染到纹理

    转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线 ...

  7. 风炫安全WEB安全学习第三十八节课 越权漏洞演示与讲解

    风炫安全WEB安全学习第三十八节课 越权漏洞演示与讲解 越权漏洞 0x01 漏洞介绍 越权漏洞的危害与影响主要是与对应业务的重要性相关,比如说某一页面服务器端响应(不局限于页面返回的信息,有时信息在响 ...

  8. 风炫安全web安全学习第三十三节课 文件包含漏洞基础以及利用伪协议进行攻击

    风炫安全web安全学习第三十三节课 文件包含漏洞基础以及利用伪协议进行攻击 文件包含漏洞 参考文章:https://chybeta.github.io/2017/10/08/php文件包含漏洞/ 分类 ...

  9. 风炫安全web安全学习第三十节课 命令执行&代码执行基础

    风炫安全web安全学习第三十节课 命令执行&代码执行基础 代码执行&命令执行 RCE漏洞,可以让攻击者直接向后台服务器远程注入操作系统命令或者代码,从而控制后台系统. 远程系统命令执行 ...

随机推荐

  1. mrtg监控网络流量简单配置

    Mrtg服务器搭建(监控网络流量) [日期:2012-07-03] 来源:Linux社区  作者:split_two [字体:大 中 小]   [实验环境] 监控机:Red Hat linux 5.3 ...

  2. hdoj 3478 Catch(二分图判定+并查集)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3478 思路分析:该问题需要求是否存在某一个时刻,thief可能存在图中没一个点:将该问题转换为图论问题 ...

  3. 七、cocos2dx之粒子系统

    本文由qinning199原创,转载请注明:http://www.cocos2dx.net/?p=66 一.介绍 粒子系统指的是一个使用大量很小的精灵或者其他的一些绘制对象模拟一些模糊效果.使用传统的 ...

  4. leetcode第一刷_Construct Binary Tree from Inorder and Postorder Traversal

    这道题是为数不多的感觉在读本科的时候见过的问题. 人工构造的过程是如何呢.兴许遍历最后一个节点一定是整棵树的根节点.从中序遍历中查找到这个元素,就能够把树分为两颗子树,这个元素左側的递归构造左子树,右 ...

  5. css精灵(css script 技术)

    上班差不多有15天了,感觉每天都有写不完的也页面,每天都有不同的东西需要学习进步,很充实哦.今天接触到css精灵这个东西.其实之前有看过这种技术,但是没有操作过,只是听说这个技术很强大,能干嘛干嘛,但 ...

  6. UIButton 动态改变文本闪烁问题

    当动态改变(比如一秒改变一次)按钮的Title的时候发现按钮每次都要闪烁一下:解决方法如下: self.settleButton.titleLabel.text = title; [self.sett ...

  7. BZOJ 1627: [Usaco2007 Dec]穿越泥地( BFS )

    BFS... --------------------------------------------------------------------------------------- #incl ...

  8. webviewactivity

    WebView注意点,注释里有说明 package com.example.suneyaenews; import com.example.http.HttpThread; import androi ...

  9. ThinkPHP第四天(U函数,URL类型参数配置,伪静态后缀名配置,数据传递与获取$_GET等)

    1.U('地址','参数','伪静态','是否跳转','是否显示域名'); 在模板中使用U方法而不是固定写死URL地址的好处在于,一旦你的环境变化或者参数设置改变,你不需要更改模板中的任何代码. 在模 ...

  10. Nginx简单操作

    Nginx简单操作 平滑重启:读取配置文件,正确后启动新nginx,关闭旧服务进程 # kill HUP nginx.pid # /usr/sbin/nginx -c /etc/nginx/nginx ...