package com.test;

import java.util.Collection;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set; public class MapIteratorDemo {
/*
* HashMap实现Map接口
* HashMap基于哈希表(数组+链表)实现
* 键和值可以使用null
* 非同步,线程不安全,无序
*/
public static void hashMapIterator(){
HashMap<String,Test> h = new HashMap<>();
Test t1 = new Test(1,"manu1",10);
Test t2 = new Test(2,"manu2",20);
Test t3 = new Test(3,"manu3",30);
h.put("test1",t1);
h.put("test2",t2);
h.put("test3",t3);
h.put("test4",t1);
System.out.println("删除前的k-v数:"+h.size());
h.remove("test1");//根据键移除指定的映射关系
System.out.println("删除后的k-v数:"+h.size());
t1.setId(5);
// h.remove("test4"); System.out.println("*********KeySet()*********");
Set<String> sets = h.keySet();//获取映射中所有键的集合
Iterator<String> i = sets.iterator();
while(i.hasNext()){
String keys = i.next();
Test tests = h.get(keys);
System.out.println(keys+"-->"+tests);//无序
}
System.out.println("*********entrySet()*********");
Set<Map.Entry<String, Test>> kv = h.entrySet();//获取键值对
Iterator<Entry<String, Test>> iter = kv.iterator();
while(iter.hasNext()){
System.out.println(iter.next());
}
System.out.println("*********values()*********");
Collection<Test> co = h.values();//获取所有的值得集合
Iterator<Test> ic = co.iterator();
while(ic.hasNext()){
Test t = ic.next();
System.out.println(t);
}
}
/*
* HashSet实现Set接口
* HashSet也是基于哈希表实现
* 允许使用null元素
* 非同步,线程不安全,无序
*/
public static void hashSetIterator(){
HashSet<Test> h = new HashSet<>();
Test t1 = new Test(1,"manu1",10);
Test t2 = new Test(2,"manu2",20);
h.add(t1);
h.add(t2);
System.out.println("*********Iterator*********");
Iterator<Test> iter = h.iterator();
while(iter.hasNext()){
Test t = iter.next();
System.out.println(t);
}
System.out.println("*********foreach*********");
for (Test test : h) {
System.out.println(test);
}
System.out.println("删除前:"+h.size());
System.out.println("删除t1结果:"+h.remove(t1));
System.out.println("删除后:"+h.size());
/*
* 改变实例的属性后,
* 若在实例类中没有重写hashCode()方法,即使改变实例的属性值,其hash值也相同
* 因为Object中的hashCode()是native的,只与本地机器有关,所以,可以执行删除操作
* 若实例中重写hashCode()方法,由于改变了实例属性值,重写的hashCode()方法里,某些属性值
* 参与了hash值的计算,所以,改变属性值前后hash值也变化了,相当于在原来添加对象的位置找不到了,
* 故不能删除成功
*/
t2.setId(10);
System.out.println("删除t2结果:"+h.remove(t2));
System.out.println("删除后:"+h.size()); }
public static void main(String[] args) {
hashMapIterator();
System.out.println(">>>>>>>>>>test>>>>>>>>>>");
hashSetIterator();
}
}

运行结果:

删除前的k-v数:4
删除后的k-v数:3
*********KeySet()*********
test4-->id=5, name=manu1, age=10
test2-->id=2, name=manu2, age=20
test3-->id=3, name=manu3, age=30
*********entrySet()*********
test4=id=5, name=manu1, age=10
test2=id=2, name=manu2, age=20
test3=id=3, name=manu3, age=30
*********values()*********
id=5, name=manu1, age=10
id=2, name=manu2, age=20
id=3, name=manu3, age=30
>>>>>>>>>>test>>>>>>>>>>
*********Iterator*********
id=2, name=manu2, age=20
id=1, name=manu1, age=10
*********foreach*********
id=2, name=manu2, age=20
id=1, name=manu1, age=10
删除前:2
删除t1结果:true
删除后:1
删除t2结果:false
删除后:1

关于HashSet与HashMap的更多相关文章

  1. HashSet和HashMap的区别

    HashSet和HashMap的区别.Java的HashSet类是由哈希表支持.它不保证 set 的迭代顺序:特别是它不保证该顺序恒久不变.此类允许使用 null 元素.HashSet类为基本操作提供 ...

  2. HashSet与HashMap的区别

    本文由 ImportNew - 唐小娟 翻译自 Javarevisited.欢迎加入翻译小组.转载请见文末要求. HashMap和HashSet的区别是Java面试中最常被问到的问题.如果没有涉及到C ...

  3. java数据结构之HashSet和HashMap(java核心卷Ⅰ读书笔记)

    增加 删除 remove方法,可以删除指定的一个元素. 查找 ********************* **************************** HashSet既不可以用 0 1 2 ...

  4. Java HashSet和HashMap源码剖析

    转自: Java HashSet和HashMap源码剖析 总体介绍 之所以把HashSet和HashMap放在一起讲解,是因为二者在Java里有着相同的实现,前者仅仅是对后者做了一层包装,也就是说Ha ...

  5. Java集合 -- HashSet 和 HashMap

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

  6. HashSet、HashMap、Hashtable、TreeMap循环、区别

    HashSet 循环 //可以为null HashSet<Object> hashSet =new HashSet<Object>(); hashSet.add(1); has ...

  7. == 和 equals,equals 与 hashcode,HashSet 和 HashMap,HashMap 和 Hashtable

    一:== 和 equals == 比较引用的地址equals 比较引用的内容 (Object 类本身除外) String obj1 = new String("xyz"); Str ...

  8. Java集合Set、Map、HashSet、HashMap、TreeSet、TreeMap等

    1.Set和Map的关系: Set代表一种集合元素无序.不可重复的集合,Map代表一种由多个key-value对组成的集合. Set的集合继承体系: Map关系集合 Map集合的key特征:所有key ...

  9. JAVA基础--JAVA API集合框架(ArrayList、HashSet、HashMap使用)14

    一.集合Collection 1. 集合介绍 变量:表示的内存中的一个空间,只能保存确定类型的单个数据 数组:表示的是内存中的多个连续的空间,这些空间中可以存储多个同类型的数据. 后期继续学习面向对象 ...

  10. 验证HashSet和HashMap不是线程安全

    JAVA集合类: java.util包下的HashSet和HashMap类不是线程安全的, java.util.concurrent包下的ConcurrentHashMap类是线程安全的. 写2个测试 ...

随机推荐

  1. safari坑之 video

    博客地址: https://www.seyana.life/post/19 本来是打算给博客左上角的gif做个优化, 把gif换成webm,以video的形式自动播放,能从180k降到50k, 现在浏 ...

  2. yuchuan_Linux_C 编程之七系统IO函数

    一.整体大纲 二. 系统IO函数 1. 一些概念    文件描述符     PCB     C库函的IO缓冲区 1) 文件描述符            int 类型            一个进程最多 ...

  3. 使用ZXingObjC扫描二维码横竖屏对应

    /** 根据屏幕的方向设置扫描的方向 * @author maguang * @param parameter * @return result */ - (void)showaCapture { C ...

  4. Python进阶练习与爬取豆瓣T250的影片相关信息

    (一)Python进阶练习 正所谓要将知识进行实践,才会真正的掌握 于是就练习了几道题:求素数,求奇数,求九九乘法表,字符串练习 import re #求素数 i=1; flag=0 while(i& ...

  5. 分享一次C#调用Delphi编写Dll程序

    1.前言: 最近接手了一个项目需要和Delphi语言编写的一个系统进行一些接口的对接,数据在传输过程中采用Des加密方式,因为Delphi 平台的加密方式和C#平台的加密方式不互通,所以采用的方式是C ...

  6. BERT实现QA中的问句语义相似度计算

    1. BERT 语义相似度 BERT的全称是Bidirectional Encoder Representation from Transformers,是Google2018年提出的预训练模型,即双 ...

  7. macOS Catalina 升级软件问题

    最近升级macOS Catalina系统,升级失败时多尝试几次就可以执行成功了,在使用过程中发现以下问题,大家谨慎升级!!! 存在软件启动不兼容,不存在已软件激活失效问题. 有道词典不兼容,启动异常 ...

  8. Jmeter——如何使得token在各线程组间引用的游刃有余

    在以前的博文中,有介绍过,jmeter基本的关联,关联就是将参数在各接口中动态传参,使得接口脚本变得灵活使用,非一次性脚本.今天再来介绍一种jmeter全局变量的设置与使用,可以让脚本运用更丰富,场景 ...

  9. Linux---使用kill杀不掉进程解决方案

    今天打开Linux虚拟机,然后使用jps命令查看,莫名奇妙多了一个1889进程 然后使用kill杀掉后,再运行jps还是存在此进程.于是乎开始大量百度,最终找到了解决方案. 说的很清楚了,杀不掉的原因 ...

  10. VMWARE虚拟机安装系统提示CPU已被客户机操作系统禁用和secureCUT乱码

    错误:VMWARE虚拟机安装系统提示CPU已被客户机操作系统禁用 改正:找到虚拟机的位置找到下图灰色的部分:打开 .vmx后缀的操作系统配置文件,加入以下代码: cpuid.1.eax = :: 2. ...