java 集合(四)HashSet 与 LinkedHashSet
查看源码:
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的更多相关文章
- Java 集合:HashSet 与 ArrayList
Set 集合是无序不可以重复的的.List 集合是有序可以重复的. Java 集合:HashSet 与 hashCode.equals 博客里面已经说到这个问题,但是解释的还是不够清楚. 看一个小例子 ...
- Java 集合 HashMap & HashSet 拾遗
Java 集合 HashMap & HashSet 拾遗 @author ixenos 摘要:HashMap内部结构分析 Java HashMap采用的是冲突链表方式 从上图容易看出,如果选择 ...
- Java自学-集合框架 HashSet、LinkedHashSet、TreeSet之间的区别
HashSet. LinkedHashSet.TreeSet之间的区别 步骤 1 : HashSet LinkedHashSet TreeSet HashSet: 无序 LinkedHashSet: ...
- 死磕 java集合之HashSet源码分析
问题 (1)集合(Collection)和集合(Set)有什么区别? (2)HashSet怎么保证添加元素不重复? (3)HashSet是否允许null元素? (4)HashSet是有序的吗? (5) ...
- Java集合:HashSet的源码分析
Java集合---HashSet的源码分析 一. HashSet概述: HashSet实现Set接口,由哈希表(实际上是一个HashMap实例)支持.它不保证set 的迭代顺序:特别是它不保证该 ...
- Java集合之HashSet/TreeSet原理
Set集合 1.HashSet 只去重复, 没有顺序 HashSet的add方法会调用hashCode和equals, 所以存储在HashSet中的对象需要重写这两个方法. 2.TreeSet ...
- JAVA集合四:比较器--类自定义排序
参考链接: HOW2J.CN 前言 对于JAVA集合,都能够用集合的工具类Collections 提供的方法: Collections.sort(List list) Collections.sort ...
- Java集合学习(6):LinkedHashSet
一.概述 首先我们需要知道的是它是一个Set的实现,所以它其中存的肯定不是键值对,而是值.此实现与HashSet的不同之处在于,LinkedHashSet维护着一个运行于所有条目的双重链接列表.此链接 ...
- Java集合系列-HashSet
原创文章,转载请标注出处:https://www.cnblogs.com/V1haoge/p/10755431.html 一.概述 HashSet是基于哈希实现的set集合,其实它底层是一个value ...
- Java集合之HashSet
1.HashSet概述: HashSet实现Set接口,由哈希表(实际上是一个HashMap实例)支持.它不保证set 的迭代顺序:特别是它不保证该顺序恒久不变.此类允许使用null元素.HashSe ...
随机推荐
- 命令查看linux主机配置
查看cpu: # 总核数 = 物理CPU个数 X 每颗物理CPU的核数 # 总逻辑CPU数 = 物理CPU个数 X 每颗物理CPU的核数 X 超线程数 # 查看物理CPU个数 cat /proc/cp ...
- 【转】燃烧吧,TestMice!
...当我们几个人碰面的时候,就感觉应该做点测试业内的实事. 记得当时的17站出了一些QTP辅件,给了我一些灵感.2008年做了一整年的QTP企业级实施,从方案到最后的收尾支持,得到最大的教训就是,当 ...
- eclipse安装emmet插件
http://www.cnblogs.com/matchless/archive/2013/04/10/3011973.html
- [Laravel] 03 - DB facade, Query builder & Eloquent ORM
连接数据库 一.Outline 三种操作数据库的方式. 二.Facade(外观)模式 Ref: 解读Laravel,看PHP如何实现Facade? Facade本质上是一个“把工作推给别人做的”的类. ...
- docker 搭建ntp服务器
背景 在搭建etcd集群时,如果主机时间相差太多会出现同步错误,如果外部网络不可用时,需要使用内部的ntp服务器同步时间. 构建ntp镜像 创建Dockerfile # usage: # docker ...
- python3 日志检索异常抛出异常 raise KeyError(key),KeyError: 'formatters'
原因分析,python3启动时,检索的不是项目包下的目录文件,所以日志文件必须指明路径.我原来的日志方式是: import logging.config log_path = "mlpcap ...
- AngularJS基础02 神奇的数据绑定(Binding)
作者:arccosxy 转载请注明出处:http://www.cnblogs.com/arccosxy/ 上一节,我们在JS中声明一个scope变量然后在HTML直接访问它,这非常的酷.但是Angu ...
- Thrift版本管理
对于健壮的服务,其中的数据类型必须一种机制来对其进行版本管理,尤其是它可以在不中断服务(或者更坏的情况,出现段错误)的前提下,增加或删除一个对象中的字段,或者改变一个函数的参数列表. 字段标识符 Th ...
- scala breeze使用替换底层线性库
scala -J-Dcom.github.fommil.netlib.NativeSystemBLAS.natives=mkl_rt.dll -cp "D:\betn\Scala\Scala ...
- STL 标准模板库
<vector> 可变长的数组 Vector<int>v int是一个模板参数,这样传进来的都会是int V.push_back(a)将a传进v,且放在最后一个 V.clear ...