zoukankan      html  css  js  c++  java
  • hashset 和 treeset

    HashSet:

    1. 特点:HashSet 是哈希表实现的,HashSet中的数据是无序的,集合元素可以是null,但只能放入一个null,两者中的值都不能重复,如同数据库中唯一约束。 
    2. 使用场景:不是同步的,不能保证线程的安全,相应的其性能通常都优于TreeSet。我们通常都应该使用HashSet,在我们需要排序的功能时,我们才使用TreeSet 
    3. 底层运行方式:hashset底层是hash值的地址,它里面存的对象是无序的。 第一个对象进入集合时,hashset会调用object类的hashcode根据对象在堆内存里的地址调用对象重写的hashcode计算出一个hash值,然后第一个对象就进入hashset集合中的任意一个位置。 第二个对象开始进入集合,hashset先根据第二个对象在堆内存的地址调用对象的计算出一个hash值,如果第二个对象和第一个对象在堆内存里的地址是相同的(equals方法),那么得到的hash值也是相同的,直接返回truehash得到true后就不把第二个元素加入集合(这段是hash源码程序中的操作)。如果第二个对象和第一个对象在堆内存里地址是不同的,这时hashset类会先调用自己的方法遍历集合中的元素,当遍历到某个元素时,调用对象的equals方法,如果相等,返回true,则说明这两个对象的内容是相同的,hashset得到true后不会把第二个对象加入集合。 

    TreeSet:

    1.特点:TreeSet 二叉树实现的,Treeset中的数据是自动排好序的,不允许放入null值。 TreeSet支持两种排序方式,自然排序 和定制排序,其中自然排序为默认的排序方式。向TreeSet中加入的应该是同一个类的对象。自然排序是根据集合元素的大小,以升序排列,如果要定制排序,应该使用Comparator接口,实现 int compare(T o1,T o2)方法。

    2.使用场景:排序时才使用TreeSet.

    3.底层运行方式:hashset底层是通过二叉树来完成存储的.当我们将一个对象加入treeset中,treeset会将第一个对象作为根对象,然后调用对象的compareTo方法拿第二个对象和第一个比较,当返回至=0时,说明2个对象内容相等,treeset就不把第二个对象加入集合。返回>1时,说明第二个对象大于第一个对象,将第二个对象放在右边,返回-1时,则将第二个对象放在左边,依次类推 

  • 相关阅读:
    最大流基础
    转一篇写期望的日志
    poj3267The Cow Lexicon(dp)
    poj3026Borg Maze(bfs+MST)
    poj2226Muddy Fields(二分图的最小点覆盖)
    poj1035Spell checker(字符串模拟)
    poj1422Air Raid(最小路径覆盖)
    poj3020Antenna Placement(最小路径覆盖)
    [JSOI2009]火星藏宝图
    [SHOI2007]书柜的尺寸
  • 原文地址:https://www.cnblogs.com/KingAndPig/p/13842144.html
Copyright © 2011-2022 走看看