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 ...
随机推荐
- React Native 进的第一个坑
Bundling index.ios.js [development, non-minified, hmr disabled] 0.0% (0/1), failed. error: bundling ...
- Nginx 1.9+PHP5.6 环境搭建
PHP5. 下载安装包 #wget http://mirrors.sohu.com/php/php-5.6.2.tar.gz #tar -zxf php- 安装php依赖的包 #yum inst ...
- CSS让页面平滑滚动
我们以往实现平滑滚动往往用的是jQuery, 如实现平滑回到顶部,就写如下代码: $('.js_go_to_top').click(function () { $(".js_scroll_a ...
- Java知多少(75)Object类
Object 类位于 java.lang 包中,是所有 Java 类的祖先,Java 中的每个类都由它扩展而来. 定义Java类时如果没有显示的指明父类,那么就默认继承了 Object 类.例如: p ...
- 响应式编程笔记三:一个简单的HTTP服务器
# 响应式编程笔记三:一个简单的HTTP服务器 本文我们将继续前面的学习,但将更多的注意力放在用例和编写实际能用的代码上面,而非基本的APIs学习. 我们会看到Reactive是一个有用的抽象 - 对 ...
- duilib进阶教程 -- Label控件的bug (8)
上个教程说到了TreeView的文字不能垂直居中的问题,而我们用LabelUI其实是可以垂直居中的,为什么不说是TreeView的bug,而说是Label控件的bug呢?因为影响TreeView垂直居 ...
- [Laravel] 03 - DB facade, Query builder & Eloquent ORM
连接数据库 一.Outline 三种操作数据库的方式. 二.Facade(外观)模式 Ref: 解读Laravel,看PHP如何实现Facade? Facade本质上是一个“把工作推给别人做的”的类. ...
- SpringBoot------Maven Clean报错
报错信息: Plugin org.apache.maven.plugins:maven-clean-plugin: or one of its dependencies could not be re ...
- Hadoop安装教程_集群/分布式配置
配置集群/分布式环境 集群/分布式模式需要修改 /usr/local/hadoop/etc/hadoop 中的5个配置文件,更多设置项可点击查看官方说明,这里仅设置了正常启动所必须的设置项: slav ...
- 【PHP】xampp配置多个监听端口和不同的网站目录(转)
转自:https://blog.csdn.net/cc1314_/article/details/75646344 windows下使用xampp配置多个监听端口和不同的网站目录 一:配置Apache ...