作为才从事java开发的工作的小白来说,很多时候我们仅仅知道一些类的使用方法,而对于这个类的底层实现,我们却很少关注。例如一个我们经常使用的集合类HashMap,我们知道通过put存入数据,通过get取数据,却不知道它底层这些方法是怎么实现的。由于它的使用的高频性和在面试中常被问到,今天我们就带着求知的态度,来深入了解一下这个HashMap。
本节,我们先来讲一讲HashMap的大致轮廓,详细的核心实现后再后续章节说明。
1.简述
HashMap是基于java集合中Map接口实现,元素是以键值对的形式存储,并且允许key=null,和value=null。由于HashMap不允许重复,所以只能有一个key=null的情况出现,而且HaspMap是无序的,不能保证元素存存入的顺序,也就是说,HashMap不能保证输出顺序和存存入顺序一致。最后一个特性就是HashMap不能保证线程安全,这一点与HashTable相反。
2.基本结构
HashMap的基本组成是:jdk1.7及之前是数组+链表;jdk1.8之后是数组+链表+红黑树。
3.继承关系
public class HashMap<K,V>extends AbstractMap<K,V>
implements Map<K,V>, Cloneable, Serializable
AbstractMap:Map接口的实现类之一,也是 HashMap, TreeMap, ConcurrentHashMap 等类的父类
Map:java集合Collection的两个重要接口之一;
Cloneable:一个标记接口,只有实现这个接口后,在类中重写Object中的clone方法,然后通过类调用clone方法才能克隆成功,如果不实现这个接口,则会抛出CloneNotSupportedException(克隆不被支持)异常;
Serializable:一个对象序列化的接口,一个类只有实现了Serializable接口,它的对象才能被序列化。
4.HashMap基本方法
1)增加元素
public V put(K key, V value)
想HashMap集合中添加键为key,值为value的元素;若map中原来存有键为key的旧元素,则返回该元素的值value,否则,则返回null;
//存放值
Map<Integer, String> map1 = new HashMap<>();
map1.put(1, "aa");
String oldValue = map1.put(1, "bb");
System.out.println(oldValue);
结果:
2)获取值
public V get(Object key)
从HashMap集合中获取键为key的元素的值。
//获取值
Map<Integer, String> map2 = new HashMap<>();
map2.put(2, "aabb");
String newValue = map2.get(2);
System.out.println(newValue);
结果:
3)删除元素
public V remove(Object key)
从HashMap中删除指定key的元素。
//删除元素
Map<Integer, String> map3 = new HashMap<>();
map3.put(1, "aa");
map3.put(2, "bb");
map3.put(3,"cc");
map3.remove(2);
String value = map3.get(2);
System.out.println(value);
返回为null,说明元素已经被删除。
4)判断HashMap是否为空
public boolean isEmpty()
HashMap<String, Integer> map=new HashMap<>();
System.out.println(map.isEmpty());//true
map.put("DEMO", 1);
System.out.println(map.isEmpty());//false
5)清空HashMap集合中的元素
public void clear()
/清空元素
HashMap<String, Integer> map=new HashMap<>();
map.put("a", 1);
map.put("b", 2);
System.out.println(map);
map.clear();
System.out.println(map);
结果:
还有很多方法,这里就不在一一举例了。
小结
介绍到这里,我们基本知道了HashMap是什么以及能干什么有了一个大概的了解。但是想要深入了解HashMap,就需要我们去查看HashMap的源代码,好好分析一下它是如何实现这些功能的。
后续将会针对HashMap的源码,详细查看它的底层实现。