True or False? and WHY??? Java HashSet Contains

import java.util.HashSet; 

public class MyClass
{
     public String s; 

     public MyClass(String s)
     {
         this.s = s;
     } 

     public int hashCode()
     {
         return s.hashCode();
     } 

     public boolean equals(Object obj)
     {
         if(obj == null)
             return false; 

         if(!(obj instanceof MyClass))
             return false; 

         MyClass other = (MyClass)obj;
         if(s == null)
         {
             return false;
         } 

         return(s.equals(other.s));
     } 

     public static void main(String[] args)
     {
         HashSet<MyClass> set = new HashSet<MyClass>(); 

         MyClass mc1 = new MyClass("a");
         set.add(mc1); 

         mc1.s = "b"; 

         MyClass mc2 = new MyClass("b"); 

         if(set.contains(mc2))
         {
             System.out.println("True");
         }
         else
         {
             System.out.println("False");
         }
     }
}

结果是False

我猜原因是:

在向set存储时。位置是使用之前的哈希值得到的。

之后改变了mc1.s使得其哈希值发生了变化。

调用contains方法时,找的是之后哈希值指向的位置。这是尽管mc1和mc2有同样的哈希值、且true == mc1.equeals(mc2)。但在该位置上根本没有存储东西,所以返回false

另外刚才找到Set的API文档里有这么一段话

Note: Great care must be exercised if mutable objects are used as set elements. The behavior of a set is not specified if the value of an object
is changed in a manner that affects equals comparisons while the object is an element in the set.

这样结果是False或许就是由于HashSet的实现方法(用了哈希散列存储)~~

时间: 2024-11-09 01:28:01

True or False? and WHY??? Java HashSet Contains的相关文章

java HashSet 与 TreeSet

Set接口并没有对Collection接口进行扩充,只是比Collection接口要求更加严格了,不能增加重复的元素,并且采用散列的储存方式,所以没有顺序 import java.util.Set; import java.util.HashSet; import java.util.TreeSet; public class Test { public static void main(String[] args) { //Set allSet = new HashSet();//@结果 1

Java HashSet

Set集合,先从HashSet学起. 1.HashSet底层实际上是一个HashMap,HashMap底层采用了哈希表数据结构. 2.哈希表又叫做散列表,哈希表底层是一个数组,这个数组中每一个元素是一个单向链表,每一个单向链表都有一个独一无二的hash值,代表数组的下标.在某个单向链表中的每一节点上的hash值是相等的,hash值实际上是key调用hashCode方法,再通过"hash function"转换成的值. 3.如何向哈希表中添加元素: 先调用被存储的key的hashCode

Jdbc Url 设置allowMultiQueries为true和false时底层处理机制研究

一个mysql jdbc待解之谜 关于jdbc  url参数 allowMultiQueries 如下的一个普通JDBC示例: String user ="root"; String password = "root"; String url = "jdbc:mysql://localhost:3306"; Connection conn = java.sql.DriverManager.getConnection(url , user, pas

JavaScript中值的真真假假(true and false)

值为flase的有: false 0 "" //空串 null undefined NaN 除了以上的之外的都是ture,包括"0" (zero in quotes), "false" (false in quotes) , empty functions, [](空数组), and {}(empty objects),都是为true var a = !!(0); // false var b = !!("0"); // tr

Java HashSet和LinkedHashSet的用法

Java HashSet和LinkedHashSet的用法 类HashSet和LinkedHashSet都是接口Set的实现,两者都不能保存重复的数据.主要区别是HashSet不保证集合中元素的顺序,即不能保证迭代的顺序与插入的顺序一致. 而LinkedHashSet按照元素插入的顺序进行迭代,即迭代输出的顺序与插入的顺序保持一致. 以下是HastSet和LinkedHashSet的用法示例: [java] view plain copy import java.util.Collections

js中return,return true,return false的用法及区别

1.语法及返回方式 ①返回控制与函数结果         语法为:return 表达式;         语句结果函数的执行,返回调用函数,而且把表达式的值作为函数结果返回出去 ②返回控制无函数结果         语法为:return;         在大多数情况下,为事件处理函数如果让其返回false,可以防止默认的事件行为.例如,默认情况下,点击一个<a>标签元素,页面会跳转到该元素href属性指定的页. 而return false就相当于终止符,return true就相当于执行符.

[android警告] AndroidManifest.xml警告 Should explicitly set android:allowBackup to true or false

Android中AndroidManifest.xml警告 Should explicitly set android:allowBackup to true or false (it's true by default, and that can have some security implications for the application's data) 解决方案: <application android:allowBackup="true"或 <applic

instanceof 用于确定一个 PHP 变量是否属于某一类 class 的实例 , 返回true或者false

<?phpclass MyClass{} class NotMyClass{}$a = new MyClass; var_dump($a instanceof MyClass);var_dump($a instanceof NotMyClass);?> 以上例程会输出: bool(true) bool(false)

True Positive|True Negative|False Positive|False Negative

True Positive|True Negative|False Positive|False Negative 表示分类正确: True Positive:本来是正样例,分类成正样例. True Negative:本来是负样例,分类成负样例. 表示分类错误: False Positive :本来是负样例,分类成正样例,通常叫误报. False Negative:本来是正样例,分类成负样例,通常叫漏报. true positive rate = true positive / (true po