`

【转】HashSet和TreeSet的区别

阅读更多
HashSet和TreeSet的区别
一. 问题

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

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

二. 回答:

1. HashSet是通过HashMap实现的,TreeSet是通过TreeMap实现的,只不过Set用的只是Map的key

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接口就可以完成定位了.

1. HashSet是通过HashMap实现的,TreeSet是通过TreeMap实现的,只不过Set用的只是Map的key

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

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

a. Comparator可以在创建TreeMap时指定

  b. 如果创建时没有确定,那么就会使用key.compareTo()方法,这就要求key必须实现Comparable接口.

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


=====================================用法======================

HashSet的使用
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()); 
       } 
   } 
} 

引用
另在转一些其他的区别:
     1、TreeSet 是二差树实现的,Treeset中的数据是自动排好序的,不允许放入null值。

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

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

相关推荐

    排序之HashSet和TreeSet的区别

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

    HashSet和TreeSet_围墙之外

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

    详解Java中HashSet和TreeSet的区别

    Java HashSet 和 TreeSet 的区别详解 HashSet 和 TreeSet 是 Java 中两个常用的集合类,它们都实现了 Set 接口,但它们之间有很大的区别。本文将详细介绍 HashSet 和 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实现,它不保证元素的特定顺序,也不保证在多次操作后保持元素的顺序不变...

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

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

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

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

    treemap treeset hashset hashmap 简要介绍

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

    HashMap与HashTable和HashSet的区别

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

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

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

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

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

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

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

    java 集合框架(TreeSet练习)

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

    Java Collections Interview Questions.pdf

    HashSet 和 TreeSet 的区别 HashSet 和 TreeSet 都是 Set 接口的实现类,但是它们在实现和应用场景上有所不同。HashSet 是基于哈希表实现的,查找和访问元素的时间复杂度为 O(1)。TreeSet 是基于树形结构实现的,...

    java集合使用实例

    本资源聚焦于Java集合中的四个关键类:HashSet、TreeSet、HashMap和TreeMap,它们分别代表了不同类型的集合容器。 1. **HashSet**:HashSet是一个不允许重复元素的无序集合。它基于哈希表实现,插入和查找操作的...

    Java 集合方面的面试题

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

    java集合类源码分析之Set详解.docx

    Set接口继承自Collection接口,提供了多种实现类,其中最常用的是HashSet和TreeSet。这两个类分别依赖于HashMap和TreeMap实现其功能。 HashSet是通过HashMap内部实现的,这意味着它不保证元素的顺序,同时支持高效...

    查询速度调研 1

    本次调研的目标是了解和掌握Java中高级类的用法,特别是ArrayList、LinkedList、HashSet和TreeSet这四种数据结构的查询性能。通过比较它们在不同规模数据下的查找速度,我们可以根据实际需求选择最适合的数据结构。 ...

Global site tag (gtag.js) - Google Analytics