Java学习:Set接口与HashSet集合存储数据的结构(哈希表)
Set接口
java.util.Set接口 extends Collection接口
Set接口的特点:
- 不允许存储重复的元素
- 没有索引,没有带索引的方法,也不能使用普通的for循环遍历
java.util.HashSet集合 implements Set接口
HashSet特点:
- 不允许存储重复的元素
- 没有索引,没有带索引的方法,也不能使用普通的for循环遍历
- 是一个无序的集合,存储元素和取出元素的顺序有可能不一致
- 底层是一个哈希表结构(查询的速度非常快)
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...多个
可变参数的注意事项:
- 一个方法的参数列表,只能有一个可变参数
- 如果方法的参数有多个,那么可变参数必须写在参数列表的末尾
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集合存储数据的结构(哈希表)的更多相关文章
- HashSet集合存储数据的结构(哈希表)和Set集合存储㢝不重复的原理
HashSet集合存储数据的结构(哈希表) Set集合存储㢝不重复的原理 前提:存储的元素必须重写hashCode方法和equals方法
- HashSet集合存储数据的结构和HashSet集合存储元素不重复的原理
HashSet集合存储数据的结构 HashSet集合存储元素不重复的原理 //创建HashSet集合对象 Hashset<String> set = new HashSet<> ...
- 阶段1 语言基础+高级_1-3-Java语言高级_04-集合_06 Set集合_3_HashSet集合存储数据的结构
特点就是查询速度快 jdk1.8以后,如果链表的长度超过了8位.就会把转成红黑树,也是为了提高查询的效率
- Java set接口之HashSet集合原理讲解
Set接口 java.util.set接口继承自Collection接口,它与Collection接口中的方法基本一致, 并没有对 Collection接口进行功能上的扩充,只是比collection ...
- java之Set接口(单列集合)
Set接口概述 java.util.Set 接口和 java.util.List 接口一样,同样继承自 Collection 接口,它与 Collection 接口中的方法基本一致,并没有对 Coll ...
- Java之Collection接口(单列集合根接口)
集合概述 集合到底是什么呢?集合:集合是java中提供的一种容器,可以用来存储多个数据 集合和数组既然都是容器,它们有啥区别呢? 区别1: 数组的长度是固定的. 集合的长度是可变的. 区别2: 数组 ...
- 使用Properties集合存储数据,遍历取出Properties集合中的数据和Properties集合中的方法store和load
package com.yang.Test.PropertiesStudy; import java.io.FileWriter; import java.io.IOException; import ...
- Java学习笔记:基本输入、输出数据操作实例分析
Java学习笔记:基本输入.输出数据操作.分享给大家供大家参考,具体如下: 相关内容: 输出数据: print println printf 输入数据: Scanner 输出数据: JAVA中在屏幕中 ...
- Java学习(set接口、HashSet集合)
一.set接口 概念:set接口继承自Collection接口,与List接口不同的是,set接口所储存的元素是不重复的. 二.HashSet集合 概念:是set接口的实现类,由哈希表支持(实际上是一 ...
随机推荐
- 服务刚启动就 Old GC,要闹哪样?
1.背景 最近有个同学说他的服务刚启动就收到两次 Full GC 告警, 按道理来说刚启动,对象应该不会太多,为啥会触发 Full GC 呢? 带着疑问,我们还是先看看日志吧,毕竟日志的信息更多. 2 ...
- Django学习之十四:Django ORM继承关系
目录 Django ORM继承关系 1. SINGLE_TABLE(django好像不支持) 2. TABLE_PER_CLASS 3. JOINED 4. 代理继承 Django ORM继承关系 参 ...
- (原)netbeans中使用libtorch
转载请注明处处: https://www.cnblogs.com/darkknightzh/p/11479330.html 说明:第一种方式在netbeans中无法debug代码,设置了断点也不会在断 ...
- Nginx 负载均衡实例redis
Nginx 负载均衡实例redis 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任.
- python数据类型之二
列表 list #定义:[]内可以有多个任意类型的值,逗号分隔 基本语法 # 定义:[]内可以有多个任意类型的值,逗号分隔 # my_girl_friends=['alex','wupeiqi','y ...
- 05-numpy-笔记-fliplr
翻转矩阵的左右. 至少需要是2维矩阵. 例子: >>> A = np.diag([1.,2.,3.]) >>> A array([[ 1., 0., 0.], [ ...
- Docker镜像拉取总结
flannel docker pull quay-mirror.qiniu.com/coreos/flannel:v0.11.0-amd64 docker tag quay-mirror.qiniu. ...
- 【java异常】Building workspace has encountered a problem. Error
可能是workspace设置错误,检查一下 或者把项目重新下一下,或者重新maven导入
- 网页网站基础入门篇: 使用Adobe Dreamweaver CS6 制作网页/网站
咱开发网页或者网站呢,最好使用个软件,我使用的是Adobe Dreamweaver CS6 (自行下载安装) 打开软件 现在呢咱使用 html5 <!doctype html> <h ...
- NOIP2019翻车前写(and 抄)过的代码
咕咕咕.按上传时间升序排列. //树的重心 void dfs(int x) { v[x]=1; size[x]=1; int max_part=0; for(int i=hed[x];i;i=nxt[ ...