热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Java中Map和Set容器如何存对象的

 之前看到过这样一个问题,大概是:能否把一个对象(自定义,没有任何方法)的两个实例同时存放到同一个Set中去? 当时很懵,但是这几天偶然看了Set和Map的源码就比较明了了。这里总结一

 之前看到过这样一个问题,大概是:能否把一个对象(自定义,没有任何方法)的两个实例同时存放到同一个Set中去?

 当时很懵,但是这几天偶然看了Set和Map的源码就比较明了了。这里总结一下。

 首先,大体上为了存储,有通过树来存数据的,也有通过散列(hash)来存数据的,而且Set的实现其实就是维护了一个对应的Map(如HashSet就是构造一个HashMap),Set的值就是Map的键。所以这里只讨论TreeMap和HashMap。

TreeMap实现put和get

 TreeMap主要是通过红黑树实现的。这里要求Key是实现了Comparable接口的。所以在TreeMap内部,就是通过compare方法来判断是否放入的键相同。以及你通过get获取元素时,也是通过compare方法来查找的。所以同一个对象的多个实例是否能同时存入Map/Set,就要看你如何定义compare方法了。

HashMap实现put和get

 HashMap以及其优化类,都是通过计算散列值来查找的。大概方式是,所有的key会算出一个hashcode,根据这个hashcode得到在容器内部的槽位(这里注意hashcode不要求唯一,因为即使有多个key在同一个槽位,也可以通过一个线性查找来获得最后结果),然后如果有put或者get方法,不外乎就是通过equals方法来看这个槽位中的其他key和要进行操作的是否相等,如果相等说明已经存在,对于put,则无法插入,对于get,则会进一步返回这个key的value。

 所以你会发现,当一个HashMap(或者HashSet)中的Key是一个对象时,那么主要看这个对象对于hashcode和equals方法的重写了。一般的,如果没有重写,直接继承Objec类的方法,那么hashcode是取得地址,equals方法是比较地址值。所以自然对于最开始的问题,是可以把两个实例放到同一个set中去的,因为他们有不同的地址,当然当你重写了hashcode和equals方法就不一定了(事实上,如果你需要用到自定义的类做Key或者放到Set中去,你需要注意是否需要重写hashcode和equals方法)。


推荐阅读
  • 单线程化的ConcurrentHashMap的性能要比同步的HashMap的性能稍好一些,而且在并发应用中,这种作用就十分明显了。ConcurrentHashMap的实现,假定大多数常用的操 ... [详细]
  • 转载自:http:www.blogjava.netCarpenterLeearchive20160427430268.html总体介绍之所以把HashSet和HashMa ... [详细]
  • HashMap:键值对(key-value):通过对象来对对象进行索引,用来索引的对象叫做key,其对应的对象叫做value.默认是1:1关系:存在则覆盖,当key已经存在,则利用新的va ... [详细]
  • 本文由编程笔记#小编为大家整理,主要介绍了源码分析--ConcurrentHashMap与HashTable(JDK1.8)相关的知识,希望对你有一定的参考价值。  Concu ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • HashTable与ConcurrentHashMap均可实现HashMap的功能,对外提供了键值对存储的数据结构。但是在内部结构及实现上有何区别,性能上的差异到底在哪里又是如何导致的 ... [详细]
  • 缓存这个东西就是为了提高运行速度的,由于缓存是在寸土寸金的内存里面,不是在硬盘里面,所以容量是很有限的。LRU这个算法就是把最近一次使用时间离现在时间最远的数据删除掉。先说说List:每 ... [详细]
  • 本篇文章给大家分享的是有关Java中怎么对HashMap按键值排序,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话 ... [详细]
  • 将学生对象和学生的归属地通过键与值存储到map集合中。importjava.util.HashMap;importjava.util.Iterator;importjava.uti ... [详细]
  • 1,关于死锁的理解死锁,我们可以简单的理解为是两个线程同时使用同一资源,两个线程又得不到相应的资源而造成永无相互等待的情况。 2,模拟死锁背景介绍:我们创建一个朋友 ... [详细]
  • 本文介绍了Web学习历程记录中关于Tomcat的基本概念和配置。首先解释了Web静态Web资源和动态Web资源的概念,以及C/S架构和B/S架构的区别。然后介绍了常见的Web服务器,包括Weblogic、WebSphere和Tomcat。接着详细讲解了Tomcat的虚拟主机、web应用和虚拟路径映射的概念和配置过程。最后简要介绍了http协议的作用。本文内容详实,适合初学者了解Tomcat的基础知识。 ... [详细]
  • 个人学习使用:谨慎参考1Client类importcom.thoughtworks.gauge.Step;importcom.thoughtworks.gauge.T ... [详细]
  • JDK源码学习之HashTable(附带面试题)的学习笔记
    本文介绍了JDK源码学习之HashTable(附带面试题)的学习笔记,包括HashTable的定义、数据类型、与HashMap的关系和区别。文章提供了干货,并附带了其他相关主题的学习笔记。 ... [详细]
  • 本文整理了Java面试中常见的问题及相关概念的解析,包括HashMap中为什么重写equals还要重写hashcode、map的分类和常见情况、final关键字的用法、Synchronized和lock的区别、volatile的介绍、Syncronized锁的作用、构造函数和构造函数重载的概念、方法覆盖和方法重载的区别、反射获取和设置对象私有字段的值的方法、通过反射创建对象的方式以及内部类的详解。 ... [详细]
  • 图解HashMap
    什么是HashMap,文章内HashMap源码主要来自Android7.0HashMap是开发中常用的一个类,那么他究竟是什么呢?HashMap是一个存储key-value的集合, ... [详细]
author-avatar
LucifinilC_925
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有