HashMap,Hashset,ArrayList,LinkedList集合的区别
2018-01-30 18:48
399 查看
【HashSet】
1. HashSet不能够存储相同的元素,元素是否相同的判断:重写元素的equals方法。equals方法和hashCode方法必须兼容,如:equals方法判断的是用户的名字name,那么hashCode的返回的hashcode必须是name。hashcode();
2. HashSet存储是无序的,保存的顺序与添加的顺序是不一致的,它不是线性结构,而是散列结构,(通过散列表:散列单元指向链表)。因此,HashSet的查询效率相对比较高。
3. HashSet不是线程安全的,不是线程同步的。这需要自己实现线程同步:Collections.synchronizedCollection(),方法实现。
【ArrayList】
1. 不是线程安全的,不是线程同步的。
2.ArrayList是通过可变大小的数组实现的,允许null在内的所有元素。
3.ArrayList中存放顺序和添加顺序是一致的。并且可重复元素。
4.ArrayList适合通过位子来读取元素。
【LinkedList】
1.不是线程安全的,不是线程同步的。
2.LinkedList是通过双向循环链表来实现的。
3.存放顺序和添加顺序是一致的。可添加重复元素。
4.适合链表头尾操作和插入指定位置元素的操作。
ArrayList和LinkedList之间的数据传递可通过toArray()方法。
【HashMap】
1.非线程安全,不是线程同步。
2.添加顺序和保存的顺序是不一致的。
3.必须重写key的equals方法和hashCode方法。
4.HashMap的实际容量=容量*因子,默认为16*0.75=12.所以考虑到HashMap的添加的效率问题,根据实际情况来设计它的开始的默认的容量。
的操作方法根据api来查找。
5.添加的值中是允许有null的值存在的。
【Hashtable】
1.是线程安全的,是线程同步的,在实现线程同步的时候是不需要手动来实现线程同步的。因此相对效率低。
2.添加的顺序和保存的顺序是不一致的。
3.添加的值中是不允许有null值存在的。
底层原理
HashMap:HashMap实现了Map接口,底层使用的是Hash算法存储数据。HashMap将数据以键值对的方式存储。
HashSet:HashSet实现了Set接口,底层也是用的是Hash算法存储数据。而且HashSet内部有HashMap类型的成员变量,方法也调用了HashMap的方法,存储的时候只不过值为null.
ArrayList:ArrayList实现了List接口,底层使用的是数组,存储空间上是相邻的,所以查询起来会很方便,效率也会比LinkedList要高
LinkedList:实现了List接口,底层使用的是使用双向链表的形式,存储的数据在空间上很可能不相邻,但是他们都有一个引用连在一起,所以增删起来会很方便
1. HashSet不能够存储相同的元素,元素是否相同的判断:重写元素的equals方法。equals方法和hashCode方法必须兼容,如:equals方法判断的是用户的名字name,那么hashCode的返回的hashcode必须是name。hashcode();
2. HashSet存储是无序的,保存的顺序与添加的顺序是不一致的,它不是线性结构,而是散列结构,(通过散列表:散列单元指向链表)。因此,HashSet的查询效率相对比较高。
3. HashSet不是线程安全的,不是线程同步的。这需要自己实现线程同步:Collections.synchronizedCollection(),方法实现。
【ArrayList】
1. 不是线程安全的,不是线程同步的。
2.ArrayList是通过可变大小的数组实现的,允许null在内的所有元素。
3.ArrayList中存放顺序和添加顺序是一致的。并且可重复元素。
4.ArrayList适合通过位子来读取元素。
【LinkedList】
1.不是线程安全的,不是线程同步的。
2.LinkedList是通过双向循环链表来实现的。
3.存放顺序和添加顺序是一致的。可添加重复元素。
4.适合链表头尾操作和插入指定位置元素的操作。
ArrayList和LinkedList之间的数据传递可通过toArray()方法。
【HashMap】
1.非线程安全,不是线程同步。
2.添加顺序和保存的顺序是不一致的。
3.必须重写key的equals方法和hashCode方法。
4.HashMap的实际容量=容量*因子,默认为16*0.75=12.所以考虑到HashMap的添加的效率问题,根据实际情况来设计它的开始的默认的容量。
的操作方法根据api来查找。
5.添加的值中是允许有null的值存在的。
【Hashtable】
1.是线程安全的,是线程同步的,在实现线程同步的时候是不需要手动来实现线程同步的。因此相对效率低。
2.添加的顺序和保存的顺序是不一致的。
3.添加的值中是不允许有null值存在的。
底层原理
HashMap:HashMap实现了Map接口,底层使用的是Hash算法存储数据。HashMap将数据以键值对的方式存储。
HashSet:HashSet实现了Set接口,底层也是用的是Hash算法存储数据。而且HashSet内部有HashMap类型的成员变量,方法也调用了HashMap的方法,存储的时候只不过值为null.
ArrayList:ArrayList实现了List接口,底层使用的是数组,存储空间上是相邻的,所以查询起来会很方便,效率也会比LinkedList要高
LinkedList:实现了List接口,底层使用的是使用双向链表的形式,存储的数据在空间上很可能不相邻,但是他们都有一个引用连在一起,所以增删起来会很方便
相关文章推荐
- HashMap,Hashset,ArrayList以及LinkedList集合的区别,以及各自的用法
- HashMap,Hashset,ArrayList以及LinkedList集合的区别和用法
- HashMap,Hashset,ArrayList以及LinkedList集合的区别,以及各自的用法
- Java中Hashset、HashMap、ArrayList、LinkedList、Vector之间的联系与区别
- HashSet、HashMap、ArrayList、LinkedList、Vector区别
- Java中Hashset、HashMap、ArrayList、LinkedList、Vector之间的联系与区别
- 常用集合ArrayList,LinkedList,HashMap,HashSet源码分析
- 各种集合小结:arrayList和linkedList,Vector;hashmap和hashtable,hashset,
- Java中Hashset、HashMap、ArrayList、LinkedList、Vector之间的联系与区别
- 常用集合ArrayList,LinkedList,HashMap,HashSet源码分析
- java collections 集合基础学习 ArrayList,LinkedList, HashSet, TreeSet, HashMap, Stack,Queue,PriorityQueue
- 集合与数组的比较、Collection与Collections的区别、ArrayList与LinkedList区别、Vector与ArrayList区别、HashMap与Hashtable
- ArrayList、LinkedList、Vector、HashSet、Treeset、HashMap、TreeMap的区别和适用场景
- Java集合之ArrayList,LinkedList,HashMap,HashSet
- Java:集合,Array、Collection(List/Set/Queue)、Map的遍历,比如:ArrayList,LinkedList,HashSet,HashMap
- List、Map、Set的理解(LinkedList和ArrayList、Vector和ArrayList、HashMap和HashTable和HashSet区别与使用)
- List、Map、Set的理解(LinkedList和ArrayList、Vector和ArrayList、HashMap和HashTable和HashSet区别与使用)
- Arraylist和linkedlist的区别,hashmap和hashtable的区别,hashmap和hashset的相同与不同,hashcode的用法
- Java基础之集合类如ArrayList、LinkedList、HashMap、HashTable的区别
- Java中Hashset、HashMap、ArrayList、LinkedList、Vector之间的联系与区别