zoukankan      html  css  js  c++  java
  • Java中HashSet和HashMap

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

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

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

    HashSet是单列集合

     1 package com.biggw.day13.demo01;
     2 
     3 import java.util.HashSet;
     4 import java.util.Iterator;
     5 import java.util.Set;
     6 
     7 /**
     8  * @author gw
     9  * @date 2019/11/5 0005 下午 19:04
    10  */
    11 
    12 /*
    13  * java.util.Set接口 extends Collection接口
    14  * Set接口的特点:
    15  * 1.不允许存储重复的元素
    16  * 2.没有索引,没有带索引的方法,也不能使用普通的for循环遍历
    17  *
    18  * java.util.HashSet集合 implements Set接口
    19  * HashSet特点:
    20  * 1.不允许存储重复的元素
    21  * 2.没有索引,没有带索引的方法,也不允许使用普通的for循环遍历
    22  * 3.是一个无序集合,存储元素和取出元素的顺序有可能不一致
    23  * 4.底层是一个哈希表结构(存储速度非常快)【重要】
    24  *
    25  *
    26  * JDK 1.8 之前,哈希表 = 数组+链表
    27  * JDK 1.8及之后,哈希表 = 数组+链表(红黑树)(提高查询速度)【当链表长度超过8位,将链表改为红黑树】
    28  * */
    29 public class HashSetTest {
    30     public static void main(String[] args) {
    31         Set<Integer> set = new HashSet<>();
    32         set.add(1);
    33         set.add(2);
    34         set.add(3);
    35         set.add(1);
    36 
    37         // 使用迭代器遍历set集合
    38         Iterator<Integer> iterator = set.iterator();
    39         while (iterator.hasNext()) {
    40             Integer next = iterator.next();
    41             System.out.println("next = " + next);
    42         }
    43 
    44         // 使用增强for循环遍历set集合
    45         for (Integer integer : set) {
    46             System.out.println("integer = " + integer);
    47         }
    48 
    49         System.out.println("================");
    50 
    51         HashSet<String> strings = new HashSet<>();
    52         strings.add("重地");
    53         strings.add("通话");
    54         for (String s : strings) {
    55             System.out.println("s = " + s);
    56         }
    57     }
    58 }
    HashSet

    HashMap是双列集合

      1 package com.biggw.day14.demo01;
      2 
      3 import java.util.HashMap;
      4 
      5 /**
      6  * @author gw
      7  * @date 2019/11/5 0005 下午 23:38
      8  */
      9 
     10 /*
     11  * HashMap 的底层实现是哈希表,所以查询速度特别快
     12  * 1.public boolean containsKey(Object key); 判断是否含有该键,返回boolean值
     13  * 2.public E get(Object key); 返回键对应的值,如果不存在,返回null
     14  * 3.public E put(K key, V value); 添加键值对,返回添加之前的值
     15  * 4.public V remove(Object key); 返回移除元素对应的值
     16  *
     17  * */
     18 public class Demo01HashMap {
     19     public static void main(String[] args) {
     20         funcPut();
     21         System.out.println("========");
     22         funcRemove();
     23         System.out.println("========");
     24         funcGet();
     25         System.out.println("========");
     26         funcContainsKey();
     27     }
     28 
     29     private static void funcContainsKey() {
     30         // public boolean containsKey(Object key); 判断集合中是否包含指定的值
     31         // 包含返回true,不包含返回false
     32 
     33 
     34         System.out.println("ContainsKey");
     35         HashMap<String, Integer> hashMap = new HashMap<>();
     36         // 用int类型接受,虽然我们的值是Integer类型,但是当我们第一次插入一对新键值对时候,由于键对应的值不存在,所以返回null
     37         Object v1 = hashMap.put("小明", 23);
     38         Object v2 = hashMap.put("小花", 24);
     39         boolean v3 = hashMap.containsKey("小绿");
     40         System.out.println("v3 = " + v3);
     41         boolean v4 = hashMap.containsKey("小花");
     42         System.out.println("v4 = " + v4);
     43 
     44     }
     45 
     46     private static void funcGet() {
     47         // public V get(Object key)
     48         // 如果key存在, 返回被删除的元素
     49         // 如果key不存在,返回null,所以推荐使用Object接收
     50 
     51         System.out.println("Get");
     52         HashMap<String, Integer> hashMap = new HashMap<>();
     53         // 用int类型接受,虽然我们的值是Integer类型,但是当我们第一次插入一对新键值对时候,由于键对应的值不存在,所以返回null
     54         Object v1 = hashMap.put("小明", 23);
     55         Object v2 = hashMap.put("小花", 24);
     56         Integer v3 = hashMap.get("小绿");
     57         System.out.println("v3 = " + v3);
     58         // 获取对应键对应的值
     59         Integer v4 = hashMap.get("小花");
     60         System.out.println("v4 = " + v4);
     61     }
     62 
     63     public static void funcRemove() {
     64 
     65         // public V remove(Object key) 把指定的键对应的值从map集合中删除,返回被删除的元素
     66         // 如果key存在, 返回被删除的元素
     67         // 如果key不存在,返回null,所以推荐使用Object接收
     68 
     69         System.out.println("remove");
     70         HashMap<String, Integer> hashMap = new HashMap<>();
     71         // 用Integer类型接受,虽然我们的值是int类型,但是当我们第一次插入一对新键值对时候,由于键对应的值不存在,所以返回null
     72         Object v1 = hashMap.put("小明", 23);
     73         Object v2 = hashMap.put("小花", 24);
     74         System.out.println("hashMap = " + hashMap);
     75         Integer v3 = hashMap.remove("小白");
     76         System.out.println("v3 = " + v3);
     77         Integer v4 = hashMap.remove("小花");
     78         System.out.println("v4 = " + v4);
     79     }
     80 
     81     public static void funcPut() {
     82         // public V remove(Object key);
     83         // 存储键值对的时候,key不重复,返回值为null
     84         // 存储键值对的时候,key重复,会使用新的value替换掉map中的重复的value,并且返回被替换的value
     85 
     86         System.out.println("Put");
     87         HashMap<String, Integer> hashMap = new HashMap<>();
     88         // 用int类型接受,虽然我们的值是Integer类型,但是当我们第一次插入一对新键值对时候,由于键对应的值不存在,所以返回null
     89         Object v1 = hashMap.put("小明", 23);
     90         Object v2 = hashMap.put("小花", 24);
     91         // 我们还可以把put理解为修改键对应的值
     92         Object v3 = hashMap.put("小花", 25);
     93         System.out.println("v1 = " + v1);
     94         System.out.println("v2 = " + v2);
     95         System.out.println("v3 = " + v3);
     96         System.out.println("hashMap = " + hashMap);
     97 
     98         /*v1 = null
     99         v2 = null
    100         v3 = 24
    101         hashMap = {小明=23, 小花=25}*/
    102     }
    103 }
    HashMap

     HashMap遍历方法1:keySet

     1 package com.biggw.day14.demo01;
     2 
     3 import java.util.HashMap;
     4 import java.util.Iterator;
     5 import java.util.Set;
     6 
     7 /**
     8  * @author gw
     9  * @date 2019/11/6 0006 下午 13:24
    10  */
    11 
    12 /*
    13  * Map集合中的第一种遍历方式:通过键找值进行遍历
    14  *
    15  * Map集合中的方法:
    16  *      public Set<K> keySet(); 返回此映射中的键的set视图
    17  *
    18  * 实现步骤:
    19  *      1.使用Map集合中的方法KeySet(),把Map集合中所有的key取出来,存储到一个Set集合中
    20  *      2.使用Set集合的迭代器方法,获取Map集合中每一个key
    21  *      3.通过Map集合中的方法get(key)
    22  *
    23  *
    24  * */
    25 public class Demo02KeySet {
    26     public static void main(String[] args) {
    27         HashMap<String, Integer> hashMap = new HashMap<>();
    28         Object v1 = hashMap.put("小明", 23);
    29         Object v2 = hashMap.put("小花", 24);
    30 
    31         Set<String> keySet = hashMap.keySet();
    32         Iterator<String> iterator = keySet.iterator();
    33         while (iterator.hasNext()){
    34             String next = iterator.next();
    35             System.out.println("hashMap.get(next) = " + hashMap.get(next));
    36         }
    37 
    38         for (String string : keySet) {
    39             System.out.println("hashMap.get(string) = " + hashMap.get(string));
    40         }
    41 
    42         for (String string : hashMap.keySet()) {
    43             System.out.println("hashMap.get(string) = " + hashMap.get(string));
    44         }
    45     }
    46 }
    HashMap遍历1

    HashMap遍历方法2:EntrySet

     1 package com.biggw.day14.demo01;
     2 
     3 import java.util.HashMap;
     4 import java.util.Iterator;
     5 import java.util.Map;
     6 import java.util.Set;
     7 
     8 /**
     9  * @author gw
    10  * @date 2019/11/6 0006 下午 13:53
    11  */
    12 
    13 /*
    14 * Map遍历集合的第二种方法:使用Entry对象遍历
    15 * 
    16 * Map集合中的方法:
    17 *       Set<Map.Entry<K,V>> entrySet(); 返回此映射中包含的映射关系的Set视图
    18 * 
    19 * 实现步骤:
    20 *       1.使用Map集合中的方法enteySet(),把Map集合中多个Entry对象取出来,存储到一个Set集合中
    21 *           Entry对象:就是键值对组合(类似夫妻组合,黄晓明和baby)
    22 *       2.遍历Set集合,获取每一个Entry对象
    23 *       3.使用Entry对象中的方法getKey()和getValue()获取键和值
    24 * 
    25 * */
    26 public class Demo03EntryKey {
    27     public static void main(String[] args) {
    28         HashMap<String, Integer> hashMap = new HashMap<>();
    29         Object v1 = hashMap.put("小明", 23);
    30         Object v2 = hashMap.put("小花", 24);
    31 
    32         Set<Map.Entry<String, Integer>> entrySet = hashMap.entrySet();
    33         Iterator<Map.Entry<String, Integer>> iterator = entrySet.iterator();
    34 
    35         while (iterator.hasNext()) {
    36             Map.Entry<String, Integer> next = iterator.next();
    37             System.out.println("next.getKey()+next.getValue() = " + next.getKey() + next.getValue());
    38         }
    39 
    40         for (Map.Entry<String, Integer> stringIntegerEntry : entrySet) {
    41             System.out.println("next.getKey()+next.getValue() = " + stringIntegerEntry.getKey() + stringIntegerEntry.getValue());
    42         }
    43 
    44     }
    45 }
    HashMap遍历2



            
  • 相关阅读:
    Windows DLL调用实例
    DLL头文件的格式和应用
    Strategy factory
    抽象数据类型(ADT)和面向对象编程(OOP)3.5 ADT和OOP中的等价性
    抽象数据类型(ADT)和面向对象编程(OOP)3.4 面向对象的编程
    抽象数据类型(ADT)和面向对象编程(OOP)3.3 抽象数据类型
    抽象数据类型(ADT)和面向对象编程(OOP)3.2规约
    抽象数据类型(ADT)和面向对象编程(OOP)3.1数据类型和类型检查
    软件构造 消息传递
    软件构造 并发3(线程安全性)----锁定和同步
  • 原文地址:https://www.cnblogs.com/biggw/p/11801776.html
Copyright © 2011-2022 走看看