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接口的更多相关文章

  1. 学JAVA第十七天,接口与抽象方法

    JAVA接口可以让代码更加有合理的规范性,就想一个项目小组,组长要负责把成员的代码整合,但是每个成员写的方式都是按照他们自己的想法来写的, 所以,整合起来就非常麻烦. 但是,如果我们的组长制作了一个接 ...

  2. Java中Comparable和Comparator接口区别分析

    Java中Comparable和Comparator接口区别分析 来源:码农网 | 时间:2015-03-16 10:25:20 | 阅读数:8902 [导读] 本文要来详细分析一下Java中Comp ...

  3. java 中的2个接口 Comparable和Comparator

    像Integer.String这些类型的数据都是已经实现Comparable接口的,所以对这些类型可以直接通过Arrays.sort(...)和Collections.sort(...)方法进行排序. ...

  4. Java集合框架之Collection接口

    Java是一门面向对象的语言,那么我们写程序的时候最经常操作的便是对象了,为此,Java提供了一些专门用来处理对象的类库,这些类库的集合我们称之为集合框架.Java集合工具包位于Java.util包下 ...

  5. Java集合框架中List接口的简单使用

    Java集合框架可以简单的理解为一种放置对象的容器,和数学中的集合概念类似,Java中的集合可以存放一系列对象的引用,也可以看做是数组的提升,Java集合类是一种工具类,只有相同类型的对象引用才可以放 ...

  6. 黑马程序员——JAVA基础之抽象和接口 , 模版方法设计模式

    ------- android培训.java培训.期待与您交流! ---------- 抽象定义:           抽象就是从多个事物中将共性的,本质的内容抽取出来.           例如:狼 ...

  7. JAVA的核心概念:接口(interface)

    JAVA的核心概念:接口(interface) 接口与类属于同一层次,实际上,接口是一种特殊的抽象类. 如:    interface IA{ }  public interface: 公开接口  与 ...

  8. 利用jmeter+JAVA对RPC的单接口(dubbo接口等)进行性能测试

    建立JAVA项目 建立maven项目,加入Jmeter所需要的JAR包依赖. POM.xml  加入如下: <dependency> <groupId>org.apache.j ...

  9. Effective Java 第三版——22. 接口仅用来定义类型

    Tips <Effective Java, Third Edition>一书英文版已经出版,这本书的第二版想必很多人都读过,号称Java四大名著之一,不过第二版2009年出版,到现在已经将 ...

  10. java 集合框架(二)Iterable接口

    Iterable接口是java 集合框架的顶级接口,实现此接口使集合对象可以通过迭代器遍历自身元素,我们可以看下它的成员方法 修饰符和返回值 方法名 描述 Iterator<T> iter ...

随机推荐

  1. Codeforces Round #200 (Div. 2)E

    Read Time 题意:有一个数组,很多指针指在这个数组上,每次每个指针可以向左或向右移动一个位置.给出一些需要访问的位置,问访问用的最少时间. 一个指针只可能转一次方向.二分答案. #includ ...

  2. 关于ATL生成COM注册失败解决方法

    最近搞C++封装研究了下COM 做最后整理打包的时候发现各种问题引发的注册失败,so整理下备忘. 1.因引用其它动态连接库与你注册的dll不在同一目录下引起的异常.(解决方法将依赖dll放置与注册dl ...

  3. centos下配置Nginx

    首先NGINX是一个高效的HTTP和反向代理的服务器,这里记录一下它的安装方式和文件结构方便以后查看.同时Linux系统具有灵活性,其他的东西可查看具体的官网信息:https://nginx.org/ ...

  4. ubuntu在github上传项目

    GitHub是一个面向开源及私有软件项目的托管平台,因为只支持git 作为唯一的版本库格式进行托管,故名GitHub. 作为开源代码库以及版本控制系统,Github拥有超过900万开发者用户.随着越来 ...

  5. 解决在linux下的eclipse syso Alt+/无法使用

    1.绑定快捷键 2.配置proposal

  6. MATLAB GUI 预约程序

    因为一起奇怪的原因,要做一个预约程序.初衷是能够完成注册.登陆.预约.查看个人信息等. 原本想用Java写的,又由于一些特殊原因耽搁了,导致最后只有一个晚上的时间,匆匆忙忙到最后就用MATLAB GU ...

  7. mysql系列--sql实现原理

    count(*) MyISAM 引擎把⼀个表的总⾏数存在了磁盘上,因此执⾏ count(*) 的时候会直接返回这个数,效率很⾼:但是加了条件则不能快速返回⽽ InnoDB 引擎就麻烦了,它执⾏ cou ...

  8. OpenCV-Python 图像的几何变换 | 十四

    目标 学习将不同的几何变换应用到图像上,如平移.旋转.仿射变换等. 你会看到这些函数: cv.getPerspectiveTransform 变换 OpenCV提供了两个转换函数cv.warpAffi ...

  9. iOS 内存分配与分区

    RAM ROM RAM:运行内存,不能掉电存储. ROM:存储性内存,可以掉电存储,例如内存卡.Flash. 由于 RAM 类型不具备掉电存储能力(即一掉电数据消失),所以 app 程序一般存放于 R ...

  10. iOS 架构

    一.MVC MVC 全名 Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,一种软件设计典范,用一种业务逻辑.数据.界面显示分离 ...