对hashmap与hashcode()、equals()的理解

1.equals方法没被重写的时候   比较的只是对象的地址  重写之后 比较的才是对象里的内容

2.重写equals的时候 务必需要重写hashcode 不然在用到容器的时候 会出现问题 因为容器会去判断新加入的对象的hashcode 在集合中是否存在 再去判断对象的内容

3.hashmap的理解

hashmap其实就是数组+链表   这里所谓的链表 无非就是 在hashmap里定义了一个静态Node类 这个类有Node next这个引用 可以指向当前下一个在当前索引下标下的Node节点

进行put的时候 会根据传入的key进行hash(key.hashcode())  然后算出索引 去数组里找

1.如果没找到下标 那么直接addentry()

2.存在下标的话(其实就是链表的第一个元素),判断是否存在相同的key 相同那么就覆盖原来的value,不同就是直接放在链表的第一个,为什么放在第一个,那是因为定义的Node节点,属就是Node next

3.同时有两个线程put的时候 一旦超出数组长度  会进行resize双倍扩容 此时存在对table这个公共变量资源 进行竞争  所以存在多线程安全问题

所以在判断高并发 高访问的时候 可以考虑用concurrenthashmap

时间: 2024-10-12 18:53:49

对hashmap与hashcode()、equals()的理解的相关文章

hashcode和equals的理解

属性值相等的两个对象,分别放进List和Set Set集合: 两个对象的equals和hashcode都相等,才认为是同一个对象: 如果equals为false,则不管hashcode什么结果,Set size为2: 如果equals为true,只有当hashcode也相等,size才为1 所以要使得两个对象相等,必须同时重写equals和hashcode. http://blog.csdn.net/afgasdg/article/details/6889383 总结: 1.equals方法用于

HashMap中的equals()和hashCode()

HashMap中的equals和hashCode Java的Object对象有9个方法,其中的equals()和hashCode()在hashMap的实现里面起着比较重要的作用,我在研究hashMap的源码时就遇到了它们俩,此篇博文主要是为了记录它们之间的相爱相杀. 为了说明它们的关系,我们需要HashMap的背景知识. HashMap的存储方式:HashMap的实现方式是数组链,不同的对象根据其哈希码hashCode方法的返回值)找到对应的数组下标,然后存入数组.不同的对象有相同的哈希码时怎么

【代码优化】equals深入理解

覆盖equals时,遵守通用约定 对equal方法的覆盖看起来很简单,但是有许多情况是容易导致错误,最好的避免这些错误的办法 就是不覆盖equals方法. 必须遵循的原则: 自反性--对于任何非空的引用 x,有x.equals(x) 为true: 对称性--对于任何非空的引用x,y,如果x.equals(y) 为true,则必有y.equals(x) 为true: 传递性--对于任何非空的引用x,y,z,如果x.equals(y) 为true且y.equals(z) 为true, 则必有x.eq

HashMap与HashCode有关,用Sort对象排序

遍历Map,使用keySet()可以返回set值,用keySet()得到key值,使用迭代器遍历,然后使用put()得到value值. 上面这个算法的关键语句: Set s=m.keySet(); Interator it=new interator(); Object key=it.next(); Object value=m.get(key); 注意:HashMap与HashCode有关,用Sort对象排序. 如果在HashMap中有key值重复,那么后面一条记录的value覆盖前面一条记录

HashMap中的equals和hashCode

Java的Object对象有9个方法,其中的equals()和hashCode()在hashMap的实现里面起着比较重要的作用,我在研究hashMap的源码时就遇到了它们俩,此篇博文主要是为了记录它们之间的相爱相杀. 为了说明它们的关系,我们需要HashMap的背景知识. HashMap的存储方式 HashMap的实现方式是数组链,不同的对象根据其哈希码(hashCode方法的返回值)找到对应的数组下标,然后存入数组.不同的对象有相同的哈希码时怎么办?这就由数组链中的链来解决了,相同哈希码的对象

对hashcode、equals的理解

1.首先hashcode和equals都是java每个对象都存在的方法,因为他们两是Object的方法. 2.hashcode方法默认返回的是该对象内存地址的哈希码,然而你会发现,Object类中没有此方法的实现,是一个native方法,由c++实现,java只负责调用.像String等都对hashcode实现了重写,同样也对equals进行了重写,已达到自己的需求. 3.equals方法默认返回的是 this==o,也就是判断两个对象的地址是否相同,如果相同则返回true,否则false:这样

爱问面试题:==和equals()和Hashcode()三者的理解

重写前: * ==表示两个对象的内存地址 * equals()也表示对象内存地址 * hashCode()表示该对象在JVM中的32位内存地址 重写后: ==仍表示两个对象的内存地址 equals()表示连个对象的值是否相等,相等就视为同一个对象 如果equals()方法重写,那么hashCode()方法也要重写,因为要保证同一个对象的hashCode值相等这样的规定. 根据javaAPI文档上的介绍: (1).同一个对象的hashCode值一定相同,无论是否重写过equals()方法,也就是说

Java hashCode(), equals()

转自:http://blog.csdn.net/fenglibing/article/details/8905007冯立彬的博客 以下是关于HashCode的官方文档定义: hashcode方法返回该对象的哈希码值.支持该方法是为哈希表提供一些优点,例如,java.util.Hashtable 提供的哈希表. hashCode 的常规协定是: 在 Java 应用程序执行期间,在同一对象上多次调用 hashCode 方法时,必须一致地返回相同的整数,前提是对象上 equals 比较中所用的信息没有

关于new HashMap<>(1)中1的理解(hashMap的加载因子)

新入公司,阅读代码的时候发现了一行代码,为 Map<String, String> map=new HashMap<>(1); 对于这个括号里面的1不能理解,于是查了资料,大概了解了. 解释如下:这个1被称为加载因子. API: /** * Constructs an empty <tt>HashMap</tt> with the specified initial * capacity and the default load factor (0.75).