关闭

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

标签: javahashmap
1192人阅读 评论(0) 收藏 举报
分类:

 之前看到过这样一个问题,大概是:能否把一个对象(自定义,没有任何方法)的两个实例同时存放到同一个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方法)。

0
0
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

Java map 存取对象

今天刚好做一个了相关功能 import java.util.HashMap; import java.util.Map; public class TestKey{ public static void main(String[] args){ Key k1 = new Key(1,...
  • qq_16717565
  • qq_16717565
  • 2016-10-28 00:17
  • 709

Map中的HashMap存储对象

package test; public class Student { int age; String name; public Student(String name,int age){ this.name = name; this.age = age; } }
  • z83986976
  • z83986976
  • 2014-08-22 22:13
  • 3101

Java 往hashSet集合中存入自定义对象

往hashSet集合中存入自定对象
  • hoho_12
  • hoho_12
  • 2016-04-15 17:13
  • 2120

Java中Set的使用

在Java中使用Set,可以方便地将需要的类型以集合类型保存在一个变量中.主要应用在显示列表.Set是一个不包含重复元素的 collection。更确切地讲,set 不包含满足 e1.equals(e2) 的元素对 e1 和 e2,并且最多包含一个 null 元素。正如其名称所暗示的,此接口模仿了数...
  • lushuaiyin
  • lushuaiyin
  • 2012-03-22 00:08
  • 174655

Java List、Set去重实体对象类型的集合

1.//实体类中重写equals与hashCode方法 package test;public class Student { private String name; private String age; private String sex; public String...
  • u014398573
  • u014398573
  • 2016-04-13 12:38
  • 5456

java怎么判断两个Set 里的对象的值是否相同

public static boolean isSetEqual(Set set1, Set set2) { if (set1 == null && set2 == null) { return true; // Both are null } if (set1 ==...
  • u014622672
  • u014622672
  • 2014-12-24 13:17
  • 1256

Java map 存取对象

今天刚好做一个了相关功能 import java.util.HashMap; import java.util.Map; public class TestKey{ public static void main(String[] args){ Key k1 = new Key(1,...
  • qq_16717565
  • qq_16717565
  • 2016-10-28 00:17
  • 709

java操作redis: 将string、list、map、自定义的对象保存到redis中

一、操作string 、list 、map 对象 1、引入jar: jedis-2.1.0.jar   2、代码 /**      * @param args     &...
  • owen5630
  • owen5630
  • 2015-01-27 14:51
  • 15642

java 中的Map存取对象

先创建一个类,其中有文本和计数两个属性。 package cn.zhf.test; public class Word { private String text; private int count; /** * @return text */ public String get...
  • ozhaohuafei
  • ozhaohuafei
  • 2013-11-22 19:44
  • 2199

数据存储——浅谈Java中的Set、List、Map的区别

转自http://developer.51cto.com/art/201309/410205_all.htm 数组是大小固定的,并且同一个数组只能存放类型一样的数据(基本类型/引用类型),JAVA集合可以存储和操作数目不固定的一组数据。 所有的JAVA集合都位于 java.util包中! JAVA集...
  • chuntiandejiaobu10
  • chuntiandejiaobu10
  • 2016-08-29 09:58
  • 2480
    个人资料
    • 访问:42893次
    • 积分:603
    • 等级:
    • 排名:千里之外
    • 原创:24篇
    • 转载:0篇
    • 译文:0篇
    • 评论:15条
    最新评论