A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 李哲 中级黑马   /  2012-3-20 09:00  /  3511 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

是不是将元素存入HashMap,即使复写了元素的hashCode()和equals()方法,也无法进行排序?如果没有复写,又会是什么顺序?还是不管怎样,都是无序?无序是由随机指定的哈希值决定的?但是不是复写了元素的hashCode()和equals()方法吗?怎么还是无法排序?

将元素存入TreeMap,如果复写了元素的hashCode()和equals()方法,会按照自己定义的方法排序?如果没有复写,按照什么方法排序?

4 个回复

倒序浏览
HashMap,LinkedHashMap,TreeMap都属于Map

Map 主要用于存储键(key)值(value)对,根据键得到值,因此键不允许键重复,但允许值重复。

HashMap 是一个最常用的Map,它根据键的HashCode 值存储数据,根据键可以直接获取它的值,具有很快的访问速度。HashMap最多只允许一条记录的键为Null;允许多条记录的值为Null;HashMap不支持线程的同步,即任一时刻可以有多个线程同时写HashMap;可能会导致数据的不一致。如果需要同步,可以用Collections的synchronizedMap方法使HashMap具有同步的能力。

LinkedHashMap LinkedHashMap也是一个HashMap,但是内部维持了一个双向链表,可以保持顺序

TreeMap 不仅可以保持顺序,而且可以用于排序

HashMap例子:
public static void main(String[] args) {   
Map<String, String> map = new HashMap<String, String>();     
map.put("a3", "aa");   
map.put("a2", "bb");      
map.put("b1", "cc");     
for (Iterator iterator = map.values().iterator();
iterator.hasNext();) {     
String name = (String) iterator.next();      
System.out.println(name);   
    }    }
复制代码
LinkedHashMap例子:

public static void main(String[] args) {      
Map<String, String> map = new LinkedHashMap<String, String>();        
map.put("a3", "aa");      
map.put("a2", "bb");        
map.put("b1", "cc");      
for (Iterator iterator = map.values().iterator();
iterator.hasNext();) {            
String name = (String) iterator.next();            
System.out.println(name);        
}    }
复制代码
TreeMap例子:

public static void main(String[] args) {        
Map<String, String> map = new TreeMap<String, String>(new Comparator<Object>(){           
Collator collator = Collator.getInstance();            
public int compare(Object o1, Object o2) {               
CollationKey key1 = collator.getCollationKey(o1.toString());               
CollationKey key2 = collator.getCollationKey(o2.toString());               
return key1.compareTo(key2);                //return collator.compare(o1, o2);            
}});      
map.put("a3", "aa");        
map.put("a2", "bb");        
map.put("b1", "cc");      
for (Iterator iterator = map.values().iterator();
iterator.hasNext();) {           
String name = (String) iterator.next();            
System.out.println(name);        
}    }
复制代码


运行这三个例子,体会一下它们之间的区别。

回复 使用道具 举报
HashMap 是无序的,而重写hashCode()和equals()方法,是判断集合里的对象Hash值是否相同,若相同则不会往集合里添加了。
而且,HashMap遍历出来的顺序也不是固定的。
TreeMap却是有序的,是通过“键”来自动进行排序,如若想根据自己的要求进行排序,可以使用"比较器"。
回复 使用道具 举报
     HashMap:底层哈希表,不同步,线程不安全,运行null作为键,null作为值
         LinkedHashMap:有序,存入和取出的顺序一致

     TreeMap:可以对集合的键进行排序,根据比较方法返回值,负数,放左边,整数放右边,零就代表重复 ,具体的可以看看哈弗曼树
回复 使用道具 举报
HashMap是使用哈希算法去元素重复的, 要重写hashCode()和equals()方法, 在存储键值对的时候, 对键对象取哈希值, 然后查找是否有相同的哈希值对象, 如果没有就直接存入, 如果有哈希值相同的键对象, 就和哈希值相同的键对象进行equals()比较, 结果为fals就存入, 结果为true就覆盖; 是无序的;
TreeMap即可去重复又可排序, 是通过键来获取值的, 同时也是通货键来进行排序, 因为值有可能相同, 无法进行比较, 如果不指定顺序就按照键对象的自认顺序排序, 也可以指定一个比较器顺序;
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马