HashSet与TreeSet的区别是什么

  介绍

HashSet与TreeSet的区别是什么?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。

<强>一。问题

1. HashSet, TreeSet是如何使用平等hashCode()和()方法的

2. TreeMap TreeSet中的对象何时以及为何要实现可比接口?

<强>二。回答:

1. HashSet是通过HashMap实现的,TreeSet是通过TreeMap实现的,只不过集用的只是地图的关键。

2.映射的键和设置都有一个共同的特性就是集合的唯一性.TreeMap更是多了一个有序性。

3. hashCode()和相等是HashMap用的,因为无需排序所以只需要关注定位和唯一性即可。

a.hashCode是用来计算的哈希值的,哈希值是用来确定哈希表索引的。

b.hash表中的一个索引处存放的是一张链表,所以还要通过平等的方法循环比较链上的每一个对象才可以真正定位到键值对应的条目。

c.put时,如果哈希表中没定位到,就在链表前加一个条目,如果定位到了,则更换条目中的价值,并返回旧值

d。覆写关键的hashCode()和()相等时一定要注意,不要把它们和可变属性关联上,否则属性变了之后hashCode会变,同样也会为false,这样在地图中就找不不到它了,而且这样的对象因为找不到它所以得不到释放,这样就变成了一个无效引用了(相当于内存泄漏)。

4。由于TreeMap需要排的序,所以需要一个比较器为键值进行大小比较。当然也是用比较器定位的。

a.Comparator可以在创建TreeMap时指定,这时排序时使用Comparator.compare

b。如果创建时没有指定比较器,那么就会使用key.compareTo()方法,这就要求关键必须实现可比接口。

c.TreeMap是使用树数据结构实现的,所以使用比较接口就可以完成定位了。

import  java.util.HashSet;   import  java.util.Iterator;   public  class  WpsklHashSet   {//java 中设置的使用(不允许有重复的对象):   public  static  void  main (String [], args)   {   HashSet  hashSet=new  hashSet ();   String =new 字符串(“A");   String  b=new 字符串(“B");   String  c=new 字符串(“B");   hashSet.add(一个);   hashSet.add (b);   System.out.println (hashSet.size ());   String  cz=hashSet.add (c) ?“此对象不存在“:“已经存在“;   System.out.println(“测试是否可以添加对象,“+ cz);   System.out.println (hashSet.isEmpty ());//测试其中是否已经包含某个对象   System.out.println (hashSet.contains (“A"));   Iterator  ir=hashSet.iterator ();   而(ir.hasNext ())   {   System.out.println (ir.next ());   }//测试某个对象是否可以删除   System.out.println (hashSet.remove (“a"));   System.out.println (hashSet.remove (“A"));//经过测试,如果你想再次使用红外变量,必须重新更新以下   ir=hashSet.iterator ();   而(ir.hasNext ())   {   System.out.println (ir.next ());   }   }   }/* *   *,通过这个程序,还可以测试树集的添加元素的无序性与输出的有序性   */import  java.util.TreeSet;   import  java.util.Iterator;   public  class  treeset   {   public  static  void  main (String [], args)   {   TreeSet  tree =, new  TreeSet ();   tree.add (“China");   tree.add (“America");   tree.add (“Japan");   tree.add (“Chinese");   Iterator  iter =, tree.iterator ();   而(iter.hasNext ())   {   System.out.println (iter.next ());   }   }   }

另在转一些其他的区别(感谢“百度知道”的andygulin朋友):

1, TreeSet是二差树实现的,TreeSet中的数据是自动排好序的,不允许放入零值。

2, HashSet是哈希表实现的,HashSet中的数据是无序的,可以放入空,但只能放入一个null,两者中的值都不能重复,就如数据库中唯一约束。

3, HashSet要求放入的对象必须实现HashCode()方法,放入的对象,是以HashCode码作为标识的,而具有相同内容的字符串对象,HashCode是一样,所以放入的内容不能重复。但是同一个类的对象可以放入不同的实例。

关于HashSet与TreeSet的区别是什么问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注行业资讯频道了解更多相关知识。

HashSet与TreeSet的区别是什么