一. 问题

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

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

TreeSet是依靠TreeMap来实现的
TreeSet是一个有序集合,她的元素 按照升序排列,默认是按照自然顺序排列,也就是说TreeSet中的对象元素需要实现Comparable接口。
TreeSet类中跟HashSet类一样也没有get()方法来获取列表中的元素,所以也只能通过迭代器方法来获取。
import java.util.*;
public class TreeSetTest
{
      public static void main(String[] args)
      {
           TreeSet tr =new TreeSet();
           tr.add("zhangshan");
           tr.add("wangwu");
           tr.add("lisi");
           Iterator it =tr.iterator();
           while(it.hasNext())
           {
                 System.out.println(it.next());
           }
      }
}
上面打印结果为:lisi wangwu zhangshan 这时因为TreeSet是一个有序并且默认按自然顺序排列,而不像哈希表那样毫无规律。
上面向TreeSet中添加的对象好像没有实现Comparable接口哦??那是因为添加的是String对象,而String类已经实现了Comparable接口。
      当然,你也可以在创建TreeSet对象时传递一个比较器来实现你自己的排序方式:
import java.util.*;
public class TreeSetTest
{
      public static void main(String[] args)
      {
           //传递一个比较器来实现你自己的排序方式
           TreeSet tr =new TreeSet(new Student.StudentComparator());
           tr.add(new Student(3,"wnagwu"));
           tr.add(new Student(2,"zhangshan"));
           tr.add(new Student(2,"lisi"));
           tr.add(new Student(1,"xiejin"));
           Iterator it =tr.iterator();
           while(it.hasNext())
           {
                 System.out.println(it.next());
           }
      }
}
class Student implements Comparable,Comparator
{
      int num;
      String name;
      Student(int num,String name)
      {
           this.num=num;
           this.name=name;
      }
      public int compareTo(Object o)
      {
           Student st =(Student)o;
           int result;
           result= num>st.num?1:(num==st.num?0:-1);
           //如果学号相等,就按姓名排列
           /*if(result==0)
           {
                 return name.compareTo(st.name);
           }*/
           return result;
      }
      //实现Comparator接口并实现它的抽象方法
      public int compare(Object o1,Object o2)
      {
           Student st1 =(Student)o1;
           Student st2 =(Student)o2;
           return st1.name.compareTo(st2.name);
      
      }
      //重写toString()方法,因为如果不重写,打印出来的是16进制代码
      public String toString()
      {
           return "num="+num+"; name="+name;
      }
      public static class StudentComparator implements Comparator
      {
           public int compare(Object o1,Object o2)
           {
                 Student st1 =(Student)o1;
                 Student st2 =(Student)o2;
                 int result;
                 result=st1.num>st2.num?1:(st1.num==st2.num?0:-1);
                 if(result==0)//如果学号相等 就进行名字排序
                 {
                      result=st1.name.compareTo(st2.name);
                 }
                 return result;
           }
      }
}
上面如果只使用学号排序,那么学号相同的就不会被打印的。
问题 :如果不用内部类实现比较器,该怎么做???
HashSet与TreeSet的区别:
HashSet是基于hash算法实现的,性能优于TreeSet。通常使用HashSet,在我们需要对其中元素排序的时候才使用TreeSet。

Java中的HashSet和TreeSet相关推荐

  1. Java中的HashSet

    介绍: Java中的HashSet实现Set接口,即它不允许重复. 它在内部由HashMap支持,该哈希表基于哈希原理. 我们可以在HashSet中存储一个空值. 默认容量为16,负载系数为0.75, ...

  2. java中hashset_Java HashSet – Java中的HashSet

    java中hashset Java HashSet is the most popular implementation of Set interface. java.util.HashSet is ...

  3. 三十九、Java集合中的HashSet和TreeSet

    @Author:Runsen @Date:2020/6/6 作者介绍:Runsen目前大三下学期,专业化学工程与工艺,大学沉迷日语,Python, Java和一系列数据分析软件.导致翘课严重,专业排名 ...

  4. JAVA中的Hashset类

    HashSet扩展AbstractSet并且实现Set接口.它创建一个类集,该类集使用散列表进行存 储.正像大多数读者很可能知道的那样,散列表通过使用称之为散列法的机制来存储信息. 在散列(hashi ...

  5. Set中的HashSet和TreeSet特点及用法

    2.5.3 Set:接口 2.5.3.1 HashSet 特点:无序,唯一 数据结构:基于哈希表 HashSet1:基本用法及特点 创建一个HashSet集合对象: HashSet<泛型> ...

  6. 用Java中的HashSet写一个学生管理系统(添加、删除、修改、查询学生信息)

    不废话,上代码: 先创建一个Student类: public class Student {private String id;private String name;private String m ...

  7. Java中使用HashMap,TreeSet和List来实现模拟斗地主的洗牌和发牌的小例子

    模拟斗地主洗牌,发牌  使用HashMap,TreeSet和List来实现 效果如下图所示: 详细实现代码如下: package star.july.tags;import java.util.Arr ...

  8. java中Hashset集合删除元素_从Java中的HashSet中删除单个元素

    要从HashSet中删除单个元素,请使用remove()方法. 首先,创建一个HashSet-HashSet hs = new HashSet(); 现在,将元素添加到HashSet-hs.add(& ...

  9. java中的HashSet内部是如何工作的

    HashSet 的内部采用 HashMap来实现.由于 Map 需要 key 和 value,所以HashSet中所有 key 的都有一个默认 value. 类似于HashMap,HashSet 不允 ...

最新文章

  1. signature=066eaf4ada3cc7a99cb8d41fb298a3d4,Video Fusion Display Systems
  2. 使用while语句修改后的效果和for一样
  3. 杨森翔的书法:正月十六试笔【圆光、斗方】
  4. spring的Aop使用问题
  5. 爱情,是我一生中最虔诚的信仰
  6. 人工智障学习笔记——机器学习(11)PCA降维
  7. pytorch入门-简介及安装
  8. 【转】C语言中的符号优先级
  9. 941. 有效的山脉数组
  10. 组合数学1.1——棋盘的完美覆盖
  11. Python深度学习:Python数据处理及可视化(读书笔记)
  12. python serial库文件下载_python serial模块
  13. MATLAB数字图像处理(一)图像的基本操作
  14. 认知神经科学技术革命
  15. 2020年国赛密码学湖湘杯密码学第一题writeup
  16. 怎么在线把图片转成PDF?几个步骤轻松转换
  17. 【Android】从零开始
  18. 近50年前500部精品电影合集
  19. 【ARM汇编】第三章:ARM指令系统
  20. Oracle如何实现列转行

热门文章

  1. python安装 + pycharm安装和入门学习 +安装配置TensorFlow
  2. Java Web项目漏洞:检测到目标URL存在http host头攻击漏洞解决办法
  3. LVS-NAT工作模式的实现
  4. javaweb男的gulp入手实践
  5. swift语言实战晋级-第9章 游戏实战-跑酷熊猫-7-8 移动平台的算法
  6. 寻找数组中 的最大值最小值
  7. 网站目录爆破的扫描器的思路
  8. 第 19 章 保护方法调用
  9. MFC实现最小化到托盘
  10. 出现警告defaultlib library conflicts with use of other libs; use /NODEFAULTLIB:library .