Java学习(1):浅谈Hashmap和Hashtable区别
一,Map接口
HashMap和HashTable都是实现了Map接口,所以我们得先从Map接口介绍:
1,Map接口:从jdk8开始改接口新增了几个方法,而且是有方法体的方法,用default关键字修饰的方法.
default关键字
default方法是在java8中引入的关键字,也可称为Virtual extension methods——虚拟扩展方法。是指,在接口内部包含了一些默认的方法实现(也就是接口中可以包含方法体,这打破了Java之前版本对接口的语法限制),从而使得接口在进行扩展的时候,不会破坏与接口相关的实现类代码
2,下面是Map接口定义的方法和内部类
方法是由HashMap和Hashtable去实现,内部类也要继承和实现,Entry<K,V>是存放每一个map的实体类的
二,HashSet,是继承Set接口的,也就意味着存放的值不能重复,存放原理:
1,构造器就是一个HashMap
2,怎么实现防重复的:通过add()方法可以看出,HashSet存放的值直接变成Map的key存入,因为Map的key是唯一的,
所以实现了唯一性
3,获取对象:从源码中可以看出,HashSet获取对象只能通过iterator()方法,其实底层就是map的keySet()遍历的方法
三,HashMap
1,HashMap存储数据的原理:数组(就是一个容器存放数据)和链表:链表是后放先出,类似于栈的形式
2,resize():数组扩容的方法:数组初始值10,比率0.75(初始化构造器中loadFactor值就是0.75f),每次扩容都会翻倍,
3,hash算法hash(Object key)方法:key为null时,hash为0,不为null时,则返回一个相应的hashcode值
四,HashTable
1,实现的接口:implements Map<K,V>, Cloneable, java.io.Serializable
2,构造器:数组(链表形式的数组和HashMap相同)
3,常用的方法都枷锁处理.所以是线程安全的
4,Hashtable不允许存放空的键值对,从put()方法体中可以看出:value为空时报空指针,key为空时运行也会报空指针
五,总结:HashMap和Hashtable区别其实不是太大,主要一个是线程安全性问题,一个是否能存放空的键值对区别.
实际应用中,没有复杂的线程情况下建议使用HashMap,性能较高
其他的实现原理都差不多,数据存储都是数组和链表结合的的形式
六:TreeMap存储的数据时有序的
1,TreeMap 类不仅实现了 Map 接口,还实现了 Map 接口的子接口 java.util.SortedMap。
2,TreeMap 类中不允许键对象为 null 或是 基本数据类型,这是因为 TreeMap 中的对象必须是可排序的(即对象需要实现 java.lang.Comparable 接口)
3,在创建 TreeMap 对象时,如果使用参数为空的构造方法,则根据 Map 对象的 key 进行排序;如果使用参数为 Comparator 的构造方法,则根据 Comparator 进行排序。
4,HashMap VS. TreeMap
在添加、删除和定位映射关系上,TreeMap类要比HashMap类的性能差一些,但是其中的映射关系具有一定的顺序。
如果不需要一个有序的集合,则建议使用HashMap类;如果需要进行有序的遍历输出,则建议使用TreeMap类。 在这种情况下,可以先使用 HashMap。在需要排序时,利用现有的 HashMap,创建一个 TreeMap 类型的实例