TreeMap的key和TreeSet理解
2014-04-18 15:50
190 查看
首先TreeSet底层一个NavigableMap,TreeMap实现了NavigableMap。
TreeMap的key判断相等的标准就是compareTo为0,而不用去比较hashcode和equals,这就是问题的所在,看下面的例子:
上面的Address类并没有重写equals和hashcode,仅仅是实现了compareTo方法,而且总是返回0,即所有对象都相等。
通过上面的例子能够得到 在TreeMap中无论是存还是取,判断key值相等的标准就是根据compareTo是否返回0
下面来看TreeSet的情况。
另外还应该注意,和在HashMap和HashSet中一样,不要随意更改map中key和set中的元素的field,这样会导致本来根据各自判断规则(HashMap 、HashSet中是判断
hashcode和equals; TreeMap和TreeSet中是判断compareTo)判断不等的两个对象出现相等的情况,从而导致无法正常查找和删除的情况。
TreeMap的key判断相等的标准就是compareTo为0,而不用去比较hashcode和equals,这就是问题的所在,看下面的例子:
package com.whrd.test; public class Address implements Comparable { private String detail; public Address(String detail) { this.detail = detail; } @Override public String toString() { return this.detail; } @Override public int compareTo(Object o) { //所有Address对象compareTo的结果都为0 return 0; } }
上面的Address类并没有重写equals和hashcode,仅仅是实现了compareTo方法,而且总是返回0,即所有对象都相等。
public static void main(String[] args) throws Throwable { TreeMap<Address, String> map = new TreeMap<Address, String>(); Address key1 = new Address("shanghai"); Address key2 = new Address("beijing"); map.put(key1, "shanghai"); //打印出{shanghai=shanghai} System.out.println(map); map.put(key2, "beijing"); //打印出{shanghai=beijing} //可以看出其实TreeMap把key1和key2看作是相等的key值,这样就会保持key值不变,而是把value换做新的value System.out.println(map); Address key3 = new Address("tianjin"); String value = map.get(key3); //随便定义一个Address对象,都可以用来取出保存的value值,同样的原因,因为任何Address对象compareTo的结果都为0 System.out.println(value); }
通过上面的例子能够得到 在TreeMap中无论是存还是取,判断key值相等的标准就是根据compareTo是否返回0
下面来看TreeSet的情况。
public static void main(String[] args) throws Throwable { TreeSet<Address> set = new TreeSet<Address>(); Address a1 = new Address("shanghai"); set.add(a1); //打印[shanghai] System.out.println(set); Address a2 = new Address("beijing"); boolean isIn = set.add(a2); //打印false System.out.println(isIn); //打印[shanghai],其实无论加入什么样的Address对象,set都会加入失败, //因为所有的Address对象的compareTo都为0 System.out.println(set); }
另外还应该注意,和在HashMap和HashSet中一样,不要随意更改map中key和set中的元素的field,这样会导致本来根据各自判断规则(HashMap 、HashSet中是判断
hashcode和equals; TreeMap和TreeSet中是判断compareTo)判断不等的两个对象出现相等的情况,从而导致无法正常查找和删除的情况。
相关文章推荐
- java数据结构之树集TreeSet与书映射(TreeMap)
- [TreeMap和TreeSet]——简单应用
- TreeMap and TreeSet
- java数据结构之树集TreeSet与书映射(TreeMap)
- Collection TreeSet TreeMap排序 ArrayList HashSet去重之间的区别
- TreeSet and TreeMap
- java数据结构之树集TreeSet与书映射(TreeMap)
- hashmap和treemap、hashset和treeset、linkedhashmap
- Difference between TreeMap and TreeSet in Java
- java中treemap和treeset实现红黑树
- 深入TreeMap和TreeSet集合
- TreeSet与TreeMap
- 深入源码分析TreeSet和TreeMap
- java treeMap 排序 treeset同理
- HashSet TreeSet LinkedList ArrayList Hashmap Treemap的一些区别
- 浅谈java中的TreeMap 排序与TreeSet 排序
- Java TreeMap/TreeSet
- java中Collection/Collections;List/Set/Map;ArrayList/Vector/LinkedList;HashSet/HashMap/TreeSet/TreeMap
- Set集合接口 HashSet与TreeSet理解
- java集合类TreeMap和TreeSet及红黑树