问题:
(1)hashmap,linkedhashmap与treemap的区别
LinkedHashMap是继承于HashMap,是基于HashMap和双向链表来实现的。
HashMap无序;LinkedHashMap有序,可分为插入顺序和访问顺序两种。如果是访问顺序,那put和get操作已存在的Entry时,都会把Entry移动到双向链表的表尾(其实是先删除再插入)。有顺序地去存储key-value时,就需要使用LinkedHashMap
LinkedHashMap存取数据,还是跟HashMap一样使用的Entry[]的方式,双向链表只是为了保证顺序。
LinkedHashMap是线程不安全的。
TreeMap中默认的排序为升序,如果要改变其排序可以自己写一个Comparator
(2)hashset底层结构
HashSet是Set接口的典型实现,HashSet按照Hash算法来存储集合中的元素。存在以下特点:
1,不能保证元素的顺序,元素是无序的
2,HashSet不是同步的,需要外部保持线程之间的同步问题
3,集合元素值允许为null
HashSet的底层用哈希散列表来存储对象(默认长度为16的数组)
HashSet的底层通过HashMap实现的,使用的数组+链表+红黑树实现。其实也可以这样理解,HashSet的底层实现和HashMap使用的是相同的方式,因为Map是无序的,因此HashSet也无法保证顺序。
HashSet的方法,也是借助HashMap的方法来实现的。
(3)hashtable
Hashtable现在集成到了集合框架中。它和HashMap类很相似,但是它支持同步。像HashMap一样,Hashtable在哈希表中存储键/值对。当使用一个哈希表,要指定用作键的对象,以及要链接到该键的值。然后,该键经过哈希处理,所得到的散列码被用作存储在该表中值的索引。
有4个构造方法:
1.默认构造方法--------Hashtable()
2.构造函数创建指定大小的哈希表-------Hashtable(int size)
3.创建了一个指定大小的哈希表,并且通过fillRatio指定填充比例。
填充比例必须介于0.0和1.0之间,它决定了哈希表在重新调整大小之前的充满程度
Hashtable(int size,float fillRatio)
4.创建了一个以M中元素为初始化元素的哈希表。哈希表的容量被设置为M的两倍。
Hashtable(Map m)
(4)hashset与LinkedHashSet的区别
HashSet
不能保存元素的排列顺序
不是同步的
元素可以是null,但是只能设置一个null
HashSet集合判断两个元素相等的标准是两个对象通过equals方法比较相等,并且两个对象的hashCode()方法返回值相等。
LinkedHashSet
根据元素的hashCode值来决定元素的存储位置,但是它同时使用链表维护元素的次序。这样使得元素看起 来像是以插入顺 序保存的,也就是说,当遍历该集合时候,LinkedHashSet将会以元素的添加顺序访问集合的元素。