一,集合的由来:
数组长度是固定的,当添加的元素超过了数组的长度时需要对数组重新定义,太麻烦,Java内部给我们提供了集合类,能存储任意对象,长度是可以改变的,随着元素增加而增加,随元素减少而减少
数组与集合的区别:
1:基本数据类型存储的是值,引用数据类型存储的是地址值
数组既可以存储基本数据类型,又可以存储引用型数据类型
集合只能存储引用型数据类型(对象),集合中也能存储基本数据类型,但是存储的时候会自动封箱变成对象
2:数组的长度是固定的,不能自动增长的
集合长度是可变的,可以根据元素的增长而增长
3:使用情况
1.元素个数固定推荐使用数组
2.元素个数不固定推荐使用集合
二,如何选用集合??
当遇到集合问题时往往不知如何选择集合,主要根据集合特点来选择,比如我们需要根据键值获取到元素值时就选用Map接口下的集合,需要排序时选择TreeMap,不需要排序时就选择HashMap,需要保证线程安全的就选用ConcurrentHsahMap。当我们只需要存放元素值时,就选择实现Collection接口的集合,需要保证元素唯一时选择实现Set接口的集合,比如TreeSet或HashSet,不需要就选择实现List接口,比如ArrayList或LinkedList,然后再根据实现这些接口的集合特点来选用,下面详细介绍集合特点。
三,集合框架体系图
四,Collectoin
1.List
ArrayList:Object数组实现
Vector: Object数组实现
LinkedList:双向链表(JDK1.6前为循环链表,JDK1.7后取消循环)
2.Set
HashSet: 无序,唯一:基于HashMap实现,底层采用HashMap来保存元素
LinkedHashSet :继承于HashSet,并且内部是通过LinkedHashMap来实现的
TreeSet : 有序,唯一: 红黑树(自平衡的排序二叉树)
五,Map
1,HashMap :JDK1.8之前由数组+链表组成,数组为主体,链表则是主要为了解决哈希冲突而存在的(拉链法解决冲突)
JDK1.8由数组+链表+红黑树组成,以后当链表长度大于阈值时,将链表转换为红黑树,减少搜索时间
2,LinkedHashMap继承自HashMap,所以底层是基于拉链式散列结构,即由数组和链表或红黑树组成,并在此结构上增加了一条双向链表,是上面结构可以保持简直对的插入顺序,同时通过对链表进行相应操作,实现了访问顺序相关逻辑
3,HashTable 数组+链表组成,数组是HashMap的主体,链表解决哈希冲突
4,TreeMap: 红黑树(自平衡的排序二叉树)