LinkedHashSet

问题描述:java的LinkedHashSet是怎样实现存取有序的, 底层原理是什么 大家好,小编来为大家解答以下问题,linkedhashset和hashset区别,linkedhashset线程安全吗,现在让我们一起来看看吧!

android关于hashSet和linkedHashSet区别的问题

LinkedHashSet的相关图片

LinkedHashSet 的实现。

对于 LinkedHashSet 而言,它继承与 HashSet、又基于 LinkedHashMap 来实现的。

LinkedHashSet 底层使用 LinkedHashMap 来保存所有元素,它继承与 HashSet,其所有的方法操作上又与 HashSet 相同,因此 LinkedHashSet 的实现上非常简单,只提供了四个构造方法,并通过传递一个标识参数,调用父类的构造器,底层构造一个 LinkedHashMap 来实现,在相关操作上与父类 HashSet 的操作相同,直接调用父类 HashSet 的方法即可。

需要注意理解的点是:

LinkedHashSet 是 Set 的一个具体实现,其维护着一个运行于所有条目的双重链接列表。此链接列表定义了迭代顺序,该迭代顺序可为插入顺序或是访问顺序。

LinkedHashSet 继承与 HashSet,并且其内部是通过 LinkedHashMap 来实现的。有点类似于我们之前说的LinkedHashMap 其内部是基于 Hashmap 实现一样,不过还是有一点点区别的(具体的区别大家可以自己去思考一下)。

如果我们需要迭代的顺序为插入顺序或者访问顺序,那么 LinkedHashSet 是需要你首先考虑的。

HashSet,TreeSet和LinkedHashSet的区别的相关图片

HashSet,TreeSet和LinkedHashSet的区别

HashSet是无序的,就是ABCD存进去,去你遍历的时候,并不会是ABCD。

LinkedHashSet是有序的,因为这个是双向链表的实现,你存数据的时候是ABCD 那么遍历的时候也会是ABCD,如果你用sharedPreferences存数据的话,建议你直接把这个set转成json或者直接存数据库吧,sharedPreferences不适合保存集合类数据的。

linkedhashset,hashtable底层是由什么实现的,hashtable是不是同步的的相关图片

linkedhashset,hashtable底层是由什么实现的,hashtable是不是同步的

HashSet:根据对象hashcode值来决定存储位置,不保证对象元素的排列顺序。

LinkedHashSet:通过链表来保持对象元素在插入时的顺序。

TreeSet:确保对象元素处于排序状态。

HashSet,TreeSet和LinkedHashSet的区别的相关图片

HashSet,TreeSet和LinkedHashSet的区别

hastTable和hashMap的区别:。

(1)Hashtable是基于陈旧的Dictionary类的,HashMap是Java 1.2引进的Map接口的一个实现。

(2)这个不同即是最重要的一点:Hashtable中的方法是同步的,而HashMap方法(在缺省情况下)是非同步的。即是说,在多线程应用程序中,不用专门的操作就安全地可以使用Hashtable了;而对于HashMap,则需要额外的同步机制。但HashMap的同步问题可通过Collections的一个静态方法得到解决:

Map Collections.synchronizedMap(Map m)。

这个方法返回一个同步的Map,这个Map封装了底层的HashMap的所有方法,使得底层的HashMap即使是在多线程的环境中也是安全的。

(3)只有HashMap可以让你将空值作为一个表的条目的key或value。HashMap中只有一条记录可以是一个空的key,但任意数量的条目可以是空的value。这就是说,如果在表中没有发现搜索键,或者如果发现了搜索键,但它是一个空的值,那么get()将返回null。如果有必要,用containKey()方法来区别这两种情况。

其它的一些资料:

HashTable的方法是同步的,HashMap未经同步,所以在多线程场合要手动同步HashMap这个区别就像Vector和ArrayList一样。(最主要的区别)

2.HashTable不允许null值(key和value都不可以),HashMap允许null值(key和value都可以,只容许有一个null值的key,可以有多个null值的value)。

3.HashTable有一个contains(Object value),功能和containsValue(Object value)功能一样。

4.HashTable使用Enumeration,HashMap使用Iterator。

以上只是表面的不同,它们的实现也有很大的不同。

5.HashTable中hash数组默认大小是11,增加的方式是 old*2+1。HashMap中hash数组的默认大小是16,而且一定是2的指数。

6.哈希值的使用不同,HashTable直接使用对象的hashCode,代码是这样的:

int hash = key.hashCode();。

int index = (hash  0x7FFFFFFF) % tab.length;。

而HashMap重新计算hash值,而且用与代替求模:

int hash = hash(k);。

int i = indexFor(hash, table.length);。

static int hash(Object x) {。

int h = x.hashCode();。

h += ~(h << 9);。

h ^= (h >>> 14);。

h += (h << 4);。

h ^= (h >>> 10);。

return h;

static int indexFor(int h, int length) {。

return h  (length-1);。

以上只是一些比较突出的区别,当然他们的实现上还是有很多不同的,比如。

HashMap对null的操作。

java set 顺序

HashSet 与TreeSet和LinkedHashSet的区别。

Set接口

Set不允许包含相同的元素,如果试图把两个相同元素加入同一个集合中,add方法返回false。

Set判断两个对象相同不是使用==运算符,而是根据equals方法。也就是说,只要两个对象用equals方法比较返回true,Set就不会接受这两个对象。

HashSet与TreeSet都是基于Set接口的实现类。其中TreeSet是Set的子接口SortedSet的实现类。Set接口及其子接口、实现类的结构如下所示:

|——SortedSet接口——TreeSet实现类。

Set接口——|——HashSet实现类 。

|——LinkedHashSet实现类。

原文地址:http://www.qianchusai.com/LinkedHashSet.html

千岱公司-80,杭州千岱山居度假酒店

千岱公司-80,杭州千岱山居度假酒店

xiaoxue/23269

xiaoxue/23269

urls,url视频地址怎么获取

urls,url视频地址怎么获取

百二,百二关河草不横,十年戎马暗秦京

百二,百二关河草不横,十年戎马暗秦京

aloe,aloenadur mcqueen是什么品牌

aloe,aloenadur mcqueen是什么品牌

vivov7-150

vivov7-150

霹雳文库-60,霹雳全文免费阅读

霹雳文库-60,霹雳全文免费阅读

goodnotes5-100

goodnotes5-100

tda7377-160

tda7377-160

iplc和v2ray

iplc和v2ray