查看源码:

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. 命令查看linux主机配置

    查看cpu: # 总核数 = 物理CPU个数 X 每颗物理CPU的核数 # 总逻辑CPU数 = 物理CPU个数 X 每颗物理CPU的核数 X 超线程数 # 查看物理CPU个数 cat /proc/cp ...

  2. 【转】燃烧吧,TestMice!

    ...当我们几个人碰面的时候,就感觉应该做点测试业内的实事. 记得当时的17站出了一些QTP辅件,给了我一些灵感.2008年做了一整年的QTP企业级实施,从方案到最后的收尾支持,得到最大的教训就是,当 ...

  3. eclipse安装emmet插件

    http://www.cnblogs.com/matchless/archive/2013/04/10/3011973.html

  4. [Laravel] 03 - DB facade, Query builder & Eloquent ORM

    连接数据库 一.Outline 三种操作数据库的方式. 二.Facade(外观)模式 Ref: 解读Laravel,看PHP如何实现Facade? Facade本质上是一个“把工作推给别人做的”的类. ...

  5. docker 搭建ntp服务器

    背景 在搭建etcd集群时,如果主机时间相差太多会出现同步错误,如果外部网络不可用时,需要使用内部的ntp服务器同步时间. 构建ntp镜像 创建Dockerfile # usage: # docker ...

  6. python3 日志检索异常抛出异常 raise KeyError(key),KeyError: 'formatters'

    原因分析,python3启动时,检索的不是项目包下的目录文件,所以日志文件必须指明路径.我原来的日志方式是: import logging.config log_path = "mlpcap ...

  7. AngularJS基础02 神奇的数据绑定(Binding)

    作者:arccosxy  转载请注明出处:http://www.cnblogs.com/arccosxy/ 上一节,我们在JS中声明一个scope变量然后在HTML直接访问它,这非常的酷.但是Angu ...

  8. Thrift版本管理

    对于健壮的服务,其中的数据类型必须一种机制来对其进行版本管理,尤其是它可以在不中断服务(或者更坏的情况,出现段错误)的前提下,增加或删除一个对象中的字段,或者改变一个函数的参数列表. 字段标识符 Th ...

  9. scala breeze使用替换底层线性库

    scala -J-Dcom.github.fommil.netlib.NativeSystemBLAS.natives=mkl_rt.dll -cp "D:\betn\Scala\Scala ...

  10. STL 标准模板库

    <vector> 可变长的数组 Vector<int>v int是一个模板参数,这样传进来的都会是int V.push_back(a)将a传进v,且放在最后一个 V.clear ...