Java哈希集是否对字符串引用或值起作用?

Java哈希集是否对字符串引用或值起作用?,java,string,reference,hashset,Java,String,Reference,Hashset,我有以下几点 HashSet<String> set1 = new HashSet<String>(); HashSet<String> set2 = new HashSet<String>(); String strB1 = "B"; String strB2 = "B"; set1.add( "A" ); set1.add( strB1 ); set2.add( strB2 ); set1.removeAll( set2 ); Hash

我有以下几点

HashSet<String> set1 = new HashSet<String>();
HashSet<String> set2 = new HashSet<String>();
String strB1 = "B";
String strB2 = "B";

set1.add( "A" );
set1.add( strB1 );
set2.add( strB2 );

set1.removeAll( set2 ); 
HashSet set1=new HashSet();
HashSet set2=新的HashSet();
字符串strB1=“B”;
字符串strB2=“B”;
第1条增补(“A”);
set1.添加(strB1);
set2.add(strB2);
set1.移除所有(set2);

set1最终是只包含“A”还是也包含“B”?

Java中的字符串会得到特殊处理。出于优化目的,缓存并重用任何字符串文字。因此,strB1和strB2将持有相同的引用,因此set1在代码执行后只应包含“a”

至少根据Java文档和SCJP培训手册


但是,正如在评论中所发布的那样,尝试它要比在这里发布更快…

Java中的字符串被特别处理。出于优化目的,缓存并重用任何字符串文字。因此,strB1和strB2将持有相同的引用,因此set1在代码执行后只应包含“a”

至少根据Java文档和SCJP培训手册

但是,正如在评论中所发布的那样,尝试它要比在这里发布更快…

使用对象相等(),而不是标识(“引用相等”)

另外,
HashSet
使用
Object.hashCode
作为散列函数

不幸的是,要“了解”这一点,需要对文档进行一点“阅读”,并了解如何实现哈希。从
HashSet.contains的文档中

如果此集合包含指定的元素,则返回true。更正式地说,当且仅当该集合包含元素e时,返回true,即(o==null?e==null:o.equals(e)

更一般的文件说明:

不包含重复元素的集合。更正式地说,集合不包含一对元素e1和e2,因此e1.equals(e2),最多包含一个空元素。正如它的名字所暗示的,这个接口为数学集合抽象建模

除了极少数例外,例如,Java中的数据结构是基于平等而非身份的

因此,为了回答这个问题,HashSet处理“字符串值”

(由于字符串插入,此示例可能特别容易引起误解,但这不会改变上述内容,因为标识意味着相等,即使反之亦然。)

使用对象相等(),而不是标识(“引用相等”)

另外,
HashSet
使用
Object.hashCode
作为散列函数

不幸的是,要“了解”这一点,需要对文档进行一点“阅读”,并了解如何实现哈希。从
HashSet.contains的文档中

如果此集合包含指定的元素,则返回true。更正式地说,当且仅当该集合包含元素e时,返回true,即(o==null?e==null:o.equals(e)

更一般的文件说明:

不包含重复元素的集合。更正式地说,集合不包含一对元素e1和e2,因此e1.equals(e2),最多包含一个空元素。正如它的名字所暗示的,这个接口为数学集合抽象建模

除了极少数例外,例如,Java中的数据结构是基于平等而非身份的

因此,为了回答这个问题,HashSet处理“字符串值”


(由于字符串插入,此示例可能会产生误导,但这不会改变上述内容,因为即使相反的说法不正确,标识也意味着相等。)

您尝试过吗?(Java中很少有标准数据结构作用于对象标识,因为大多数都是相等的。这样做会让您知道。此外,这里只有一个表示“B”的字符串对象。)我认为这是一个非常合理的问题。没有理由怀疑,仅仅因为代码在运行时做了一件事,它总是会有这种行为,或者这种行为在不同平台之间是可移植的。如果您无法自己测试它,因为您没有安装工具,那么您可以始终使用。@templatetypedef接着说:“我试过了,得到了X的结果,但我不明白为什么,我也不确定我是否能相信这种行为。我读过文档,但不太明白他们说Y是否适用于这种情况。”我同意你的看法。就目前情况而言,它只是“我宁愿这样问,也不愿编译和运行它。”你试过吗?(Java中很少有标准数据结构作用于对象标识,因为大多数都是相等的。这样做会让您知道。此外,这里只有一个表示“B”的字符串对象。)我认为这是一个非常合理的问题。没有理由怀疑,仅仅因为代码在运行时做了一件事,它总是会有这种行为,或者这种行为在不同平台之间是可移植的。如果您无法自己测试它,因为您没有安装工具,那么您可以始终使用。@templatetypedef接着说:“我试过,得到了X的结果,但我不明白为什么,我也不确定我是否能相信这种行为。我阅读了文档,但不太明白他们说Y是否适用于这种情况。”我同意你的看法。就目前的情况而言,它只是“我宁愿这样问,也不愿编译和运行它。”此示例将以同样的方式处理字符串或非字符串对象,因为hashset基于equals(和hashcode)进行操作方法。因此,如果这两个对象相等,无论它们是否具有相同的标识,remove方法都会将其删除。它没有任何具有内部字符串文本的内容。对于任何类型的对象,其行为都是相同的。发布的此示例将以相同的方式处理字符串或非字符串对象,因为哈希集是基于相等进行操作的(和hashcode)方法。因此,如果两个对象相等,无论它们是否具有相同的标识,remove方法都会将其删除。它与