黑马程序员---HashSet,TreeSet的区别

本文深入探讨了Java集合框架中的HashSet与TreeSet类,详细阐述了它们如何通过hashCode和equals方法保证元素唯一性,以及HashSet与TreeSet在数据排序和存储上的区别。特别强调了HashSet中元素的无序性与允许null值的特点,与TreeSet对null值的限制以及其基于元素自然排序或自定义比较方法的能力。
摘要由CSDN通过智能技术生成
 

---------------------- <a href="http://edu.csdn.net/heima" target="blank">android培训</a>、<a href="http://edu.csdn.net/heima" target="blank">java培训</a>、期待与您交流! ----------------------

 | ----set:元素是无序的(存入和取出的顺序不一定是一致的),元素不可以重复。

    | -------HashSet:底层数据结构是哈希表。

    | -------TreeSet:可以对set集合中的元素进行排序,底层数据结构是二叉树。

           | -------HashSet是如何保证元素的唯一性的呢?

                        是通过元素的两个方法,hashCode和equals来完成,如果元素的HashCode值相同,才会判断equals是否为True,如果元素的HashCode的值不同,

                       不会调用equals的方法。

                       注意:对于判断元素是否存在,以及删除等等操作,依赖的方法是元素的hashcode和equals方法。

           | -------TreeSet是如何保证元素的唯一性的呢?

                       是通过compareTo方法return 0.

                     TreeSet排序的第一种方式:

                      让元素自身具备比较性。元素要实现Comparable接口,覆盖cmpareTo方法,这种方式也成为元素的自然排序,或者叫做默认顺序。

                      TreeSet排序的第二种方式:

                      当元素自身不具备比较性时,或者具备的比较性不是所需要的,这时就需要让集合自身具备比较性。

下面的例子:

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

public class SetTest {

/**
* @param args
*/
public static void main(String[] args) {
   // TODO 自动生成方法存根
   HashSet ht = new HashSet();
   ht.add("A");
   ht.add("D");
   ht.add("C");
   ht.add("B");
   ht.add("T");

//ht.add(null);//去掉注释运行,可以运行
   TreeSet ts = new TreeSet();
//ts.add(null);//去掉注释运行,不可以运行

   ts.add("A");
   ts.add("E");
   ts.add("B");
   ts.add("C");
   ts.add("W");
   Iterator it = ht.iterator();
   while(it.hasNext()){
    System.out.println("========"+it.next());;
   }
   Iterator ti = ts.iterator();
   while(ti.hasNext()){
    System.out.println(">>>>>>>."+ti.next());;
   }

}

}

运行可以看出明显,

1、Treeset中的数据是自动排好序的,不允许放入null值

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

3、HashSet要求放入的对象必须实现HashCode()方法,放入的对象,是以hashcode码作为标识的,而具有相同内容的String对象,hashcode是一样,所以放入的内容不能重复。而同一个类的对象可以放入不同的实例,但是如果想按指定的对象属性来判断是否为相同对象的话,可以自己重写hashCode()方法来实现。

 

                     

---------------------- <a href="http://edu.csdn.net/heima" target="blank">android培训</a>、<a href="http://edu.csdn.net/heima" target="blank">java培训</a>、期待与您交流! ----------------------

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值