本文已参与「新人创作礼」活动,一起开启掘金创作之路
4.HashMap和TreeMap
HaspMap
HaspMap是基于哈希表的Map接口的实现,是无序的 1.clear() 清空 2.containsKey(Object key) 如果包含指定键,返回true 3.containsValue(Object value)如果包含指定值,返回true 4.get(Object key)返回指定键所映射的值,如果对于改键来说,此映射不包含任何映射关系,则返回null 5.isEmpty()如果此映射不包含键值关系,则返回null 6.put(K key,V value)在此映射中关联指定值与指定值 7.remove(Object key)从此映射中移除指定键的映射关系 8.size()返回此映射中的键-值映射关系数
实例
HashMap<Integer,Integer> m = new HashMap<>();
m.put(100,1);
System.out.println(m.get(100));
补充说明
取数据的时间复杂度最好是O(1),最差是O(n),为什么呢?因为如果根据key首先得到哈希地址,发现该下标处位置已经被占用,那么我们要找的节点到底在链表的哪个位置,如果该位置就只有一个节点或者要找的节点就在表头,那么就不用再往后遍历链表了,所以最好情况下时间复杂度是O(1);如果要找到的节点在链表表尾,那么就需要一个一个遍历链表,所以此时最差情况下为O(n)。但是如果我们的链表长度都很短,那么时间效率就会很高,其实即使是O(n)这个级别的复杂度正常也还是可以接受的。所以来总结一下,map的put方法的时间复杂度为O(1),get方法的时间复杂度为O(1)~ O(n)。 那么containKey()方法的时间复杂度呢,其实和get方法的时间复杂度是一样的,也是O(1)~O(n),首先我们也是要根据key计算出对应的哈希地址,如果该地址处没有占用,那么可以直接返回false,说明Map中没有这个key;如果已经被占用,那就开始在链表上遍历Entry,比较key,所以这和刚才的get方法是一样的,从原理上就是一样的,那么时间复杂度自然也是一样的。 containValue()的时间复杂度和containKey()的时间复杂度不是一个级别的,因为他要依赖于key,所以他的时间复杂度为O(n).
TreeMap
TreeMap是基于红黑树实现的,是有序的,可进行排序的。
此实现为containKey、get、put和remove操作提供受保证的log(n)时间开销
1.clear()清空
2.containsKey(Object key) 如果包含指定键,返回true
3.containsValue(Object value)如果包含指定值,返回true
4.get(Object key)返回指定键的值,如果不存在返回null
5.firstKey()返回此映射中当前第一个(最低) 的键
6.lastKey()返回此映射中当前最后一个(最高)的键
7.ceilingKey(k key)返回大于等于给定键的最小键,如果不存在这样的键,则返回null
8.floorKey(k key) 返回小于等于给定键的最大键,如果不存在这样的键,则返回null
遍历键的集合,值的集合,键值对的集合
1.使用while + Iterator
TreeMap<Integer,String> m = new TreeMap<>();
m.put(1,"A");
m.put(2,"B");
Set<Integer> s = m.keySet();
Iterator it = s.iterator();
Integer key = null;
while(it.hasNext()){
key = (Integer)it.next;
String value = m.get(key);
System.out.println(value);
}
2.使用增强for
TreeMap<Integer,String> m = new TreeMap<>();
m.put(1,"A");
m.put(2,"B");
for(int k : m.key.set()){
System.out.println(m.get(key));
}
\