查看源码:

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. Odoo小数精度及货币精度详解

    一.小数精度的设置 一般在设置-数据结构-精度设置中就可以对 小数类型的字段进行精度设置: 对于代码中定义为 digits=dp.get_precision('Product Price') 或 di ...

  2. MT7601 WG209模块驱动移植,并连接路由器

    驱动位置: https://github.com/Aplexchenfl/WG209_MT7601 下载之后,查看 Makefile 在这里,我修改了 kernel的位置以及编译器的版本 执行 mak ...

  3. bootstrap学习-初步使用介绍

    准备 下载Bootstrap https://github.com/twbs/bootstrap/releases/download/v3.3.6/bootstrap-3.3.6-dist.zip h ...

  4. const读书笔记

    Const 的使用读书笔记 Const的主要主要用法有: 常变量: const 类型说明符 变量名 常引用: const 类型说明符 &引用名  常对象: 类名 const 对象名 常成员函数 ...

  5. Storm常见模式——流聚合

    转自:http://www.cnblogs.com/panfeng412/archive/2012/06/04/storm-common-patterns-of-stream-join.html 流聚 ...

  6. C艹目录

    c++ 学习路线  c++学习路线 c++ 学习目录 c++ 常用数据类型,命名规则, 不常有数据类型 C++复合类型(数组) C艹复合类型(字符串) C++复合类型(结构体) C++ 结构体和枚举 ...

  7. laravel 5.4 中使用migrate

    1. 创建表结构 a. 命令: php artisan make:migration create_posts_table 2.生产文件 <?php use Illuminate\Support ...

  8. Angular4学习笔记(五)- 数据绑定、响应式编程和管道

    概念 Angular中的数据绑定指的是同一组件中控制器文件(.ts)与视图文件(.html)之间的数据传递. 分类 流向 单向绑定 它的意思是要么是ts文件为html文件赋值,要么相反. ts-> ...

  9. [Unity3D] 04 - Event Manager

    message消息管理 脚本与GameObject的关系 被显式添加到 Hierarchy 中的 GameObject 会被最先实例化,GameObject 被实例化的顺序是从下往上. GameObj ...

  10. spring框架排错

    1.格式错误. http://www.springframework.org/schema/mvc       http://www.springframework.org/schema/mvc/sp ...