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.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");//这里其实三个字符串的值是相同的。比较不能用==而要用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 开始:Set mySet = Set.of(words); @StéphaneMillien 警告:如果存在重复值,这将引发 IllegalArgumentException【参考方案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唯一性?的主要内容,如果未能解决你的问题,请参考以下文章

C#中List怎么转换成hashset

Java自学-集合框架 HashSet

Java中HashSet使用源码演示

[Java基础]HashSet集合概述和特点

Set<String> setStr=new HashSet<String>()

Java Spark 如何将 JavaPairRDD<HashSet<String>, HashMap<String, Double>> 保存到文件中?