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

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

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

一、HashSet集合

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

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

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

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

import java.util.HashSet;
import java.util.Iterator; public class Main
{
public static void main(String[] args)
{
HashSet hash = new HashSet();
hash.add("123");
hash.add("456");
hash.add("asd");
hash.add("789");
Iterator it = hash.iterator();
while(it.hasNext()){
System.out.println(it.next());
}
}
}

哈希表

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

总结

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

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

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

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

哈希表演示

import java.util.HashSet;
import java.util.Iterator;
class Man extends Object//必须继承Object类才干复写HshCode,equals
{
private String name;
private int age;
public Man() {
super();
// TODO Auto-generated constructor stub
}
public Man(String name, int age) {
super();
this.name = name;
//System.out.println("1号"+this);
this.age = age;
}
@Override
public int hashCode() {
final int prim = 31;
//System.out.println("namecode = "+name.hashCode());
return name.hashCode()+age*prim;
}
@Override
public boolean equals(Object obj) {
if(this == obj)
return true;
//System.out.println("2号"+this);
if(!(obj instanceof Man))
throw new ClassCastException("类型错误");
Man m = (Man)obj;
return this.name.equals(m.name) && this.age == m.age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
public class Main
{
public static void main(String[] args)
{
HashSet hash = new HashSet();
hash.add(new Man("a",11));
hash.add(new Man("b",12));
hash.add(new Man("c",13));
hash.add(new Man("a",11));
Iterator it = hash.iterator();
while(it.hasNext()){
Man M = (Man)it.next();
System.out.println(M.getName()+"....."+M.getAge());
}
}
}

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

练习

关于ArrayList的演示

import java.util.ArrayList;
import java.util.HashSet;
import java.util.Iterator;
class Man extends Object
{
private String name;
private int age;
public Man() {
super();
// TODO Auto-generated constructor stub
}
public Man(String name, int age) {
super();
this.name = name;
this.age = age;
} @Override
public boolean equals(Object obj) {
if(this == obj)
return true;
if(!(obj instanceof Man))
throw new ClassCastException("类型错误");
Man m = (Man)obj;
return this.name.equals(m.name) && this.age == m.age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
public class Main
{
public static void main(String[] args)
{
ArrayList AL = new ArrayList();
AL.add(new Man("a",11));
AL.add(new Man("b",12));
AL.add(new Man("c",13));
AL.add(new Man("a",11));
printf(AL);
AL = ArrayListHashDemo(AL);
printf(AL);
System.out.println(AL.remove(new Man("a",11)));
printf(AL);
}
public static ArrayList ArrayListHashDemo(ArrayList al) {
ArrayList temp = new ArrayList();
Iterator it = al.iterator();
while(it.hasNext())
{
Object obj = it.next();
if(!temp.contains(obj))
temp.add(obj);
}
return temp;
}
public static void printf(ArrayList al)
{
Iterator it = al.iterator();
while(it.hasNext())
{
Man man = (Man)it.next();
System.out.print(man.getName()+".."+man.getAge()+",");
}
System.out.printf("\n");
}
}

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

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

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

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. HDOJ 1423 Greatest Common Increasing Subsequence(dp)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1423 思路分析:[问题定义]给定两个序列A[0, 1,..., m]和B[0, 1, ..., n], ...

  2. Network of Schools(强连通分量+缩点) (问添加几个点最少点是所有点连接+添加最少边使图强连通)

    Network of Schools Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 13801   Accepted: 55 ...

  3. 如何在自己的Activity中去控制EditText的焦点

    在进入一个Activity时,如果这个Activity中有EditText,则这个EditText会自动获取焦点,然后就会弹出软键盘,这样给用户体验不是很好.所以一般会通过代码控制让EditText不 ...

  4. ASP.NET页面传值的几种方式

    页面传值是学习asp.net初期都会面临的一个问题,总的来说有页面传值. 存储对象传值.ajax.类.model.表单等!下面欧柏泰克和大家一起来看看asp.net页面传值方式一般有哪些?常用的较简单 ...

  5. SharePoint网站集功能介绍

    SharePoint网站集功能介绍 https://support.office.com/zh-cn/article/%E5%90%AF%E7%94%A8%E6%88%96%E7%A6%81%E7%9 ...

  6. javaEE的13种核心技术规范

    javaEE平台由一整套服务(Services).应用程序接口(APIs)和协议构成,它对开发基于Web的多层应用提供了功能支持,下面对javaEE中的13种技术规范进行简单的记录:   J2EE中的 ...

  7. 一个简单二叉树的C++实现(一)

    很久没有接触二叉树了,写这个当作练手,接下来会比较详细地实现二叉树的各个功能及应用. /* * BinaryTree.cpp * Author: Qiang Xiao * Time: 2015-07- ...

  8. vmware能够ping通内网,上不了外网的解决方法

    一般这是由于里面的路由域名服务器没有配置好. issta@ubuntu:~$ ping www.baidu.com ping: unknown host www.baidu.com 先看一下地址解析器 ...

  9. BZOJ 1652: [Usaco2006 Feb]Treats for the Cows( dp )

    dp( L , R ) = max( dp( L + 1 , R ) + V_L * ( n - R + L ) , dp( L , R - 1 ) + V_R * ( n - R + L ) ) 边 ...

  10. JavaScript基础知识----基本语法

    JavaScript 语句 JavaScript 语句向浏览器发出的命令.语句的作用是告诉浏览器该做什么. 分号 ; 分号用于分隔 JavaScript 语句. 通常我们在每条可执行的语句结尾添加分号 ...