1、List和Set是存储单列数据的集合,Map是存储键值对这样的双列数据的集合;
2、List中存储的数据是有顺序的,并且值允许重复;Map中存储的数据是无序的,它的键是不允许重复的,但是值是允许重复的;Set中存储的数据是无顺序的,并且不允许重复,但元素在集合中的位置是由元素的hashcode决定,即位置是固定的(Set集合是根据hashcode来进行数据存储的,所以位置是固定的,但是这个位置不是用户可以控制的,所以对于用户来说set中的元素还是无序的)。
 

Collection是一个接口,与MAP接口是同级的

         Collection代表的是单个元素对象的序列,(可以有序/无序,可重复/不可重复 等,具体依据具体的子接口Set,List,Queue等);Map代表的是“键值对”对象的集合(同样可以有序/无序 等依据具体实现)

LIST:
       List继承于 Collection 接口。List 是有序的 Collection,List 允许有重复元素,实现 List 接口的常用类有 LinkedList,ArrayList,Vector ;

ArrayList
最常见的List实现类,内部是通过数组实现的,又名动态数组。允许对元素进行快速随机访问,可以动态添加或者删除元素。每次添加新元素时,ArrayList都会检查是否需要进行扩容操作,默认是原来的50%。

Array 和 ArrayList的不同
Array即数组,他是静态的,一旦初始化后,长度就不能改变了。而动态数组ArrayList可以随时对元素进行增删。所以,当我们不知道有多少个元素时,我们用ArrayList,如果知道有多少个元素,就用Array。

LinkList
用链表结构储存数据,适合数据的动态插入和删除,但是因为不支持直接按index查找,所以随机访问和遍历速度慢。而且,因为他有专门定义的操作表头和表尾元素的方法,可以当作堆,栈,队列和双向队列使用。

ArrayList与linkList之间的差别
ArrayList进行查询时,可以通过下标的方式,快速找到对应内容,时间系数为1,;但是他在进行插入时,相对会比较慢,需要将插入位置后面的数组全部都往后移动对应的位数;删除一样,向前移动对应位数

较常适用于查多改少的场景

linkList:链表结构,他是以这种结构展示,如果需要进行查询时,需要遍历所有的数据进项查询,相对比较复杂;而进行数据插入时,只需要将pre指向上一个数据的next,next指向下一个数据pre。他的时间系数也是为1;

较常使用于查少改多的场景

Vector
也是通过数组实现。不同的是,它支持线程的同步,每个时刻只能有一个线程对他进行修改,因此同步花费的时间会使Vector相比较于ArrayList要慢。他是线程安全的

List总结
List和数组类似,可以动态增长,根据实际存储的数据的长度自动增长List的长度。查找元素效率高,插入删除效率低,因为会引起其他元素位置改变
List接口是一个有序的 可以有重复元素的
使用场景的选择:
对于需要快速插入、删除元素,则需使用LinkedList。
对于需要快速访问元素,则需使用ArrayList。
List只能被一个线程操作,如果是多线程环境,List可能同时被多个线程操作,造成错误 考虑使用同步的类(如Vector)。

作者:无名小辈day
链接:
来源:稀土掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

Set:
set也是实现collection接口

Set中,值不能重复,对象相等性本质是对象hashcode值判断的。

Set总结

  1. 不允许存储重复元素(根据重写hashCode()和equals()方法来判断是不是同一对象)。
  2. 没有索引,没有带索引的方法,所以也就不能使用普通for循环。
  3. 可以看出Map接口与Collection接口没有任何关系 是与Collection接口同等级的 是第二大集合操作接口
    Map是键值对集合 以 key:value保存(是成对出现的),其中的key是唯一的标识;
    使用Collection集合就不容易保存 但是使用键值对的方式就比较简单;
    map中有HashMap实现类
    2.1 HashMap
    基于 hash 表的 Map 接口实现,非线程安全,高效,支持 null 值和 null
    键;
    2.2 HashTable
    线程安全,低效,不支持 null 值和 null 键;