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 ...
随机推荐
- 如何使用域名访问自己的Windows服务器(Java web 项目)
如何使用域名访问自己的Windows服务器(Java web 项目) 写在前面 前段时间在阿里云弄了个学生服务器,就想着自己搭建一个网站试一试,在网上查阅相关资料时发现大部分都是基于服务器是Linux ...
- 关于python如何安装和配置chromedriver以及一些相关问题
解决问题三部曲:观察,思考,尝试 1.如何配置chromedriver: https://www.cnblogs.com/lintest/p/11697059.html 常见异常解决的一个参考吧:ht ...
- .NET的资源并不限于.resx文件
为了构建一个轻量级的资源管理框架以满足简单的本地化(Localization)的需求,我试图直接对现有的Resource编程模型进行扩展.虽然最终没能满足我们的需求,但是这两天也算对.NET如何进行资 ...
- matplotlib 的几种柱状图
1.x 表示数量,y 表示名字 import matplotlib.pyplot as plt dic = {'a': 22, 'b': 10, 'c': 6, 'd': 4, 'e': 2, 'f' ...
- sql-lib闯关21-30
第二十一关 base64编码,单引号,报错型,cookie型注入. 本关和less-20相似,只是cookie的uname值经过base64编码了,下图为我们输入万能密码显示 uname = YWRt ...
- 原 c++中map与unordered_map的区别
c++中map与unordered_map的区别 头文件 map: #include < map > unordered_map: #include < unordered_map ...
- 力软敏捷框架7.0.6 葡萄城报表升级到ar14版本
忙了两天终于搞定升级到ar14版本,坑无数,终于算全部解决,在这里做一个小结. 1.第一步去掉框架中原本集成的ar13部分(吐槽一下应该是对12的集成). 首先去掉licenses.licx文件. 然 ...
- java——构造器理解
构造器理解 什么是构造器 构造器也叫构造方法:用于对象的初始化: 写构造器注意事项 构造器名与类名一致:有返回值但是不能定义返回类型(返回值类型是本类,可以加一个空的return): 构造器的调用 通 ...
- 二维线段树 poj-2155
题意:t组样例 ,输入 n,m,表示n*n的矩阵进行m次操作 ,C: 输入两个坐标 ,组成的矩形 进行取反操作 ,Q:对输的坐标位置输入其值. 思路:一开始想的是用1000(表示x轴)个线段树(对每段 ...
- jmeter参数化之函数助手(十五)
jmeter-参数化: 参数化的作用:调用接口入参时.有时要求参数经常变化,如果每次去修改就会变得很繁琐,这时候就需要把经常变化的值改变为提前编辑好的文档或函数中,便于调用时使用不同的值. Jmete ...