时间:2021.08.17 发布人:leonton
已解决问题
谷歌leonton用户在2021.08.17提交了关于“
58同城redisset集合如何去重?”的提问,欢迎大家涌跃发表自己的观点。目前共有1个回答,最后更新于2025-02-26T14:12:37。希望大家能够帮助她。
详细问题描述及疑问:期待您的答案,你就是当代的活雷锋,太感谢了
!
希望以下的回答,能够帮助你。
第1个回答
用户名:匿名用户
你好,首先要明白一点:加入Set里面的元素必须定义eq问答uals()方法以确保对象的唯一性。第一个问题:TreeSet的底层实现是采用红-黑树仍液问挥验皇的**结构,采用这种结构可以从Set中获取有序的序列,但是前提条件是:元素技年矿必须实现Comparable接口,该接口中只用一个方法,就是compareTo()方法。当往Set中插入一个新的元素的时候,首先会遍历Set中已经存在的元素(当然不是采用顺序遍历,具体采用什么方法,建议自己去看看源码),并调用compareTo()方法,根据返回的结果,决定插入位置。进而也就保了元素的顺序。第二个问题:上面已经说过,加入Set里面的元素必须定义自己的equals()方法,但是对于良好的设计风格,最好在覆盖equals()方法的同时,也覆盖hashCode()方法,当然,对于TreeSet而言不用覆盖hashCode()方法也可。请记住:覆盖hashCode()方法的目的,只有一个原因就是提赶色节鱼爱高效率。在往Set中插入新的对象时,首先会用该对象景丰美的hashCode()与已经存在对象的hashCode()做比较,如果相等,那就不能插入,如果不等界小,才会调用equals(角)方法,如果eq沉轻之王uals结果为true,说明已弱候必千即灯司盐切经存在,就不能再插入,如果为false,可以插入。注:如果没有覆盖hashCode()方法,那就是只比较equals().对两个对象equals运算,是判断两个对象是否相等的关键。第三个问题:2)h**ashSet与TreeSet区别:1、TreeSet是二差树实现指掉货手严的,Treeset中的**是自动排好序的,不允许放入**ll值2、h**ashSet漱希表实现的,h**ashSet中的**是无序的,可以放入**ll,但只能放入一个**ll,两者中的旨不能重复,就如**库中唯一约束3、h**ashSet要求放入的对象必须兴制今界于读读引实现h**ashCode()方法,放入的对象,是以hashcode码作为标识的,而具有相同内李胜危容的String对象,hashcode是一样,所以放入的内容不能重复。但是同一个类的对象可以放入不同的实例