java TreeSet能存放两个相同的元素吗?

java中treeset有相同的元素吗~

Set 中没有相同元素。

package com.sgcc.domain.util;import java.util.TreeSet;class Person implements Comparable{String name;public Person(String name) {this.name=name;}int count ;@Overridepublic int compareTo(Person o) {count++;System.out.println(name+"和" +o.name+"比较");System.out.println(this.getClass().getName() + "=" +this.hashCode());System.out.println(o.getClass().getName() + "=" + o.hashCode());System.out.println("内部比较第" + count + "次");//排序标准,按照hashcodeint result = this.hashCode() > o.hashCode()? 1 : (this.hashCode() == o.hashCode() ? 0 : -1);//如果hashcode相同,按照name,hashcode一般不会相同 if (result == 0) { result = name.compareTo(o.name); } return result;//return this.hashCode() - o.hashCode();}}public class Demo3 {public static void main(String[] args) {TreeSet set = new TreeSet();Person p1 = new Person("p1");Person p2 = new Person("p2");Person p3 = new Person("p3");Person p4 = new Person("p4");Person p5 = new Person("p5");Person p6 = new Person("p6");System.out.println("插入p1");p1.count = 0;System.out.println(set.add(p1));System.out.println();System.out.println("插入p2");p2.count = 0;System.out.println(set.add(p2));System.out.println();System.out.println("插入p3");p3.count = 0;System.out.println(set.add(p3));System.out.println();System.out.println("插入p4");p4.count = 0;System.out.println(set.add(p4));System.out.println();System.out.println("插入p5");p5.count = 0;System.out.println(set.add(p5));System.out.println();System.out.println("插入p6");p6.count = 0;System.out.println(set.add(p6));System.out.println();/***System.out.println("插入p5");p5.count = 0;System.out.println(set.add(p5));System.out.println();***/for (Person person : set) {System.out.print(person.name);System.out.print("-");}System.out.println();for (Person person : set) {System.out.print(person.hashCode());System.out.print("-");}}}我把你的代码处理了一下。目前是按照hashcode的顺序,从小到大排序。
首先说一下,每个元素在内部怎么排序的,是由容器决定的
你用的是treeset,在使用TreeSet存储对象的时候, add()方法内部就会自动调用compareTo()方法进行比较, 根据比较结果使用二叉树形式进行存储。记住是二叉树。不是列表,所以,不要用冒泡排序的,心里去想插入一个对象就要和每个元素都比较一下。
遍历方式是二叉树。不是每个元素都会比较的


这个文档说明了,treeset的排序检索方式

http://www.cnblogs.com/liqizhou/archive/2012/09/27/java中treemap和treeset实现红黑树.html


TreeSet会调用集合元素的compareTo(Object obj)方法来比较元素之间大小关系,然后将集合元素按升序排列,这种方式就是自然排序。(比较的前提:两个对象的类型相同),也就是说TreeSet是不能存放两个相同的元素的。
TreeSet继承于Set,而Set这个集合本身是不能存放两个相同的元素的。

可以存放重复的,关键是看的比较器,只是一般不这么做而已,保留重复就失去set集合无重复的特点。

TreeSet<String> ts = new TreeSet<>(new Comparator<String>() {
    @Override
    public int compare(String s1, String s2) {
        int num = s1.compareTo(s2);       //比较内容为主要条件
        return num == 0 ? 1 : num;        //保留重复
    }
});

ts.add("lp");
System.out.println(ts);
ts.add("lp");
System.out.println(ts);

输出结果:

[lp]

[lp, lp]

一个有趣的例子,TreeMap的键值,如果按照上面那样,是否也会重复,那key重复,又如何查询到对应的value,其实所谓的“重复”,按照比较器的定义,即使是相同的也认为是“不同”了。 感兴趣可以看下TreeMap 里面 get方法的源码,从源码可以分析到,“重复的key”用get方法获取的值肯定是null。



TreeSet 是set的子类,Set具有元素不可重复性,所以TreeSet也是,不可方2个相同的元素。

相关兴趣推荐

IT评价网,数码产品家用电器电子设备等点评来自于网友使用感受交流,不对其内容作任何保证

联系反馈
Copyright© IT评价网