java HashMap,TreeMap与LinkedHashMap的详解
程序员文章站
2024-03-09 15:20:23
java hashmap,treemap与linkedhashmap的详解
今天上午面试的时候 问到了java,map相关的事情,我记错了hashmap和tr...
java hashmap,treemap与linkedhashmap的详解
今天上午面试的时候 问到了java,map相关的事情,我记错了hashmap和treemap相关的内容,回来赶紧尝试了几个demo理解下
package map; import java.util.*; public class hashmaps { public static void main(string[] args) { map map = new hashmap(); map.put("a", "aaa"); map.put("b", "bbb"); map.put("c", "ccc"); map.put("d", "ddd"); iterator iterator = map.keyset().iterator(); while (iterator.hasnext()) { object key = iterator.next(); system.out.println("map.get(key) is :" + map.get(key)); } hashtable tab = new hashtable(); tab.put("a", "aaa"); tab.put("b", "bbb"); tab.put("c", "ccc"); tab.put("d", "ddd"); iterator iterator_1 = tab.keyset().iterator(); while (iterator_1.hasnext()) { object key = iterator_1.next(); system.out.println("tab.get(key) is :" + tab.get(key)); } treemap tmp = new treemap(); tmp.put("a", "aaa"); tmp.put("b", "bbb"); tmp.put("c", "ccc"); tmp.put("d", "ddd"); tmp.put("a", "aba"); iterator iterator_2 = tmp.keyset().iterator(); while (iterator_2.hasnext()) { object key = iterator_2.next(); system.out.println("tmp.get(key) is :" + tmp.get(key)); } linkedhashmap<string ,integer> linkedhashmap = new linkedhashmap<string,integer>(); linkedhashmap.put("dasdsa", 1); linkedhashmap.put("gdsf",2); linkedhashmap.put("texvdfd", 3); linkedhashmap.put("bdada", 4); linkedhashmap.put("gdsf",3); for(string temp : linkedhashmap.keyset()){ system.out.println(temp); } } }
map不同于 list, 底层使用 键值对的形式存储数据 map.entry是内部的一个子条目,map的不同实现 对键值对的索引方案不同
hashmap 本身是用hash函数对键值做索引 我们不能确定最后键值的顺序
但是存在一个有趣的现象 就是在以integer作为键值对的时候,当位数为1位时 键值是按照从小到大排的,位数上升到两位的时候 就可能存在问题
treemap 内部存在着一个平衡树来存储着键值索引,treemap 把键值按照比较函数排序,我推测内部是可能存在着一个avltree
linkedhashmap 这个存在着一个特性是,键值对是按照插入顺序排序的,如果存在着重复插入,以首次插入的顺序来记,网上的一种说法是该结构内部存在着2重hash
一个解决顺序问题,一个解决存储问题,正确性待确认
hashmap和treemap 是最常用的两种map结构, 一般来说hashmap的效率比较高,也最为常见,如果我们需要键值有序的话,我们才会用到treemap
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
推荐阅读