查看源码:

HashSet底层new 了HashMap

哈希表的结构:

Demo:

package cn.sasa.demo2;

import java.util.HashSet;
import java.util.Iterator;
import java.util.LinkedHashSet; public class SetDemo {
public static void main(String[] args) {
//HashSet的特点
//无序、无索引、元素不重复
//取出元素可以使用iterator迭代器、增强for
//主要的两个子类:HashSet/LinkedHashSet //====================HashSet===================
//HashSet的数据结构:
//HashSet是一个链表数组结合体,查询、增删都比较快
//初始容量:数组长度默认16
//加载因子:0.75
//
HashSet<String> shs = new HashSet<String>();
shs.add("sasa");
shs.add("aaa");
shs.add("bbb");
shs.add("ds");
shs.add("aaa");//重复元素不存入 System.out.println(shs.toString()); //[aaa, bbb, sasa, ds] 无序的,并没有按照存入的顺序存储 System.out.println("=======================");
//取出方式1
Iterator<String> it = shs.iterator();
while(it.hasNext()) {
System.out.println(it.next());
}
System.out.println("=======================");
//取出方式2
for(String s : shs) {
System.out.println(s);
}
System.out.println("=======================");
/**
* 存入原理
* 1、调用hashCode()算出哈希值
* 2、查找容器中是否有与新元素一样的哈希值
* 如果没有,直接存入,如果有,转第三步
* 3、新元素与该索引下的老元素利用equals方法对比,如果新元素.equals(老元素)返回true,说明重复,不存入,
* 如果equals方法返回false,存入
*/
//内存地址不同,调用Object的hashCode()返回不同的哈希值,重写hashCode()和equals方法判断对象是否相同
HashSet<Person> personSet = new HashSet<Person>();
personSet.add(new Person("sa",11));
personSet.add(new Person("sa",11));
personSet.add(new Person("hi",12));
personSet.add(new Person("lalala",13));
//personSet.add(null);
//personSet.add(null);//HashSet里可以存null值,但取出来的时候因为类型转换不成功,会报错
System.out.println(personSet.size());//
System.out.println("=======================");
Iterator<Person> itPer = personSet.iterator();
while(itPer.hasNext()) {
System.out.println(itPer.next().getName());
} System.out.println("===================LinkedHashSet===================");
LinkedHashSet<String> intLinhss = new LinkedHashSet<String>();
intLinhss.add("sasa");
intLinhss.add("aaa");
intLinhss.add("bbb");
intLinhss.add("ds");
intLinhss.add("aaa");//重复元素不存入
for(String s : intLinhss) {
System.out.println(s);
}
//输出:
//sasa
//aaa
//bbb
//ds
//LinkedHashSet 双向链表结构,有序的
}
}
package cn.sasa.demo2;

public class Person {
private String name;
private int 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 Person(String name,int age) {
this.name = name;
this.age = age;
}
//重写equals
public boolean equals(Object obj) {
if(this == obj)
return true;
if(obj == null)
return false;
if(obj instanceof Person) {
Person p = (Person)obj;
if(this.name == p.getName() && this.age == p.getAge() ) {
return true;
}else {
return false;
}
}
return false;
} //重写hashCode() 为了尽量避免hashCode出现同样值的概率,age * 31,后面的数可以是除了1和0之外的数
public int hashCode() {
return this.name.hashCode() + age * 31;
}
}

java 集合(四)HashSet 与 LinkedHashSet的更多相关文章

  1. Java 集合:HashSet 与 ArrayList

    Set 集合是无序不可以重复的的.List 集合是有序可以重复的. Java 集合:HashSet 与 hashCode.equals 博客里面已经说到这个问题,但是解释的还是不够清楚. 看一个小例子 ...

  2. Java 集合 HashMap & HashSet 拾遗

    Java 集合 HashMap & HashSet 拾遗 @author ixenos 摘要:HashMap内部结构分析 Java HashMap采用的是冲突链表方式 从上图容易看出,如果选择 ...

  3. Java自学-集合框架 HashSet、LinkedHashSet、TreeSet之间的区别

    HashSet. LinkedHashSet.TreeSet之间的区别 步骤 1 : HashSet LinkedHashSet TreeSet HashSet: 无序 LinkedHashSet: ...

  4. 死磕 java集合之HashSet源码分析

    问题 (1)集合(Collection)和集合(Set)有什么区别? (2)HashSet怎么保证添加元素不重复? (3)HashSet是否允许null元素? (4)HashSet是有序的吗? (5) ...

  5. Java集合:HashSet的源码分析

    Java集合---HashSet的源码分析   一.  HashSet概述: HashSet实现Set接口,由哈希表(实际上是一个HashMap实例)支持.它不保证set 的迭代顺序:特别是它不保证该 ...

  6. Java集合之HashSet/TreeSet原理

    Set集合 1.HashSet  只去重复, 没有顺序  HashSet的add方法会调用hashCode和equals, 所以存储在HashSet中的对象需要重写这两个方法. 2.TreeSet   ...

  7. JAVA集合四:比较器--类自定义排序

    参考链接: HOW2J.CN 前言 对于JAVA集合,都能够用集合的工具类Collections 提供的方法: Collections.sort(List list) Collections.sort ...

  8. Java集合学习(6):LinkedHashSet

    一.概述 首先我们需要知道的是它是一个Set的实现,所以它其中存的肯定不是键值对,而是值.此实现与HashSet的不同之处在于,LinkedHashSet维护着一个运行于所有条目的双重链接列表.此链接 ...

  9. Java集合系列-HashSet

    原创文章,转载请标注出处:https://www.cnblogs.com/V1haoge/p/10755431.html 一.概述 HashSet是基于哈希实现的set集合,其实它底层是一个value ...

  10. Java集合之HashSet

    1.HashSet概述: HashSet实现Set接口,由哈希表(实际上是一个HashMap实例)支持.它不保证set 的迭代顺序:特别是它不保证该顺序恒久不变.此类允许使用null元素.HashSe ...

随机推荐

  1. RTMP之后,SRT与QUIC

    RTMP协议存在累计延迟与加密方面的问题,为适应互联网视频低延时,高质量的要求,以UDP为核心,具有创造性的SRT,QUIC等流媒体视频方式将成为新的选择 RTMP协议最初是由Macromedia为通 ...

  2. 【转】彻底搞清C#中cookie的内容

    http://blog.163.com/sea_haitao/blog/static/77562162012027111212610/ 花了2天时间,彻底搞清C#中cookie的内容,搞清以下内容将让 ...

  3. 在Android Studio中查看Sqlite的方法

    只说最好的方法,使用工具stetho:http://facebook.github.io/stetho/ 1.在Gragle中加上如下语句: dependencies { // Stetho core ...

  4. 【SQLSERVER】How to check current pool size

    SELECT des.program_name , des.login_name , des.host_name , COUNT(des.session_id) [Connections] FROM ...

  5. 转载:浅谈 Scala 中下划线的用途

    Scala 作为一门函数式编程语言,对习惯了指令式编程语言的同学来说,会不大习惯,这里除了思维方式之外,还有语法层面的,比如 underscore(下划线)就会出现在多种场合,令初学者相当疑惑,今天就 ...

  6. 【黑金原创教程】【FPGA那些事儿-驱动篇I 】原创教程连载导读【连载完成,共二十九章】

    前言: 无数昼夜的来回轮替以后,这本<驱动篇I>终于编辑完毕了,笔者真的感动到连鼻涕也流下来.所谓驱动就是认识硬件,还有前期建模.虽然<驱动篇I>的硬件都是我们熟悉的老友记,例 ...

  7. vs2017企业版本安装和序列号

    离线包大概下载为19G,可以选择的选择项很多,很不错,安装如下: 安装完成 启动效果 SharePoint插件自带了 离线包(19G) Visual Studio 2017(VS2017) 企业版En ...

  8. php reids 单机命令

    一.Redis连接与认证 //连接参数:ip.端口.连接超时时间,连接成功返回true,否则返回false $ret = $redis->connect('127.0.0.1', 6379, 3 ...

  9. php 逗号 explode分割字符串 或 implode组装成字符串

    php 逗号 分割字符串 介绍两个函数给你 <?php //利用 explode 函数分割字符串到数组 $source = "hello1,hello2,hello3,hello4,h ...

  10. xshell连接Linux、ngix部署

    Linux端安装sshd服务(openssh-server) 查看防火墙:ufw(Linux默认安装了) 再就是客户端了.. 平时在测试环境下的项目不能承载高并发,需要部署到web server上.w ...