`
paddy.w
  • 浏览: 505039 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

[转帖]HashSet和TreeSet的区别是什么?

    博客分类:
  • Java
阅读更多
首先感谢malixxx,借用文章转载一下。

一. 问题

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

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

二. 回答:

    1. HashSet是通过HashMap实现的,TreeSet是通过TreeMap实现的,只不过Set用的只是Map的key。(注意理解一下这句话,可以参考HashSet与HashMap的区别

    2. Map的key和Set都有一个共同的特性就是集合的唯一性.TreeMap更是多了一个有序性.

    3. hashCode和equal()是HashMap用的, 因为无需排序所以只需要关注定位和唯一性即可.
       a. hashCode是用来计算hash值的,hash值是用来确定hash表索引的.
       b. hash表中的一个索引处存放的是一张链表, 所以还要通过equal方法循环比较链上的每一个对象 才可以真正定位到键值对应的Entry.
       c. put时,如果hash表中没定位到,就在链表前加一个Entry,如果定位到了,则更换Entry中的value,并返回旧value
       d. 覆写key的hashCode()和equal()时一定要注意,不要把它们和可变属性关联上,否则属性变了之后hashCode会变,equal也会为false, 这样在Map中就找不不到它了,而且这样的对象因为找不到它所以得不到释放,这样就变成了一个无效引用了(相当于内存泄漏).

    4. 由于TreeMap需要排序,所以需要一个Comparator为键值进行大小比较.当然也是用Comparator定位的.
       a. Comparator可以在创建TreeMap时指定,这时排序时使用Comparator.compare
       b. 如果创建时没有指定Comparator,那么就会使用key.compareTo()方法,这就要求key必须实现Comparable接口.
       c. TreeMap是使用Tree数据结构实现的,所以使用compare接口就可以完成定位了.

<--------------------------非常不给力的分割线--------------------------->

import java.util.HashSet; 
import java.util.Iterator; 
public class WpsklHashSet 
{ 
//java 中Set的使用(不允许有重复的对象): 
public static void main(String[] args) 
{ 
HashSet hashSet=new HashSet(); 
String a=new String("A"); 
String b=new String("B"); 
String c=new String("B"); 
hashSet.add(a); 
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(); 
while(ir.hasNext()) 
{ 
  System.out.println(ir.next()); 
} 
//测试某个对象是否可以删除 
System.out.println(hashSet.remove("a")); 
System.out.println(hashSet.remove("A")); 
//经过测试,如果你想再次使用ir变量,必须重新更新以下 
ir=hashSet.iterator(); 
while(ir.hasNext()) 
{ 
  System.out.println(ir.next()); 
} 

} 
} 
/** 
* 通过这个程序,还可以测试树集的添加元素的无序性与输出的有序性 
*/ 

import java.util.TreeSet; 
import java.util.Iterator; 

public class TreeSetTest 
{ 
   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(); 
       while(iter.hasNext()) 
       { 
           System.out.println(iter.next()); 
       } 
   } 
} 


    另在转一些其他的区别(感谢“baidu知道”的andygulin朋友):
     1、TreeSet 是二差树实现的,Treeset中的数据是自动排好序的,不允许放入null值。

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

     3、HashSet要求放入的对象必须实现HashCode()方法,放入的对象,是以hashcode码作为标识的,而具有相同内容的 String对象,hashcode是一样,所以放入的内容不能重复。但是同一个类的对象可以放入不同的实例 。
分享到:
评论

相关推荐

    排序之HashSet和TreeSet的区别

    在Java编程语言中,集合框架是处理数据的重要组成部分,其中`HashSet`和`TreeSet`是两种常用的Set接口实现类。它们各自具有独特的特性和用途,理解它们的区别对于编写高效且正确的代码至关重要。 首先,`HashSet`是...

    详解Java中HashSet和TreeSet的区别

    Java HashSet 和 TreeSet 的区别详解 HashSet 和 TreeSet 是 Java 中两个常用的集合类,它们都实现了 Set 接口,但它们之间有很大的区别。本文将详细介绍 HashSet 和 TreeSet 的区别,帮助大家更好地理解和使用这些...

    HashSet和TreeSet_围墙之外

    总结一下,HashSet和TreeSet的主要区别在于: 1. 存储结构:HashSet使用哈希表,TreeSet使用红黑树。 2. 顺序:HashSet无特定顺序,TreeSet保持排序。 3. 插入、删除和查找效率:HashSet平均O(1),最坏O(n);TreeSet...

    HashSet和TreeSet使用方法的区别解析

    HashSet和TreeSet使用方法的区别解析 HashSet和TreeSet都是Java集合框架中的Set接口实现,用于存储不重复的元素。但是,它们在使用方法和实现机理上有很大的区别。 首先,从使用方法上讲,HashSet和TreeSet都可以...

    HashSet和TreeSet.doc

    HashSet 和 TreeSet 是 Java 中两种常用的 Set 集合实现,它们都继承自 Set 接口,但实现方式和特性上存在显著差异。 首先,HashSet 是基于哈希表(HashMap 实例)来存储元素的,因此它提供了快速的插入、删除和...

    HashSet,TreeSet和LinkedHashSet的区别1

    本文主要探讨了三种基于Set接口的实现类:HashSet、LinkedHashSet和TreeSet,它们各自有不同的特性和使用场景。 首先,HashSet是最基础的Set实现,它不保证元素的特定顺序,也不保证在多次操作后保持元素的顺序不变...

    Java 集合方面的面试题

    HashSet 和 TreeSet 有什么区别? HashMap 和 TreeMap 有什么区别? 什么是迭代器?如何使用它来遍历集合? 什么是 fail-fast 机制? 如何使用 Collections 类对集合进行排序? 什么是 Comparable 和 Comparator ...

    treemap treeset hashset hashmap 简要介绍

    在Java编程语言中,集合框架提供了多种数据结构来存储和操作数据,其中`TreeMap`、`TreeSet`、`HashSet`以及`HashMap`是最常用的数据结构之一。这些集合类各自有着独特的特性和应用场景,下面将对它们进行详细介绍。...

    day18-集合-中(HashSet&TreeSet&比较器).zip

    在Java编程语言中,集合框架是处理对象组的重要工具,其中`HashSet`和`TreeSet`是两种常见的接口实现类,分别提供了不同的功能和性能特性。本教程将深入探讨这两个集合类以及它们与比较器(Comparator)的关系。 ...

    List 去重的6种方法(contains、迭代、hashSet、treeSet、linkedHashSet、stream)

    比较遗憾的是,TreeSet 虽然实现起来也比较简单,但它有着和 HashSet 一样的问题,会自动排序 5:LinkedHashSet去重(有序) 从代码和执行结果可以看出,LinkedHashSet 是到目前为止,实现比较简单,且最终生成的新...

    HashMap与HashTable和HashSet的区别

    ### HashMap与HashTable和HashSet的区别 #### 一、概述 在Java集合框架中,`HashMap`, `HashTable` 和 `HashSet` 是三个重要的数据结构,它们分别实现了`Map`接口和`Set`接口,提供了不同的功能来满足不同的编程...

    java面试题.docx

    3. HashSet 和 TreeSet 有什么区别? 答:HashSet 是基于哈希表实现的,不保证元素的顺序,TreeSet 是基于树结构实现的,保证元素的顺序。 Java 多线程编程 1. Java 中的线程状态有哪些? 答:Java 中的线程状态有...

    java 中HashMap、HashSet、TreeMap、TreeSet判断元素相同的几种方法比较

    在Java编程中,HashMap、HashSet、TreeMap和TreeSet是四种常见的集合类,它们各自有特定的用途和内部实现机制。这些数据结构用于存储和管理数据,其中HashMap和HashSet是基于哈希表实现的,而TreeMap和TreeSet则是...

    对于java集合类的一个简单介绍

    ArrayList和LinkedList是List接口的两个常用的实现类,而HashSet和TreeSet是Set接口的两个常用的实现类。Iterator是一种设计模式,提供了遍历集合的能力。Collection接口是Java集合类中最高级的接口,提供了基本的...

    java 集合框架(TreeSet练习)

    `TreeSet`在许多场景下比其他集合如`ArrayList`或`HashSet`更有优势,因为它的元素总是按特定顺序排列,并且支持高效的查找、插入和删除操作。 首先,`TreeSet`的特性包括: 1. **有序性**:`TreeSet`中的元素会...

    集合的概念及应用和HashSet保证数据不重复的原理

    Set接口(如HashSet、TreeSet)则确保元素唯一性,不保证顺序,适用于去重或存储不需排序的独特元素;而Map接口(如HashMap、TreeMap)用于存储键值对,键是唯一的,可以快速查找对应的值。 关于“HashSet保证数据...

    HashSet的实现原理

    关于HashSet与HashMap的区别,在底层数据结构上,二者都基于哈希表,但存储的方式不同。HashMap存储的是键值对(key-value pairs),键不唯一,值可以重复。而HashSet存储的是唯一元素,可以看作是键的集合,只是不...

Global site tag (gtag.js) - Google Analytics