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 ...
随机推荐
- Pocket+Evernote 打造个人知识库体系
俗话说巧妇难为无米之炊,还是那个不太恰当的例子. 写作就好比人类的消化系统,想要持续的输出...那么就要持续的输入... 今天就来说一说如何进行持续有效的输入. 信息处理过程 先放一张图,这是我的整个 ...
- 面向对象里is-a和has-a的含义
面向对象的核心思想是:抽象.封装.继承.多态.在实践中用的最多的术语就是 is a(是一个) ,和 has a(有一个).其实他们的意思很简单,对应面向对象设计中的两种形态继承.组合. 一.继承( i ...
- ATOMac - 基于Python的Mac应用Ui自动化库
ATOMacTest 一.缘 起 近期工作需要对一款Mac端应用实现常用功能的自动化操作,同事推荐ATOMac这款工具,这几天简单研究了下,同时也发现现网介绍ATOMac的资料非常有限,故在此记录下A ...
- AspNetCore3.1_Secutiry源码解析_4_Authentication_JwtBear
title: "AspNetCore3.1_Secutiry源码解析_4_Authentication_JwtBear" date: 2020-03-22T16:29:29+08: ...
- SpringBoot2 线程池的定义和使用
SpringBoot2 线程池的定义和使用 定义线程池 @Slf4j @EnableAsync @Configuration public class AsyncExecutorConfig impl ...
- CORS 跨域中的 preflight 请求
我们知道借助Access-Control-Allow-Origin响应头字段可以允许跨域 AJAX, 对于非简单请求,CORS 机制跨域会首先进行 preflight(一个 OPTIONS 请求), ...
- go语言周边
博主收藏的go语言资料,分享一波~~~ 官网 https://golang.org/ (被墙) 镜像: http://docscn.studygolang.com/ 下载镜像: https://gom ...
- alsa-lib及alsa-utils成功移植(转载)
准备工作 alsa-lib版本:alsa-lib-1.0.23.tar.bz2 alsa-util版本:alsa-utils-1.0.23.tar.bz2 其他版本的alsa-lib和alsa-uti ...
- 《面试经典系列》- MySQL数据库存储引擎
一.MySQL有多少种存储引擎? 在MySQL5之后,支持的存储引擎有十多个,但是我们常用的就那么几种,而且,默认支持的也是 InnoDB. 通过命令:show engines \g,我们可以查看到当 ...
- 【LeetCode】15.三数之和
题目描述 1. 三数之和 给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有满足条件且不重复的三元组. 注意: ...