千锋教育Java入门全套视频教程(java核心技术,适合java零基础,Java

集合框架
1.1概念
集合框架包含三大块内容:对外的接口,接口的实现,和对集合运算的算法
集合就是用于存储对象的容器,集合的长度可变,不能存储基础类型的数据
1.2集合与数组的区别
数组:长度固定,没办法动态扩容
集合存储数据时没有长度限制(最大值int的max-8)减8的原因:java对象除了存储数据本身
之外还需要32bytes大小来存储对象头信息
Java对象在堆内存中的存储布局可以分为三部分:对象头(object header),实例数据(Instance Data)和对齐填充(Padding)。
1.3集合基本架构
集合类可以分为两大类:一类是实现Collection接口;另一类是实现Map接口
Collection是一个基本的集合接口,可以容纳一组集合元素
Map没有继承Collection接口,与Collection是并列关系。Map提供键(key)到值(value)的映射
一个Map中不能包含相同的键,每个键只能映射一个值
Collection接口下有两个接口Set和List
List:有序重复
List下的实现类有Vector(过时),ArrayList,LinkedList
Set:无序不重复,无法通过下标访问数据
查找慢,插入删除快(底层结构是哈希表和红黑树)
Set集合使用equals()和hashcode()去重
ArrayList和LinkedList区别:
实现:
1.LinkedList:双链表
ArrayList:动态数组
扩容机制:
2.LinkedList:不存在扩容
ArrayList:动态数组存在扩容说法,默认的数组大小是10,在检测是否需要扩容后,如果扩容,会扩容为原来的
1.5倍大小。原理就是把老数组的元素存储到新数组里面(每次扩容会造成数据迁移,效率变低)
优点:
3.LinkedList:删除插入效率高
ArrayList:查找效率高
缺点:
4.LinekdList:链表,在内存中地址不是连续的,通过指针连接结点,如果要查找,必须遍历整个链表,效率很低
ArrayList:在内存中是一块连续的地址,如果进行删除插入操作,会使该位置前后的元素全部移动,代价很高;
安全角度:
5.LinkedList:非线程安全
ArrayList:非线程安全
vector:线程安全
LinkedList和ArrayList的数据存储都是有序的,而且元素是可以重复的。
两者add都是将元素追加到现有集合元素的末尾。
List接口独有的方法均与索引(index)有关,这是因为List接口代表的是列表类型,以线性方式存储对象
ArrayList集合:(底层实现动态数组)
1、默认初始化容量10(底层先创建了一个长度为0的数组,当添加第一个元素的时候,初始化容量10。)
2、集合底层是一个Object[]数组。
3、构造方法:
new ArrayList();
new ArrayList(20);
4、ArrayList集合的扩容:
增长到原容量的1.5倍。
ArrayList集合底层是数组,怎么优化?
尽可能少的扩容。因为数组扩容效率比较低,建议在使用ArrayList集合
的时候预估计元素的个数,给定一个初始化容量。
5、数组优点:
检索效率比较高。(每个元素占用空间大小相同,内存地址是连续的,知道首元素内存地址,
然后知道下标,通过数学表达式计算出元素的内存地址,所以检索效率最高。)
6、数组缺点:
随机增删元素效率比较低。
另外数组无法存储大数据量。(很难找到一块非常巨大的连续的内存空间。)
7、向数组末尾添加元素,效率很高,不受影响。
8、面试官经常问的一个问题?
这么多的集合中,你用哪个集合最多?
答:ArrayList集合。
因为往数组末尾添加元素,效率不受影响。
另外,我们检索/查找某个元素的操作比较多。
7、ArrayList集合是非线程安全的。(不是线程安全的集合。)
LinkedList集合:(底层实现,双向链表,适合插入删除)
特有的方法:
addFirst()//在头部添加
addLast()//在尾部添加
getFirst()//得到头部数据
getLast()//得到尾部数据