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. Mybatis-Plus和Mybatis的区别

    1.List item 区别一如果Mybatis Plus是扳手,那Mybatis Generator就是生产扳手的工厂.通俗来讲——MyBatis:一种操作数据库的框架,提供一种Mapper类,支持 ...

  2. EF大数据插入

    _April给出代码: using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotati ...

  3. package.json文件

    http://javascript.ruanyifeng.com/nodejs/packagejson.html#toc7(copy) 通常我们使用npm init命令来创建一个npm程序时,会自动生 ...

  4. 【BZOJ2022】Pku1837 Balance

    Description Gigel has a strange "balance" and he wants to poise it. Actually, the device i ...

  5. 网页设计之js

    1.JavaScript概述 javaScript与ECMAScript的相爱相杀 1996年11月,JavaScript的创造者--Netscape公司,决定将JavaScript提交给国际标准化组 ...

  6. 【Leetcode】二叉树的最小深度

    题目: 给定一个二叉树,找出其最小深度. 注意最小深度的定义! 最小深度是从根节点到最近叶子节点的最短路径上的节点数量. 说明: 叶子节点是指没有子节点的节点. 一.递归法 时间复杂度:O(n).需要 ...

  7. 使用ThreadPoolTaskScheduler动态修改调度时间

    用SchedulingConfigurer接口只能统一修改,要分开控制的话有多少个job就要有多少个实现.比较麻烦 配置线程池ThreadPoolTaskScheduler @Configuratio ...

  8. 【错误记录】Python 负数取余问题

    print(-123%10)   # 输出 7   print(-123%-10)  # 输出 -3 这里面第二条是我们一般意义上的取余操作.这里也特别标注一下,如果涉及到负数取余要用上述解决办法. ...

  9. 【Python】学习笔记九:面向对象拓展

    调用类的其他信息 在定义方法的时候,必须有self这一参数.这个参数表示某个对象,对象拥有类的所有性质.那么我们可以通过self,调用类属性 class people(object): action ...

  10. 五大主流数字币钱包:imToken数字货币钱包,Bitcoin core钱包,BTS网页版钱包,AToken轻钱包,Blockchain

    AToken数字货币钱包 超容易上手支持五大主流币种   互联网 | 编辑: 王静涛 2017-12-28 09:58:33转载     国家监管部门已叫停数字货币交易,包括火币网.比特币中国.OKC ...