Set中存储元素为什么不重复(即使hashCode相同)?

HashSet中存放自定义类型元素时候,需要重写对象中的hashCode方法和equals方法,

HashSet中存放自定义类型元素时候,需要重写对象中的hashCode方法和equals方法,建立自己的比较方式,才能保证HashSet集合中的对象唯

HashSet是单列集合

 package com.biggw.day13.demo01;

 import java.util.HashSet;
import java.util.Iterator;
import java.util.Set; /**
* @author gw
* @date 2019/11/5 0005 下午 19:04
*/ /*
* java.util.Set接口 extends Collection接口
* Set接口的特点:
* 1.不允许存储重复的元素
* 2.没有索引,没有带索引的方法,也不能使用普通的for循环遍历
*
* java.util.HashSet集合 implements Set接口
* HashSet特点:
* 1.不允许存储重复的元素
* 2.没有索引,没有带索引的方法,也不允许使用普通的for循环遍历
* 3.是一个无序集合,存储元素和取出元素的顺序有可能不一致
* 4.底层是一个哈希表结构(存储速度非常快)【重要】
*
*
* JDK 1.8 之前,哈希表 = 数组+链表
* JDK 1.8及之后,哈希表 = 数组+链表(红黑树)(提高查询速度)【当链表长度超过8位,将链表改为红黑树】
* */
public class HashSetTest {
public static void main(String[] args) {
Set<Integer> set = new HashSet<>();
set.add(1);
set.add(2);
set.add(3);
set.add(1); // 使用迭代器遍历set集合
Iterator<Integer> iterator = set.iterator();
while (iterator.hasNext()) {
Integer next = iterator.next();
System.out.println("next = " + next);
} // 使用增强for循环遍历set集合
for (Integer integer : set) {
System.out.println("integer = " + integer);
} System.out.println("================"); HashSet<String> strings = new HashSet<>();
strings.add("重地");
strings.add("通话");
for (String s : strings) {
System.out.println("s = " + s);
}
}
}

HashSet

HashMap是双列集合

 package com.biggw.day14.demo01;

 import java.util.HashMap;

 /**
* @author gw
* @date 2019/11/5 0005 下午 23:38
*/ /*
* HashMap 的底层实现是哈希表,所以查询速度特别快
* 1.public boolean containsKey(Object key); 判断是否含有该键,返回boolean值
* 2.public E get(Object key); 返回键对应的值,如果不存在,返回null
* 3.public E put(K key, V value); 添加键值对,返回添加之前的值
* 4.public V remove(Object key); 返回移除元素对应的值
*
* */
public class Demo01HashMap {
public static void main(String[] args) {
funcPut();
System.out.println("========");
funcRemove();
System.out.println("========");
funcGet();
System.out.println("========");
funcContainsKey();
} private static void funcContainsKey() {
// public boolean containsKey(Object key); 判断集合中是否包含指定的值
// 包含返回true,不包含返回false System.out.println("ContainsKey");
HashMap<String, Integer> hashMap = new HashMap<>();
// 用int类型接受,虽然我们的值是Integer类型,但是当我们第一次插入一对新键值对时候,由于键对应的值不存在,所以返回null
Object v1 = hashMap.put("小明", 23);
Object v2 = hashMap.put("小花", 24);
boolean v3 = hashMap.containsKey("小绿");
System.out.println("v3 = " + v3);
boolean v4 = hashMap.containsKey("小花");
System.out.println("v4 = " + v4); } private static void funcGet() {
// public V get(Object key)
// 如果key存在, 返回被删除的元素
// 如果key不存在,返回null,所以推荐使用Object接收 System.out.println("Get");
HashMap<String, Integer> hashMap = new HashMap<>();
// 用int类型接受,虽然我们的值是Integer类型,但是当我们第一次插入一对新键值对时候,由于键对应的值不存在,所以返回null
Object v1 = hashMap.put("小明", 23);
Object v2 = hashMap.put("小花", 24);
Integer v3 = hashMap.get("小绿");
System.out.println("v3 = " + v3);
// 获取对应键对应的值
Integer v4 = hashMap.get("小花");
System.out.println("v4 = " + v4);
} public static void funcRemove() { // public V remove(Object key) 把指定的键对应的值从map集合中删除,返回被删除的元素
// 如果key存在, 返回被删除的元素
// 如果key不存在,返回null,所以推荐使用Object接收 System.out.println("remove");
HashMap<String, Integer> hashMap = new HashMap<>();
// 用Integer类型接受,虽然我们的值是int类型,但是当我们第一次插入一对新键值对时候,由于键对应的值不存在,所以返回null
Object v1 = hashMap.put("小明", 23);
Object v2 = hashMap.put("小花", 24);
System.out.println("hashMap = " + hashMap);
Integer v3 = hashMap.remove("小白");
System.out.println("v3 = " + v3);
Integer v4 = hashMap.remove("小花");
System.out.println("v4 = " + v4);
} public static void funcPut() {
// public V remove(Object key);
// 存储键值对的时候,key不重复,返回值为null
// 存储键值对的时候,key重复,会使用新的value替换掉map中的重复的value,并且返回被替换的value System.out.println("Put");
HashMap<String, Integer> hashMap = new HashMap<>();
// 用int类型接受,虽然我们的值是Integer类型,但是当我们第一次插入一对新键值对时候,由于键对应的值不存在,所以返回null
Object v1 = hashMap.put("小明", 23);
Object v2 = hashMap.put("小花", 24);
// 我们还可以把put理解为修改键对应的值
Object v3 = hashMap.put("小花", 25);
System.out.println("v1 = " + v1);
System.out.println("v2 = " + v2);
System.out.println("v3 = " + v3);
System.out.println("hashMap = " + hashMap); /*v1 = null
v2 = null
v3 = 24
hashMap = {小明=23, 小花=25}*/
}
}

HashMap

HashMap遍历方法1:keySet

 package com.biggw.day14.demo01;

 import java.util.HashMap;
import java.util.Iterator;
import java.util.Set; /**
* @author gw
* @date 2019/11/6 0006 下午 13:24
*/ /*
* Map集合中的第一种遍历方式:通过键找值进行遍历
*
* Map集合中的方法:
* public Set<K> keySet(); 返回此映射中的键的set视图
*
* 实现步骤:
* 1.使用Map集合中的方法KeySet(),把Map集合中所有的key取出来,存储到一个Set集合中
* 2.使用Set集合的迭代器方法,获取Map集合中每一个key
* 3.通过Map集合中的方法get(key)
*
*
* */
public class Demo02KeySet {
public static void main(String[] args) {
HashMap<String, Integer> hashMap = new HashMap<>();
Object v1 = hashMap.put("小明", 23);
Object v2 = hashMap.put("小花", 24); Set<String> keySet = hashMap.keySet();
Iterator<String> iterator = keySet.iterator();
while (iterator.hasNext()){
String next = iterator.next();
System.out.println("hashMap.get(next) = " + hashMap.get(next));
} for (String string : keySet) {
System.out.println("hashMap.get(string) = " + hashMap.get(string));
} for (String string : hashMap.keySet()) {
System.out.println("hashMap.get(string) = " + hashMap.get(string));
}
}
}

HashMap遍历1

HashMap遍历方法2:EntrySet

 package com.biggw.day14.demo01;

 import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set; /**
* @author gw
* @date 2019/11/6 0006 下午 13:53
*/ /*
* Map遍历集合的第二种方法:使用Entry对象遍历
*
* Map集合中的方法:
* Set<Map.Entry<K,V>> entrySet(); 返回此映射中包含的映射关系的Set视图
*
* 实现步骤:
* 1.使用Map集合中的方法enteySet(),把Map集合中多个Entry对象取出来,存储到一个Set集合中
* Entry对象:就是键值对组合(类似夫妻组合,黄晓明和baby)
* 2.遍历Set集合,获取每一个Entry对象
* 3.使用Entry对象中的方法getKey()和getValue()获取键和值
*
* */
public class Demo03EntryKey {
public static void main(String[] args) {
HashMap<String, Integer> hashMap = new HashMap<>();
Object v1 = hashMap.put("小明", 23);
Object v2 = hashMap.put("小花", 24); Set<Map.Entry<String, Integer>> entrySet = hashMap.entrySet();
Iterator<Map.Entry<String, Integer>> iterator = entrySet.iterator(); while (iterator.hasNext()) {
Map.Entry<String, Integer> next = iterator.next();
System.out.println("next.getKey()+next.getValue() = " + next.getKey() + next.getValue());
} for (Map.Entry<String, Integer> stringIntegerEntry : entrySet) {
System.out.println("next.getKey()+next.getValue() = " + stringIntegerEntry.getKey() + stringIntegerEntry.getValue());
} }
}

HashMap遍历2


        

Java中HashSet和HashMap的更多相关文章

  1. Java中HashSet,HashMap和HashTable的区别

    HashMap.HashSet.HashTable之间的区别是Java程序员的一个常见面试题目,在此仅以此博客记录,并深入源代码进行分析: 在分析之前,先将其区别列于下面 1:HashSet底层采用的 ...

  2. java中map接口hashMap以及Enty之间的用法和关系

    java中map接口hashMap以及Enty之间的转换 首先说的是map接口: Map提供了一种映射关系,其中的元素是以键值对(key-value)的形式存储的,能够实现根据key快速查找value ...

  3. Java中的数据结构-HashMap

    Java数据结构-HashMap 目录 Java数据结构-HashMap 1. HashMap 1.1 HashMap介绍 1.1.1 HashMap介绍 1.1.2 HashMap继承图 1.2 H ...

  4. java中HashSet详解(转)

    HashSet 的实现 对于 HashSet 而言,它是基于 HashMap 实现的,HashSet 底层采用 HashMap 来保存所有元素,因此 HashSet 的实现比较简单,查看 HashSe ...

  5. java中HashSet详解

    HashSet 的实现 对于 HashSet 而言,它是基于 HashMap 实现的,HashSet 底层采用 HashMap 来保存所有元素,因此 HashSet 的实现比较简单,查看 HashSe ...

  6. java集合(4)- java中HashSet详解

    HashSet 的实现 对于 HashSet 而言,它是基于 HashMap 实现的,HashSet 底层采用 HashMap 来保存所有元素,因此 HashSet 的实现比较简单,查看 HashSe ...

  7. Java集合 -- HashSet 和 HashMap

    HashSet 集合 HashMap 集合 HashSet集合 1.1 Set 接口的特点 Set体系的集合: A:存入集合的顺序和取出集合的顺序不一致 B:没有索引 C:存入集合的元素没有重复 1. ...

  8. Java中HashSet的解读

    一. HashSet源代码 HashSet 的实现   对于 HashSet 而言,它是基于 HashMap 实现的,HashSet 底层采用 HashMap 来保存所有元素,因此 HashSet 的 ...

  9. Java中HashTable和HashMap的区别

    在Java中,HashTable和HashMap都是哈希表,那么它们有什么区别呢?   1.它们所继承的类不一样. HashTable和HashMap都实现了Map接口,但是它们所继承的类时不同的.H ...

随机推荐

  1. SQL 使用分区方法

  2. XML to HTML

    本章讲解如何把 XML 数据显示为 HTML. 在 HTML 中显示 XML 数据 在上一节中,我们讲解了如何通过 JavaScript 来解析 XML 并访问 DOM. 本例遍历一个 XML 文件 ...

  3. HTML5 大文件断点续传完整思路整理

    需求: 支持大文件批量上传(20G)和下载,同时需要保证上传期间用户电脑不出现卡死等体验: 内网百兆网络上传速度为12MB/S 服务器内存占用低 支持文件夹上传,文件夹中的文件数量达到1万个以上,且包 ...

  4. POJ 3275 Ranking the cows ( Floyd求解传递闭包 && Bitset优化 )

    题意 : 给出 N 头牛,以及 M 个某些牛之间的大小关系,问你最少还要确定多少对牛的关系才能将所有的牛按照一定顺序排序起来 分析 : 这些给出的关系想一下就知道是满足传递性的 例如 A > B ...

  5. 【转载】opencv 二值化函数——cv2.threshold

    https://blog.csdn.net/weixin_38570251/article/details/82079080 threshold:固定阈值二值化, ret, dst = cv2.thr ...

  6. [BZOJ4695]最假女选手:segment tree beats!

    分析 segment tree beats!模板题. 看了gxz的博客突然发现自己写的mxbt和mnbt两个标记没用诶. 代码 #include <bits/stdc++.h> #defi ...

  7. Oracle开发:dba和sysdba的区别

    oracle dba和sysdba的区别如下: 1.dba是一种role对应的是对Oracle实例里对象的操作权限的集合,而sysdba是概念上的role是一种登录认证时的身份标识而已.而且,dba是 ...

  8. jieba (中文词频统计) 、collections (字频统计)、WordCloud (词云)

    py库: jieba (中文词频统计) .collections (字频统计).WordCloud (词云) 先来个最简单的: # 查找列表中出现次数最多的值 ls = [1, 2, 3, 4, 5, ...

  9. send()/ recv() 和 write()/ read()

    Linux下数据的接收和发送write()/ read() Linux 不区分套接字文件和普通文件,使用 write() 可以向套接字中写入数据,使用 read() 可以从套接字中读取数据. 两台计算 ...

  10. webpack前置知识2(JavaScript项目初始化)

    所有的JavaScript项目都是在终端输入npm init -y进行项目初始化,如果要自定义项目规则,去掉 -y 参数. vscode终端快捷键ctrl+` 初始化 运行上述命令后,项目内会新建一个 ...