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. 对promise.all底层的实现的研究

    1.Promise.all(iterable)返回一个新的Promise实例,此实例在iterable参数内素有的Promise都fulfilled或者参数中不包含Promise时,状态变成fulfi ...

  2. vue使用 router-link 时点击不能跳转问题

    本来一直都是使用<router-link to='/CouplePackage'>产品</router-link>这样的静态方法, 但是突然今天发现这个方法好像有点问题,在某些 ...

  3. Java 集合基础详细介绍

    一.Java集合框架概述 集合.数组都是对多个数据进行存储操作的结构,简称Java容器.此时的存储,主要指的是内存层面的存储,不涉及到持久化的存储(.txt, .jpg, .avi,数据库中).Jav ...

  4. java中的浅拷贝和深拷贝

    复制 将一个对象的引用复制给另一个对象,一共有三种方式.第一种方式是直接赋值,第二种方式是浅复制,第三种方式是深复制. 1.直接赋值 在Java中,A a1 = a2,这实际上复制的是引用,也就是说 ...

  5. arguments详解——函数内命名参数之映射

    首先,arguments对象是所有(非箭头)函数中都可用的局部变量.你可以使用arguments对象在函数中引用函数的参数.此对象包含传递给函数的每个参数,第一个参数在索引0处. arguments对 ...

  6. [LeetCode]-algorithms-Reverse Integer

    Reverse digits of an integer. If the integer's last digit is 0, what should the output be? ie, cases ...

  7. 浏览器HTML5录音功能

    一.浏览器HTML5录音功能 二.业务代码 <!DOCTYPE html> <html> <head> <meta http-equiv="Cont ...

  8. JavaScript DOM位置尺寸API

    我们需要了解几个基础概念,每个HTML元素都有下列属性 offsetWidth clientWidth scrollWidth offsetHeight clientHeight scrollHeig ...

  9. HDU 6625 (01字典树)

    题意:给定两个长为n的数组a和b:重新排列a和b,生成数组c,c[i]=a[i] xor b[i]:输出字典序最小的c数组. 分析:将a中的数插入一颗01字典树a中:将b中的数插入一颗01字典树b中: ...

  10. 集成微信支付的代码。兼容小程序,扫码,app,公众号。h5 支付 ,以及 服务商提现

      /** * 因为微信总是很多个商户号很多和appid.很多个密钥文件,所以全部改成手动传值的方式,就可以支持多商户调用 * * @param appId 商户的appid * @param mch ...