java,hashset,string一点问题?为啥hashset可以识别String唯一性?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java,hashset,string一点问题?为啥hashset可以识别String唯一性?相关的知识,希望对你有一定的参考价值。
我以为String是引用数据类型,加入的时候,只会看地址,不会看内容,但是我错了,加入其中的String还是保持了唯一性...
T类的id就不唯一,这符合我的预想
只是输出1,这就不好说了,hashset怎么还会判断内容等不等啊
因为你存储T类型的时候,set集合里面存储的是T的对象,你创建了三个对象t1,t2,t3,虽然这三个对象的id都是1,但是这三个对象是不同的对象,所以存在set里面会都存在。
而下面那个集合存储的是字符串,存在在s里面的时候就是比较的是字符串的值,由于你的s1,s2,s3的值是相同的,你虽然加了双引号,但是没有作用。给你看看样列,你应该就清楚了!
程序代码1:
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
public class test
public static void main(String[] args) throws IOException
Set<String> s=new HashSet<String>();
s.add("1");
s.add("1"+"");
s.add(""+"1");//这里其实三个字符串的值是相同的。比较不能用==而要用equals
Iterator it=s.iterator();
while(it.hasNext())
System.out.println(it.next());
运行结果1:
程序代码2:
import java.io.IOException;import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
public class test
public static void main(String[] args) throws IOException
Set<String> s=new HashSet<String>();
s.add("1");
s.add("1"+" ");
s.add(" "+"1");//这里其实三个字符串的值都是不相等
Iterator it=s.iterator();
while(it.hasNext())
System.out.println(it.next());
运行结果2:
参考技术A 在java 中字符串对象是一种特殊的对象.String 类是一个不可变的类..也就说,String 对象一旦创建就不允许修改。String 类有一个对应的 String 池,也就是 String pool.每一个内容相同的字符串对象都对应于一个 pool 里的对象. 所以在hashSet中存储两个内容相同的String,实际上他们都是对应于一个pool里的对象。所以说不是hashset可以识别string的唯一性,而是内容相同的String他们其实就是一个对象。在不允许重复的set中自然是不允许同一个对象存在两次的。 参考技术B String s1 = new String("123");
String s2 = new String("123");
System.out.println(s1.equals(s2));
可以看到结果为true
hashset会使用equals比较新添加的内容和已存在的内容,相同则不重复添加 参考技术C API这样写
public boolean add(E e)
如果此 set 中尚未包含指定元素,则添加指定元素。更确切地讲,如果此 set 没有包含满足
(e==null ? e2==null : e.equals(e2)) 的元素 e2,则向此 set 添加指定的元素
e。如果此 set 已包含该元素,则该调用不更改 set 并返回 false。
也就是说,比较是用的equals方法
实际上看源码会有更好的理解,hashset存的时候实际上是按照hashmap存,
(k = e.key) == key || key.equals(k)
判断是通过==和equals方法,满足一个就可以。本回答被提问者和网友采纳
Java:如何将 String [] 转换为 List 或 Set [重复]
【中文标题】Java:如何将 String [] 转换为 List 或 Set [重复]【英文标题】:Java: How to convert String[] to List or Set [duplicate] 【发布时间】:2012-08-12 18:27:12 【问题描述】:如何将 String[] (Array) 转换为 Collection,如 ArrayList 或 HashSet?
【问题讨论】:
不是有java.util.Arrays.asList(array)
这样的东西吗?
【参考方案1】:
Arrays.asList() 在这里可以解决问题。
String[] words = "ace", "boom", "crew", "dog", "eon";
List<String> wordList = Arrays.asList(words);
要转换成Set,你可以这样做
Set<T> mySet = new HashSet<T>(Arrays.asList(words));
【讨论】:
从 Java 9 开始:SetIllegalArgumentException
【参考方案2】:
最简单的方法是:
String[] myArray = ...;
List<String> strs = Arrays.asList(myArray);
使用方便的Arrays 实用程序类。请注意,您甚至可以这样做
List<String> strs = Arrays.asList("a", "b", "c");
【讨论】:
【参考方案3】:Collections.addAll 提供最短(单行)收据
拥有
String[] array = "foo", "bar", "baz";
Set<String> set = new HashSet<>();
你可以这样做
Collections.addAll(set, array);
【讨论】:
【参考方案4】:这是一个旧代码,无论如何,尝试一下:
import java.util.Arrays;
import java.util.List;
import java.util.ArrayList;
public class StringArrayTest
public static void main(String[] args)
String[] words = "word1", "word2", "word3", "word4", "word5";
List<String> wordList = Arrays.asList(words);
for (String e : wordList)
System.out.println(e);
【讨论】:
【参考方案5】:如果你真的想用一套:
String[] strArray = "foo", "foo", "bar";
Set<String> mySet = new HashSet<String>(Arrays.asList(strArray));
System.out.println(mySet);
输出:
[foo, bar]
【讨论】:
【参考方案6】:虽然这不是这个问题的严格答案,但我认为它很有用。
数组和集合可以麻烦转换成 Iterable,这样可以避免执行硬转换的需要。
例如,我写这个是为了用分隔符将列表/数组连接成一个字符串
public static <T> String join(Iterable<T> collection, String delimiter)
Iterator<T> iterator = collection.iterator();
if (!iterator.hasNext())
return "";
StringBuilder builder = new StringBuilder();
T thisVal = iterator.next();
builder.append(thisVal == null? "": thisVal.toString());
while (iterator.hasNext())
thisVal = iterator.next();
builder.append(delimiter);
builder.append(thisVal == null? "": thisVal.toString());
return builder.toString();
使用可迭代意味着您可以输入 ArrayList 或类似的内容,也可以将其与 String...
参数一起使用,而无需进行任何转换。
【讨论】:
【参考方案7】:java.util.Arrays.asList(new String[]"a", "b")
【讨论】:
【参考方案8】:最简单的方法是通过
Arrays.asList(stringArray);
【讨论】:
【参考方案9】:String[] w = "a", "b", "c", "d", "e";
List<String> wL = Arrays.asList(w);
【讨论】:
以上是关于java,hashset,string一点问题?为啥hashset可以识别String唯一性?的主要内容,如果未能解决你的问题,请参考以下文章
Set<String> setStr=new HashSet<String>()
Java Spark 如何将 JavaPairRDD<HashSet<String>, HashMap<String, Double>> 保存到文件中?
如何在 C# 中使用带有 HashSet<ReadOnlyCollection<string>> 类型的 exceptWith?