set、list、map区别

Set

:无序,不可重复。无序:输入顺序与展示顺序不相同

hashset

(1)是一个不包含重复元素的一个无序的集合,允许使用null,有且仅有一个元素为null

(2)HashSet也是一个非同步的方法,如果要在多个线程中使用,要注意进行同步封装

(3)当向HashSet集合中存入一个元素时,HashSet会调用该对象的hashCode()方法来得到该对象的hashCode值,然后根据 hashCode值来决定该对象在HashSet中存储位置。

treeset

(1)TreeSet中不允许使用null元素!在添加的时候如果添加null,则会抛出NullPointerException异常。

(2)TreeSet是基于TreeMap实现的。TreeSet中的元素支持2种排序方式:自然排序 或者 根据创建TreeSet 时提供的 Comparator 进行排序。这取决于使用的构造方法。

(3)TreeSet是非同步的方法。 它的iterator 方法返回的迭代器是fail-fast的。

(4)TreeSet不支持快速随机遍历,只能通过迭代器进行遍历!

hashset与treeset区别

1.HashSet是一个无序的集合,基于HashMap实现;TreeSet是一个有序的集合,基于TreeMap实现。

2.HashSet集合中允许有null元素,TreeSet集合中不允许有null元素。

3.HashSet和TreeSet都是非同步!在使用Iterator进行迭代的时候要注意fail-fast。

list

:是一个有序的队列,每一个元素都有它的索引

Arraylist

底层维护的是object类型的数组,默认容量10.通过grow()方法实现容量的自增长

增删慢:当用户增加数据时,通过grow()方法可能会进行数组的扩容操作,会进行大量的数据移动和数据拷贝。删除数据时,该数据之后的所有数据都需要往前移动一位,会产生很大的花销

查找快:通过下标索引可以直接找到指定元素的位置。ArrayList中允许元素为null

linkedlist

从源码可以看出是一个双向链表。除了当做链表使用外,它也可以被当作堆栈、队列或双端队列进行操作。

不是线程安全的,LinkedList是非线程安全的,只在单线程下适合使用这个类的iterator和返回的迭代器listIterator方法是fail-fast ,要注意ConcurrentModificationException 。

在查找和删除某元素时,都分为该元素为null和不为null两种情况来处理,LinkedList中允许元素为null。

由于是基于列表的,LinkedList的没有扩容方法!默认加入元素是尾部自动扩容!

ArrayList与LinkedList区别

 1.ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构。

2.对于随机访问get和set,ArrayList觉得优于LinkedList,因为LinkedList要移动指针。

3.对于新增和删除操作add和remove,LinedList比较占优势,因为ArrayList要移动数据

Map

HashMap

HashMap继承于AbstractMap,HashMap的内容是“键值对,但不保证次序”

1,HashMap是基于哈希表的Map实现的的,一个Key对应一个Value,允许使用null键和null值,不保证映射的顺序,特别是它不保证该顺序恒久不变!也不是同步的。

2,当哈希表中的条目数超出了加载因子与当前容量的乘积时的时候,哈希表进行rehash操作(即重建内部数据结构),此时映射顺序可能会被打乱。

treemap

TreeMap 继承于AbstractMap,且实现了NavigableMap接口;因此,TreeMap中的内容是键值对,有序的键值对TreeMap的查询、插入、删除效率均没有HashMap高,一般只有要对key排序时才使用TreeMap。TreeMap的key不能为null

TreeMap是根据key进行排序的,它的排序和定位需要依赖比较器或覆写Comparable接口,也因此不需要key覆写hashCode方法和equals方法,就可以排除掉重复的key。TreeMap的实现是基于红黑树。

HashMap与TreeMap的区别

1.Hashmap不保证次序,允许有null键null值, treemap根据key值进行排序,key不能为null

2.排除key值重复方式不一样,hashmap通过重写hashcode()和eauals()方法,treemap则依赖比较器或覆写Comparable接口,不需要重写hashcode()和eauals()方法

HashMap与Hashtable的区别

        1、继承的父类不同

       Hashtable继承自Dictionary类,而HashMap继承自AbstractMap类。但二者都实现了Map接口。

        2、线程安全性不同 

                Hashtable 中的方法是Synchronize的。在多线程并发的环境下,可以直接使用Hashtable,不需要自己为它的方法实现同步,HashMap中的方法在缺省情况下是非Synchronize的,在多线程并发的环境下,使用HashMap时就必须要自己增加同步处理。  Map m = Collections.synchronizedMap(new HashMap(...));

3、是否提供contains方法(用来判断键值对是否存在)
Hashtable则保留了contains,containsValue和containsKey三个方法,其中contains和containsValue功能相同
HashMap把Hashtable的contains方法去掉了,改成containsValue和containsKey,因为contains方法容易让人引起误解。
4、key和value是否允许null值
Hashtable中,key和value都不允许出现null值。
HashMap中,null可以作为键,这样的键只有一个;可以有一个或多个键所对应的值为null。
5、hash值不同
HashTable直接使用对象的hashCode,hashCode是jdk根据对象的地址或者字符串或者数字算出来的int类型的数值。
HashMap重新计算hash值。
6、内部实现使用的数组初始化和扩容方式不同
HashTable在不指定容量的情况下的默认容量为11,而HashMap为16,Hashtable不要求底层数组的容量一定要为2的整数次幂,而HashMap则要求一定为2的整数次幂,Hashtable扩容时,将容量变为原来的2倍加1,而HashMap扩容时,将容量变为原来的2倍。  Hashtable和HashMap它们两个内部实现方式的数组的初始大小和扩容的方式。HashTable中hash数组默认大小是11,增加的方式是 old*2+1

猜你喜欢

转载自blog.csdn.net/weixin_39067991/article/details/80992197