Java第十七天,Set接口
Set接口
1.特点
(1)不包含重复元素。
(2)没有索引。
(3)继承自Collection接口,所以Collection接口中的所有方法都适用于Set接口。
2.解析
(1)为什么不能包含重复元素?
Set接口的add方法会调用hashCode()方法得到哈希值,然后查看该哈希值是否对应着多个元素(哈希冲突),如果不存在哈希冲突,则添加成功;如果存在哈希冲突,则会调用equals方法判断该元素是否与哈希冲突元素相同。如果相同的话,添加失败;如果不同的话,添加成功。
执行上面判断的前提是:元素所属的类得重写hashCode和equals方法。因为不是所有的元素都是字符串。言外之意就是说,如果想用HashSet集合存储自定义数据类型,必须重写hashCode和equals方法,以保证哈希表的特性——不包含重复元素。
HashSet集合
1.特有特点
(1)实现不同步(多线程)。
(2)实现Set接口,所以Set接口的方法适用于HashSet集合。
(3)无序。即存储和取出同一元素的顺序有可能不一致。
(4)底层是一个哈希表结构,所以查询的速度非常快。
2.遍历方法
(1)迭代器
(2)增强 for 语句
3.哈希值
(1)哈希值是一个十进制的整数,由系统随即给出(是对象的逻辑地址,不是物理地址)。
(2)Object类中的 hashCode() 方法就是返回对象的哈希值。
(3)String类重写了Object的hashCode()方法。哈希值相同的对象不唯一(两个元素不同,哈希值相同叫做哈希冲突)。
4.HashSet集合存储数据的结构——哈希表
(1)
jdk 1.8 版本之前:
哈希表 = 数组 + 链表
jdk 1.8 版本以后:
哈希表 = 数组 + 红黑树(提高查询速度)
哈希表的特点就是查询速度快。
(2)
数组结构把元素进行了分组(哈希值相同的元素是一组),如果一组相同的元素超过8位,则会将链表结构转成红黑树结构。
(3)用HashSet存储自定义类型。
Stu类:
package com.lanyue.day16;
import java.util.Objects;
public class Stu {
public String name;
public int age;
public Stu(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Stu stu = (Stu) o;
return age == stu.age &&
Objects.equals(name, stu.name);
}
@Override
public int hashCode() {
return Objects.hash(name, age);
}
}
运行类:
package com.lanyue.day16;
import java.util.HashSet;
import java.util.Iterator;
public class SetLearn {
public static void main(String[] args) {
HashSet<Stu> stus = new HashSet<>();
Stu one = new Stu("小红",12);
Stu two = new Stu("小红",12);
stus.add(one);
stus.add(two);
Iterator<Stu> it = stus.iterator();
while(it.hasNext()){
Stu stu = it.next();
System.out.println(stu.age + "" + stu.name);
}
}
}
程序运行图:
LinkedHashSet集合
1.概念
该集合为HashSet集合的继承,所以方法基本与前者相同。不同之处是,LinkedHashSet集合具有可预知的迭代顺序,即迭代顺序是按照元素插入Set接口的顺序进行的。
该集合多了一条链表,多的这条链表就是用来存储元素存放顺序的,保证了元素的有序性。
2.特点
(1)有序。
(2)不允许重复。
Java第十七天,Set接口的更多相关文章
- 学JAVA第十七天,接口与抽象方法
JAVA接口可以让代码更加有合理的规范性,就想一个项目小组,组长要负责把成员的代码整合,但是每个成员写的方式都是按照他们自己的想法来写的, 所以,整合起来就非常麻烦. 但是,如果我们的组长制作了一个接 ...
- Java中Comparable和Comparator接口区别分析
Java中Comparable和Comparator接口区别分析 来源:码农网 | 时间:2015-03-16 10:25:20 | 阅读数:8902 [导读] 本文要来详细分析一下Java中Comp ...
- java 中的2个接口 Comparable和Comparator
像Integer.String这些类型的数据都是已经实现Comparable接口的,所以对这些类型可以直接通过Arrays.sort(...)和Collections.sort(...)方法进行排序. ...
- Java集合框架之Collection接口
Java是一门面向对象的语言,那么我们写程序的时候最经常操作的便是对象了,为此,Java提供了一些专门用来处理对象的类库,这些类库的集合我们称之为集合框架.Java集合工具包位于Java.util包下 ...
- Java集合框架中List接口的简单使用
Java集合框架可以简单的理解为一种放置对象的容器,和数学中的集合概念类似,Java中的集合可以存放一系列对象的引用,也可以看做是数组的提升,Java集合类是一种工具类,只有相同类型的对象引用才可以放 ...
- 黑马程序员——JAVA基础之抽象和接口 , 模版方法设计模式
------- android培训.java培训.期待与您交流! ---------- 抽象定义: 抽象就是从多个事物中将共性的,本质的内容抽取出来. 例如:狼 ...
- JAVA的核心概念:接口(interface)
JAVA的核心概念:接口(interface) 接口与类属于同一层次,实际上,接口是一种特殊的抽象类. 如: interface IA{ } public interface: 公开接口 与 ...
- 利用jmeter+JAVA对RPC的单接口(dubbo接口等)进行性能测试
建立JAVA项目 建立maven项目,加入Jmeter所需要的JAR包依赖. POM.xml 加入如下: <dependency> <groupId>org.apache.j ...
- Effective Java 第三版——22. 接口仅用来定义类型
Tips <Effective Java, Third Edition>一书英文版已经出版,这本书的第二版想必很多人都读过,号称Java四大名著之一,不过第二版2009年出版,到现在已经将 ...
- java 集合框架(二)Iterable接口
Iterable接口是java 集合框架的顶级接口,实现此接口使集合对象可以通过迭代器遍历自身元素,我们可以看下它的成员方法 修饰符和返回值 方法名 描述 Iterator<T> iter ...
随机推荐
- 我要打十个!详解建造者模式(builder pattern)
前言 "我要打十个",其实是我要打十个野怪! 这十个野怪呢,它们有不同的技能.装备和武器,长得也不一样.这里野怪是一个蛮复杂的对象,由各个不同的部分组成(技能.装备.武器等),不同 ...
- CSS每日学习笔记(1)
7.30.2019 1.CSS 文本属性 属性 描述 color 设置文本颜色 direction 设置文本方向. line-height 设置行高. letter-spacing 设置字符间距. t ...
- setTimeout和setImmediate到底谁先执行,本文让你彻底理解Event Loop
笔者以前面试的时候经常遇到写一堆setTimeout,setImmediate来问哪个先执行.本文主要就是来讲这个问题的,但是不是简单的讲讲哪个先,哪个后.笼统的知道setImmediate比setT ...
- Git在公司内部的使用规范
Git在公司内部的使用规范 目录 Git在公司内部的使用规范 1.版本定义 2.系统开发环境 3. 分支定义 4.Commit 日志规范 5.开发工作流程: 5.1.常规分支debug流程: 5.2. ...
- MyBatis框架——缓存机制
使⽤缓存机制的作⽤也是减少 Java 应⽤程序与数据库的交互次数,从⽽提升程序的运⾏效率. ⽐如第 ⼀次查询出某个对象之后,MyBatis 会⾃动将其存⼊缓存,当下⼀次查询同⼀个对象时,就可以直接从 ...
- vnpy源码阅读学习(7):串在一起
串在一起 我们已经分析了UI.MainEngine.EventEngine.然后他们几个是如何发挥作用的呢?我总结了一张图: 我们来具体的看看UI部分是如何跟EventEngine穿插起来的 \exa ...
- F版本SpringCloud 4—Eureka注册中心开发和客户端开发
源码地址:https://gitee.com/bingqilinpeishenme/Java-Tutorials 前言 通过前三篇文章,用大白话介绍了微服务和SpringCloud以及服务治理相关的概 ...
- 【HDU5934】Bomb——有向图强连通分量+重建图
题目大意 二维平面上有 n 个爆炸桶,i−thi-thi−th爆炸桶位置为 (xi,yi)(x_i, y_i)(xi,yi) 爆炸范围为 rir_iri ,且需要 cic_ici 的价格引爆, ...
- mongodb_2
一.游标 在mongodb中,底层使用js引擎进行各种操作,所以我们在命令行窗口,可直接执行js代码. #使用for循环,插入1000条数据. > for (var i=0;i<1000; ...
- Colab笔记本能用英伟达Tesla T4了,谷歌的羊毛薅到酸爽
谷歌出品的Colab笔记本,机器学习界薅羊毛神器,如今又有了新福利: 连英伟达最新一代机器学习GPU:Tesla T4都能免费蹭,穷苦羊毛党也顿时高端了起来. 英伟达的Tesla T4,是去年秋天才发 ...