Set接口

java.util.Set接口 extends Collection接口

Set接口的特点:

  1. 不允许存储重复的元素
  2. 没有索引,没有带索引的方法,也不能使用普通的for循环遍历
java.util.HashSet集合 implements Set接口

HashSet特点:

  1. 不允许存储重复的元素
  2. 没有索引,没有带索引的方法,也不能使用普通的for循环遍历
  3. 是一个无序的集合,存储元素和取出元素的顺序有可能不一致
  4. 底层是一个哈希表结构(查询的速度非常快)
Set<Integer> set = new HashSet<>();
//使用add方法往集合中添加元素
set.add(1);
set.add(3);
set.add(2);
set.add(1);
//使用迭代器遍历Set集合
Iterator<Integer> it = set.iterator();
while(it.hasNext(){
Iterator n = it.next();
System.out.println(n);//1,2,3 无序且不重复
}

HashSet集合存储数据的结构(哈希表)

哈希值:是一个十进制的整数,由系统随机给出(就是对象的地址值,是一个逻辑地址,是模拟出来得到的地址,不是数据实际存储的物理地址)
在Object类有一个方法,可以获取对象的哈希值

int hashCode() 返回该对象的哈希码值。

HashCode方法的源码:

public native int hashCode();
native:代表该方法调用的是本地操作系的的方法

哈希表

哈希表:hashSet集合存储数据的结构
jdk1.8版本之前:哈希表 = 数组+链表
jdk1.8版本之后:

  • 哈希表 = 数组+链表;
  • 哈希表 = 数组+红黑树(提高查询的速度)

哈希表的特点:速度快

存储数据到集合中,先计算元素的哈希值

  • abc:96354 在数组的存储位置
  • 重地——通话:1179395 两元素不同,但是哈希值相同 哈希冲突

数组结构:把元素进行了分组(相同哈希值的元素是一组)

链表/红黑树结构:把相同哈希值的元素连到一起(如何链表的长度超过了8位,那么就会把链转换位红黑树(提高查询的速度))

Set集合存储元素不重复的原理

Set集合存储元素不重复的元素的前提:

前提:存储的元素必须重写hashCode方法和equals方法

//创建HashSet集合对象
HashSet<String> set = new HashSet<>();//哈希表:数组+链表/红黑树
String s1 = new String("abc");
String s2 = new String("abc"); set.add(s1);
set.add(s2);
set.add("重地");
set.add("通话");
set.add("abc");
System.out.println(set);/[重地,通话,abc]

原因:
Set集合在调用add方法的时候,add方法会调用元素hashCode方法和equals方法,判断元素是否重复

HashSet存储自定义类型元素

Set集合报错元素原因:
存储的元素(String,Integer,...Student,Person...),必须重写hashCode方法和equals方法

LinkedHashSet集合

java.util.LinkedHashSet集合 extends HashSet集合

LinkedHashSet集合特点:
底层是一个哈希表(数组+链表/红黑树+链表:多了一条链(记录元素的存储顺序),保存元素有序

HashSet<String> set = new HashSet<>();//[]无序,不允许重复
LinkedHashSet<String> set = new LinkedHashSet<>();[]//有序,不允许重复

可变参数

可变参数:是JDK1.5 之后出现的新特性

使用前提:

  • 当方法的参数列表数据类型已经确定,但是参数的个数不确定,就可以使用可变参数。

使用格式:定义方法时使用

  • 修饰符 返回值类型 方法名(数据类型...变量名){}

可变参数的原理:

  • 可变参数底层就是一个数组,根据传递参数个数不同,会创建不同长度的数组,来存储这些参数
  • 传递的参数个数,可以是0个 (不传递),1,2...多个

可变参数的注意事项:

  1. 一个方法的参数列表,只能有一个可变参数
  2. 如果方法的参数有多个,那么可变参数必须写在参数列表的末尾
public static void method(String b, double c ,int d ,int...a){}

//可变参数的特殊(终极)写法
public static void method(Object...obj){} Collections集合工具类的方法
java.util.Collections是集合工具类,用来对集合进行操作。部分方法如下:
public static <T> void sort(List<T> List ,Comparator<? super T>):将集合中元素按照指定规则排序。 Comparator和Comparable的区别
Comparable:自己(this)和别人(参数)比较,自己需要实现Comparable接口,重写比较的规则compareTo方法
Comparator:相当于找一个第三方的裁判,比较两 Comparator的排序规则:
o1-o2:升序

Java学习:Set接口与HashSet集合存储数据的结构(哈希表)的更多相关文章

  1. HashSet集合存储数据的结构(哈希表)和Set集合存储㢝不重复的原理

    HashSet集合存储数据的结构(哈希表) Set集合存储㢝不重复的原理 前提:存储的元素必须重写hashCode方法和equals方法

  2. HashSet集合存储数据的结构和HashSet集合存储元素不重复的原理

    HashSet集合存储数据的结构 HashSet集合存储元素不重复的原理 //创建HashSet集合对象 Hashset<String> set = new HashSet<> ...

  3. 阶段1 语言基础+高级_1-3-Java语言高级_04-集合_06 Set集合_3_HashSet集合存储数据的结构

    特点就是查询速度快 jdk1.8以后,如果链表的长度超过了8位.就会把转成红黑树,也是为了提高查询的效率

  4. Java set接口之HashSet集合原理讲解

    Set接口 java.util.set接口继承自Collection接口,它与Collection接口中的方法基本一致, 并没有对 Collection接口进行功能上的扩充,只是比collection ...

  5. java之Set接口(单列集合)

    Set接口概述 java.util.Set 接口和 java.util.List 接口一样,同样继承自 Collection 接口,它与 Collection 接口中的方法基本一致,并没有对 Coll ...

  6. Java之Collection接口(单列集合根接口)

    集合概述 集合到底是什么呢?集合:集合是java中提供的一种容器,可以用来存储多个数据 集合和数组既然都是容器,它们有啥区别呢? 区别1: 数组的长度是固定的. 集合的长度是可变的. 区别2:  数组 ...

  7. 使用Properties集合存储数据,遍历取出Properties集合中的数据和Properties集合中的方法store和load

    package com.yang.Test.PropertiesStudy; import java.io.FileWriter; import java.io.IOException; import ...

  8. Java学习笔记:基本输入、输出数据操作实例分析

    Java学习笔记:基本输入.输出数据操作.分享给大家供大家参考,具体如下: 相关内容: 输出数据: print println printf 输入数据: Scanner 输出数据: JAVA中在屏幕中 ...

  9. Java学习(set接口、HashSet集合)

    一.set接口 概念:set接口继承自Collection接口,与List接口不同的是,set接口所储存的元素是不重复的. 二.HashSet集合 概念:是set接口的实现类,由哈希表支持(实际上是一 ...

随机推荐

  1. docker上启动mysql镜像,mysq中记录乱码解决方法

    在docker上启动一个mysql, 1. docker pull mysql 2. docker run --name mysql_dev -p 3306:3306 -e MYSQL_ROOT_PA ...

  2. 洛谷P2463 [SDOI2008]Sandy的卡片(后缀数组SA + 差分 + 二分答案)

    题目链接:https://www.luogu.org/problem/P2463 [题意] 求出N个串中都出现的相同子串的最长长度,相同子串的定义如题:所有元素加上一个数变成另一个,则这两个串相同,可 ...

  3. V4L2 API详解 Buffer的准备和数据读取

    1. 初始化 Memory Mapping 或 User Pointer I/O. int ioctl(int fd, int requestbuf, struct v4l2_requestbuffe ...

  4. opencart 3 配置阿里邮箱smtp实测可用

    最近ytkah在做一个客户的opencart项目时,配置阿里邮箱smtp一直收不到邮件,修改了很多配置文件也不起作用,今天再继续调试终于成功了,下面把所有步骤都记录下来,希望能帮到碰到同样问题的朋友们 ...

  5. tomcat 多实例部署

    tomcat 配置多个实例 参考文档 聊聊 Tomcat 的单机多实例 https://www.cnblogs.com/mafly/p/tomcat.html 极客学院 Tomcat 8 权威指南 h ...

  6. eclipse export runnable jar(导出可执行jar包) runnable jar可以执行的

    如果要导出可运行的JAR文件,需要选择Runnable Jar File. 1. 选择要到处JAR文件的工程,右键选择“Export”: 2. 选择“Java-->Runnable JAR fi ...

  7. Spring Cloud微服务安全实战_3-1_API安全 常见的安全机制

    本章讲解,在不考虑微服务,只考虑一个简单的API ,如何保证这个API的安全? 三个问题: 1,什么是API ? 2,API安全的要素有哪些? 3,API安全基本机制 一.什么是API 百度百科:AP ...

  8. plv8 触发器使用

    触发器使用 demo CREATE FUNCTION test_trigger() RETURNS TRIGGER AS $    plv8.elog(NOTICE, "NEW = &quo ...

  9. ESA2GJK1DH1K基础篇: STM32+GPRS(AT指令版)实现MQTT源码讲解(支持Air202,SIM800)

    前言 注: 本程序发送心跳包,发送温湿度,返回控制数据这三个发送是单独的,有可能凑到一起发. 由于本身程序就是复杂性的程序,所以这节程序没有使用中断发送,没有使用环形队列发送,为了避免多条消息可能凑到 ...

  10. Computer-Hunters——凡事预则立

    Computer-Hunters--凡事预则立 冲刺时间安排 时间 前端计划完成工作 11.6 完成用户注册登录界面,个人信息界面,以及热点资讯界面 11.7-11.8 匹配界面,电脑猎场界面 11. ...