Java中List和Map的区别
一、List和Map
1、特点
(1)、List
1、可以允许重复的对象。
2、可以插入多个null元素。
3、是一个有序容器,保持了每个元素的插入顺序,输出的顺序就是插入的顺序。
4、常用的实现类有 ArrayList、LinkedList 和 Vector。ArrayList 最为流行,它提供了使用索引的随意访问,而 LinkedList 则对于经常需要从 List 中添加或删除元素的场合更为合适。
(2)、Map
1、不是collection的子接口或者实现类。Map是一个接口。
2、Map的每个 Entry 都持有两个对象,也就是一个键一个值,Map 可能会持有相同的值对象但键对象必须是唯一的。
3、TreeMap 也通过 Comparator 或者 Comparable 维护了一个排序顺序。
4、Map 里你可以拥有随意个 null 值但最多只能有一个 null 键。
5、Map 接口最流行的几个实现类是 HashMap、LinkedHashMap、Hashtable 和 TreeMap。(HashMap、TreeMap最常用)。
(3)、区别
1、list是存储单列数据的集合,map是存储双列数据的集合;
2、list中存储的数据是有序的,map中存储的数据是无序的;
3、list允许重复,map的键不能重复,值可以重复。
二、List
1、Arraylist和Vector的区别
(1)、都实现了List接口(List接口继承了Collection接口)都是有序集合List集合规范制定(数据允许重复,可有通过索引取出数据)
(2)、ArrayList和Vector都是基于数组,因此大致代码相似。区别在于 Vector在Jdk1.0就有的古老集合, 因此包含大量方法名很长的方法。 Jdk1.2开始引入集合框架引入了List接口 Vector实现了List接口因此增加了一些List接口中的方法
(3)、总体来讲ArrayList可以完全取代Vector,除非有一些老古董强制要求Vector。Vectory是线程安全的因此性能较差。ArrayList是非线程安全所以接口性能较好。即使在多线程中也应该用ArrayList,因为可以通过Collections吧ArrayList和LInkedList转换成一个线程安全的集合
例子:List ls = Collections.synchronizedList(new ArrayList<>());
2、ArrrayList、Vecor、LinkedList的存储性能和特性
(1)、ArrayList Vector ==>> 数组方式存储数据
数组元素的数据 > 实际存储的数据以及增加和插入元素
按序号索引元素
插入元素 ==>>数组移动等内存操作
索引数据快、插入数据慢
(2)、Vector ==>> synchronized方法(线程安全)
性能上较ArrayList差
(3)、LinkedList ==>> 双向链表实现存储
序号索引数据需要向前或向后遍历
插入数据时只需要记录本项的前后项即可
所以插入速度较快
线程不安全
3、ArrrayList、Vecor、LinkedList容量以及适用场景
(1)、ArrayList
特点:
1、ArrayList 内部是通过动态数组实现的,它允许对元素进行快速随机访问;
2、当数组大小不满足时需要扩容,需要将已有数组移动到新的内存空间;
1、当从 ArrayList 的中间位置插入或者删除元素时,需要对数组进行复制、移动代价比较高;
1、线程不安全。
初始容量:10初始容量:10
扩容容量:(原始容量 x 3 ) / 2 + 1。
适用场景:ArrayList 适合单线程,或多线程环境,但 List 只会被单个线程操作;随机查找和遍历,不适合插入和删除。
(2)、LinkedList
特点:
1、LinkedList 是基于双向链表存储数据的,很适合数据的动态插入和删除;
2、可根据索引值获取(get(int index)))或删除(remove(int index))节点(实现原理:通过计数索引值实现,当 index > 链表长度的1/2,从链表尾部开始遍历;反之,从链表头部开始遍历;
3、可作为队列和栈使用
4、线程不安全。
适用场景:适合单线程中,顺序读取,不适合随机读取和随机删除。
(3)、Vecor
特点:
1、其特点大致与 ArrayList 一样。
2、线程安全(因为内部方法都是通过 synchronized 关键字同步的)。
初始容量:10初始容量:10
扩容容量:若扩容系数 > 0,则将容量的值增加“扩容系数”;否则,将容量大小增加一倍。
适用场景:能不用就别用。
三、Map
1、HashMap与HashTable简介
类似于ArrayList和LinkedList的区别, HashTable是JDK1.0 就存在的老东西,因此 HashTable是一个继承Dictionary 的古老集合。JDk1.2引入了集合框架的Map接口,HashTable也实现了Map接口,因此HashTable也增加了一些Map的方法
2、HashMap与HashTable区别
(1)、HashMap允许使用null作为Key或者Value,HashTable不允许
(2)、HashMap是线程不安全的因此性能较好,而HashTable是线程安全的因此性能较差
3、场景
多线程环境下也是用HashMap,Collections可以把HashMap转换成线程安全的集合.
例:Map map = Collections.synchronizedList(new HashMap())
总的来说向Vector和HashTable这种JDK1.0产物尽量不使用,除非某些api强制使用~~~果然老东西得退休~