Closed. This question needs to be more focused。它当前不接受答案。
                            
                        
                    
                
            
                    
                
                        
                            
                        
                    
                        
                            想改善这个问题吗?更新问题,使其仅通过editing this post专注于一个问题。
                        
                        6年前关闭。
                    
                
        

今天,面试官问我:Set如何保证不可重复?

最佳答案

答案在于add方法的源代码。例如,在TreeSet的源代码中,add方法的实现如下:

public boolean add(E e)
{
    return m.put(e, PRESENT)==null;
}


其中,PRESENTObject类的对象。而mNavigableMap的对象。此NavigableMap m用于将元素e作为key存储,并将PRESENT作为其value存储到给定键e。因此,m中的每个键都具有相同的对象PRESENT。 oracle doc中定义的putMap方法是:


  将指定值与该映射中的指定键相关联。如果该映射先前包含该键的映射,则替换旧值。
  ...
  ...
  返回:与键关联的先前值;如果没有键的映射关系,则返回null。 (返回null可能还表明该映射先前将null与key关联。)


因此,当您将重复元素放入set中时,此元素将作为键值NavigableMap放入PRESENT中。如果NavigableMap中不存在此键,则put方法将返回null,因此
m.put(e,PRESENT)==null返回true,我们知道该元素已添加。如果键已经存在于NavigableMap中,则put方法用PRESENT覆盖valuekey eNavigableMap并返回旧值(即PRESENT),因此
m.put(e,PRESENT)==null返回false,我们知道未添加该元素。

关于java - Set接口(interface)如何保证不可重复,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17432672/

10-10 22:33