精华内容
下载资源
问答
  • Set解决重复数据问题

    千次阅读 2019-10-14 09:32:49
    HashSet实现set接口,实际上是由...set不允许重复的元素,如果set已经有重复的元素,会返回false。 案例,给定一个字符串,返回第一个重复的字符。 public static String findFirstRepeatedChar(String string) ...

    HashSet实现set接口,实际上是由hashMap实现的,所以不保证遍历顺序,并且允许使用null,时间复杂度和hashMap一样,为O(1),不超过O(n)。
    set不允许重复的元素,如果set已经有重复的元素,会返回false。

    案例,给定一个字符串,返回第一个重复的字符。

    public static String findFirstRepeatedChar(String string) {
            if (Objects.isNull(string) || string.isEmpty()) {
                return null;
            }
            char[] chars = string.toCharArray();
            Set<Character> hashSet = new HashSet<Character>();
            for (char ch : chars) {
                if (hashSet.contains(ch)) {
                    return ch + "";
                }
                hashSet.add(ch);
            }
            return null;
        }
    
    展开全文
  • Set重复实现原理

    千次阅读 2018-08-31 15:35:59
    Java中的set是一个不包含重复元素的集合,确切地说,是不包含e1.equals(e2)的元素对。Set中允许添加null。Set不能保证集合里元素的顺序。 在往set中添加元素时,如果指定元素不存在,则添加成功。也就是说,如果set...

    Java中的set是一个不包含重复元素的集合,确切地说,是不包含e1.equals(e2)的元素对。Set中允许添加null。Set不能保证集合里元素的顺序。

    在往set中添加元素时,如果指定元素不存在,则添加成功。也就是说,如果set中不存在(e==null ? e1==null : e.queals(e1))的元素e1,则e1能添加到set中。

    下面以set的一个实现类HashSet为例,简单介绍一下set不重复实现的原理:

    [java] view plain copy
    import java.util.HashSet;
    import java.util.Iterator;
    import java.util.Set;

    /**
    * @version 1.0
    * @author Oliver
    * @since 1.0
    */
    publicclass HashSetTest
    {
    //自定义MyString类
    staticclass MyString{
    String value;

        public MyString(String value)  
        {  
            this.value = value;  
        }  
    }  
    publicstaticvoid main(String[] args)  
    {  
        //创建一个HashSet对象  
        Set<Object> set = new HashSet<Object>();  
        //创建连个String对象  
        String s1 = new String("a");  
        String s2 = new String("a");  
        //创建连个MyString对象  
        MyString s3 = new MyString("a");  
        MyString s4 = new MyString("a");  
        //添加元素  
        set.add(s1);  
        set.add(s2);  
        set.add(s3);  
        set.add(s4);  
        //看看对象的equals  
        System.out.println("s1.equals(s2):"+s1.equals(s2));  
        System.out.println("s3.equals(s4):"+s3.equals(s4));  
        //打印几个大小及里面的元素  
        System.out.println("set size:"+set.size());  
        for(Iterator<Object> it=set.iterator();it.hasNext();){  
            System.out.println(it.next());  
        }  
    }  
    

    }

    运行程序,输出结果:
    s1.equals(s2):true

    s3.equals(s4):false

    set size:3

    oliver.examination.part1.HashSetTest$MyString@4f1d0d

    a

    oliver.examination.part1.HashSetTest$MyString@1fc4bec

    也许你已经看出关键来了,没错就是equals方法。这么说还是不恰当,准确的说应该是equals和hashcode方法。

    java.lnag.Object中对hashCode的约定:

    1. 在一个应用程序执行期间,如果一个对象的equals方法做比较所用到的信息没有被修改的话,则对该对象调用hashCode方法多次,它必须始终如一地返回同一个整数。

    2. 如果两个对象根据equals(Object o)方法是相等的,则调用这两个对象中任一对象的hashCode方法必须产生相同的整数结果。

    3. 如果两个对象根据equals(Object o)方法是不相等的,则调用这两个对象中任一个对象的hashCode方法,不要求产生不同的整数结果。但如果能不同,则可能提高散列表的性能。

    根据第一条,s1和s2返回的hashcode值是一样的。

    在HashSet中,基本的操作都是有HashMap底层实现的,因为HashSet底层是用HashMap存储数据的。当向HashSet中添加元素的时候,首先计算元素的hashcode值,然后用这个(元素的hashcode)%(HashMap集合的大小)+1计算出这个元素的存储位置,如果这个位置位空,就将元素添加进去;如果不为空,则用equals方法比较元素是否相等,相等就不添加,否则找一个空位添加。

    会后,附赠HashSet源码中文注释版,摘自javaeye:http://xifangyuhui.javaeye.com/blog/798796

    [java] view plain copy
    public class HashSet
    extends AbstractSet
    implements Set, Cloneable, java.io.Serializable
    {
    static final long serialVersionUID = -5024744406713321676L;

    // 底层使用HashMap来保存HashSet中所有元素。    
    private transient HashMap<E,Object> map;    
    
    // 定义一个虚拟的Object对象作为HashMap的value,将此对象定义为static final。    
    private static final Object PRESENT = new Object();    
    
    /**  
     * 默认的无参构造器,构造一个空的HashSet。  
     *   
     * 实际底层会初始化一个空的HashMap,并使用默认初始容量为16和加载因子0.75。  
     */    
    public HashSet() {    
    map = new HashMap<E,Object>();    
    }    
    
    /**  
     * 构造一个包含指定collection中的元素的新set。  
     *  
     * 实际底层使用默认的加载因子0.75和足以包含指定  
     * collection中所有元素的初始容量来创建一个HashMap。  
     * @param c 其中的元素将存放在此set中的collection。  
     */    
    public HashSet(Collection<? extends E> c) {    
    map = new HashMap<E,Object>(Math.max((int) (c.size()/.75f) + 1, 16));    
    addAll(c);    
    }    
    
    /**  
     * 以指定的initialCapacity和loadFactor构造一个空的HashSet。  
     *  
     * 实际底层以相应的参数构造一个空的HashMap。  
     * @param initialCapacity 初始容量。  
     * @param loadFactor 加载因子。  
     */    
    public HashSet(int initialCapacity, float loadFactor) {    
    map = new HashMap<E,Object>(initialCapacity, loadFactor);    
    }    
    
    /**  
     * 以指定的initialCapacity构造一个空的HashSet。  
     *  
     * 实际底层以相应的参数及加载因子loadFactor为0.75构造一个空的HashMap。  
     * @param initialCapacity 初始容量。  
     */    
    public HashSet(int initialCapacity) {    
    map = new HashMap<E,Object>(initialCapacity);    
    }    
    
    /**  
     * 以指定的initialCapacity和loadFactor构造一个新的空链接哈希集合。  
     * 此构造函数为包访问权限,不对外公开,实际只是是对LinkedHashSet的支持。  
     *  
     * 实际底层会以指定的参数构造一个空LinkedHashMap实例来实现。  
     * @param initialCapacity 初始容量。  
     * @param loadFactor 加载因子。  
     * @param dummy 标记。  
     */    
    HashSet(int initialCapacity, float loadFactor, boolean dummy) {    
    map = new LinkedHashMap<E,Object>(initialCapacity, loadFactor);    
    }    
    
    /**  
     * 返回对此set中元素进行迭代的迭代器。返回元素的顺序并不是特定的。  
     *   
     * 底层实际调用底层HashMap的keySet来返回所有的key。  
     * 可见HashSet中的元素,只是存放在了底层HashMap的key上,  
     * value使用一个static final的Object对象标识。  
     * @return 对此set中元素进行迭代的Iterator。  
     */    
    public Iterator<E> iterator() {    
    return map.keySet().iterator();    
    }    
    
    /**  
     * 返回此set中的元素的数量(set的容量)。  
     *  
     * 底层实际调用HashMap的size()方法返回Entry的数量,就得到该Set中元素的个数。  
     * @return 此set中的元素的数量(set的容量)。  
     */    
    public int size() {    
    return map.size();    
    }    
    
    /**  
     * 如果此set不包含任何元素,则返回true。  
     *  
     * 底层实际调用HashMap的isEmpty()判断该HashSet是否为空。  
     * @return 如果此set不包含任何元素,则返回true。  
     */    
    public boolean isEmpty() {    
    return map.isEmpty();    
    }    
    
    /**  
     * 如果此set包含指定元素,则返回true。  
     * 更确切地讲,当且仅当此set包含一个满足(o==null ? e==null : o.equals(e))  
     * 的e元素时,返回true。  
     *  
     * 底层实际调用HashMap的containsKey判断是否包含指定key。  
     * @param o 在此set中的存在已得到测试的元素。  
     * @return 如果此set包含指定元素,则返回true。  
     */    
    public boolean contains(Object o) {    
    return map.containsKey(o);    
    }    
    
    /**  
     * 如果此set中尚未包含指定元素,则添加指定元素。  
     * 更确切地讲,如果此 set 没有包含满足(e==null ? e2==null : e.equals(e2))  
     * 的元素e2,则向此set 添加指定的元素e。  
     * 如果此set已包含该元素,则该调用不更改set并返回false。  
     *  
     * 底层实际将将该元素作为key放入HashMap。  
     * 由于HashMap的put()方法添加key-value对时,当新放入HashMap的Entry中key  
     * 与集合中原有Entry的key相同(hashCode()返回值相等,通过equals比较也返回true),  
     * 新添加的Entry的value会将覆盖原来Entry的value,但key不会有任何改变,  
     * 因此如果向HashSet中添加一个已经存在的元素时,新添加的集合元素将不会被放入HashMap中,  
     * 原来的元素也不会有任何改变,这也就满足了Set中元素不重复的特性。  
     * @param e 将添加到此set中的元素。  
     * @return 如果此set尚未包含指定元素,则返回true。  
     */    
    public boolean add(E e) {    
    return map.put(e, PRESENT)==null;    
    }    
    
    /**  
     * 如果指定元素存在于此set中,则将其移除。  
     * 更确切地讲,如果此set包含一个满足(o==null ? e==null : o.equals(e))的元素e,  
     * 则将其移除。如果此set已包含该元素,则返回true  
     * (或者:如果此set因调用而发生更改,则返回true)。(一旦调用返回,则此set不再包含该元素)。  
     *  
     * 底层实际调用HashMap的remove方法删除指定Entry。  
     * @param o 如果存在于此set中则需要将其移除的对象。  
     * @return 如果set包含指定元素,则返回true。  
     */    
    public boolean remove(Object o) {    
    return map.remove(o)==PRESENT;    
    }    
    
    /**  
     * 从此set中移除所有元素。此调用返回后,该set将为空。  
     *  
     * 底层实际调用HashMap的clear方法清空Entry中所有元素。  
     */    
    public void clear() {    
    map.clear();    
    }    
    
    /**   
     * 返回此HashSet实例的浅表副本:并没有复制这些元素本身。   
     * 
    
    展开全文
  • java 集合 Set 插入重复元素

    千次阅读 2019-05-04 13:21:35
    java 集合 Set 插入重复元素
                   


    class S{
     public int hashCode(){
      return 1;
     }
     public boolean equals(S s){
      return true;
     }
    }

    public class Test {
     
     @SuppressWarnings("unchecked")
     public static void main(String[] args) throws IOException {
      //ClassB b = new ClassB();
      //b.show();
      
      Set set = new HashSet();
      
      S s1 = new S();
      S s2 = new S();
      S s3 = new S();
      S s4 = new S();
      
      System.out.println(s1.equals(s2));
      
      set.add(s1);
      set.add(s2);
      set.add(s3);
      set.add(s4);
      
      
    //  set.add(new S());
    //  set.add(new S());
    //  set.add(new S());
    //  set.add(new S());
      
      System.out.println(set.size()); // 4    

      set不能重复说得是不能==,不是不能equals   先这样理解吧  


    //  S s1 = new S();
    //  S s2 = new S();
    //  
    //  System.out.println(s1.equals(s2));  

     

      


     }

    }

               
    展开全文
  • java:Set可以插入重复元素?

    千次阅读 2020-10-23 19:12:01
    Set<List<Integer>> res1 = new HashSet<>(); res1.add(new ArrayList<>()); res1.add(new ArrayList<>(Arrays.asList(1))); Set<List<Integer>> ...

    在set中插入对象时,一定要新建对象,不要在已有对象上改,否则会出现插入重复对象的问题!

    先看这段代码:
    1,在set1中插入list1。
    2,在list1中插入元素2。
    3,在set1中插入list1,居然能插入重复元素!

    打印出list1的hashcode会发现,插入2前list1的hashcode=32,插入2后list1的hashcode=994。插入前后list1的hashcode不同,因此对set1来说是不同的元素,所以就诡异地成功插入了重复元素。

        public static void main(String[] args) {
            Set<List<Integer>> set1 = new HashSet<>();
            List<Integer> list1 = new ArrayList<>();
            list1.add(1);
            set1.add(list1);
    
            System.out.println("#1, set1=" + set1);
    
            System.out.println("list1 hashcode=" + list1.hashCode());
            list1.add(2);
            System.out.println("list1 exist=" + set1.contains(list1));
            set1.add(list1);
            System.out.println("list1 hashcode=" + list1.hashCode());
    
            System.out.println("#2, set1=" + set1);
    
        }
    

    输出

    #1, set1=[[1]]
    list1 hashcode=32
    list1 exist=false
    list1 hashcode=994
    #2, set1=[[1, 2], [1, 2]]
    
    展开全文
  • Set真的是无序不重复吗?

    千次阅读 2019-08-26 09:20:44
    例子 public static void main(String[] args) { Set<String> set = new HashSet<>(); set.add("test1"); set.add("test7"); set.add("test3"); set.add("test6"); set.add("te...
  • Set集合去重复

    千次阅读 2018-12-17 17:59:58
    Set集合和LIst集合的方法几乎完全一样,不同是Set 无序 不可重复。 1.去除List中重复数据,并存储再List中  List&lt;String&gt; user = new ArrayList&lt;String&gt;();  user.add("111&...
  • Set集合重复元素的判断

    千次阅读 2018-06-14 08:44:06
    更重要的是Set集合不能放置重复的元素.她是怎么判断的呢?那么,我们首先要让对象具有比较性 一,存储的自定义对象实现接口 Comparable 复写public int compareTo()方法. 返回0表示二者相等. 如...
  • 用Iterator方法来判断元素是否重复,用equals()判断两个set是否相等, set存取元素是按哈希值排序, 示例代码 package test; import java.util.HashSet; import java.util.Iterator; import java.util....
  • java set的不重复

    千次阅读 2016-11-03 11:21:54
    java的set可以重复子项
  • java为什么吗list允许存储重复元素,而set不允许存储重复元素
  • C++ std::set 出现重复元素

    千次阅读 2021-03-13 23:46:58
    如题,今天自定义了一个set的排序函数,重新构造了set,往里插入元素的时候居然出现了重复元素! 首先set的比较函数含义是按照元素的出现频率比较,高频率的大于低频率,如果二者频率相等,则数值小的大于数值大的...
  • 【用set集合去重复数据,重写equals还是不成功的问题解决思路在文章最后】 需求描述: 因业务需要,通过复杂的代码逻辑从数据库取出数据放入List集合中,涉及多次从访问数据库取出数据放入List集合中,其中会取到...
  • 利用Java Set 去除重复object

    万次阅读 2013-05-31 11:16:59
    import java.util.ArrayList; import java.util.HashSet; import java.util.List;... * 类描述:set集合针对String 类型和8大基础数据类型 过滤掉重复数据,如果存放的是其他类型对象,则需要重写hashCode方
  • java 利用set重复数据

    万次阅读 2018-07-31 10:10:13
    1.去重复字符串 public static void main(String args[]){ List&lt;String&gt; list=new ArrayList&lt;String&gt;(); list.add("abc"); list.add("ddd"); list....
  • java厚积薄发之set去除重复object

    千次阅读 2016-12-01 17:10:17
    public class SetDemo { public static void main(String[] args) { Set nameSet = new HashSet(); nameSet.add("张三"); nameSet.add("李四"); nameSet.add("王五"); nameS
  • C++学习-STL-容器--SET保存重复

    千次阅读 2019-08-16 14:53:44
    2、set集合中没有重复的元素 当我们用set来保存自定义类对象的时候,我们需要规定比较规则,就是重载less<>(),因为set要排序,排序又要用到比较。 例子: class Test2 { public: Test2(int n):num(n) ...
  • Set并不是无序的,传统说的Set无序是指HashSet,它不能保证元素的添加顺序,更不能保证自然顺序,而Set的其他实现类是可以实现这两种顺序的。 保证元素添加的顺序,不保证元素自然的顺序,可重复:List 不保证元素...
  • Set 怎么保证不重复

    千次阅读 2017-07-04 17:21:30
    因为map中的key是不允许重复的,所以set中的元素不能重复。HashMap的往里放元素的源码!!! public V put(K key, V value) { if (key == null) return putForNullKey(value); int hash = hash(key.hashCode()...
  • eclipse的workset项目重复显示解决方案

    千次阅读 2018-07-12 11:14:05
    两个workset里面出现同样的项目 解决方案: 1,删除某一个workset 2,File - NEW - Other - Java Working Set 3,输入刚刚删除的那一个workset的名称 4,在workspace content中选择你要加入的项目,然后点击...
  • Java中利用Set判断List集合中是否有重复元素

    万次阅读 多人点赞 2018-12-05 20:05:36
    在开发工作中,我们有时需要去判断List集合中是否含有重复的...我们只需要将List集合转化为Set集合,再进行比较就可以实现了: 代码如下: package com.test; import java.util.ArrayList; import java.util.HashSe...
  • Set集合如何判断重复元素

    千次阅读 2019-04-20 15:06:00
    1.TreeSet子类是利用Comparable接口来实现重复元素的判断,但是Set集合的整体特征就是不允许保存重复元素。 2.HashSet判断元素重复是利用Object类中的方法实现的: -|对象编码:public int hashCode(); -|对象....
  • set为什么不能存储重复

    千次阅读 2018-11-24 16:42:52
    set的两个主要实现类,TreeSet和HashSet,...map每次put如果key值不存在,返回的是null,key值如果存在,则返回之前key的oldValue,这样与null做对比的时候返回的就是false,在set层面就是插入重复值失败了  ...
  • java中set集合如何去除重复元素

    千次阅读 2017-07-25 19:12:11
    set集合是可以重复的元素集合; 用set集合添加一个学生对象元素时:import java.util.ArrayList; import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.Set;public class ...
  • set集合去掉重复数据

    千次阅读 2016-08-25 22:08:56
    解决方案:将数据已存在的数据放入set集合,要导入的数据也放入另一个集合list,遍历list每条数据,获取数据库没有的数据,即为要导入的数据。public static List, Object>> isHaveStock(List, Object>> oldList, ...
  • java中set集合的重复验证机制

    千次阅读 2018-09-30 14:47:18
    我们知道,set集合很重要的一个特性,是不允许存储重复的元素。那么,这究竟是怎么验证的呢。在之前的资料查询中,有这样一个说法,set集合进行插入的时候,会调用对象的equals方法,判断元素是否相同,若equals...
  • 利用set对list进行合并去重复

    千次阅读 2017-05-06 12:56:38
    利用set对list进行合并去重复set是不重复的集合,可以使用set对有重复的两个list集合进行合并 List<String> list = new ArrayList(); list.add("a"); list.add("b"); list.add("c"); list.add("a"); //利用set ...
  • Set集合不允许存储重复元素原理

    千次阅读 2020-06-22 20:46:38
    Set集合不允许存储重复元素原理 package com.Set; import java.util.HashSet; /* Set集合不允许存储重复元素原理 */ public class Demo02HashSetSaveString { public static void main(String[] args) { //创建...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 950,831
精华内容 380,332
关键字:

set可以重复吗