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 类型的实例


猜你喜欢

转载自blog.csdn.net/zxf_0601/article/details/79745448