欢迎光临散文网 会员登陆 & 注册

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

2023-07-18 21:05 作者:你其实都知道  | 我要投稿

集合框架

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()//得到尾部数据

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

分享到微博请遵守国家法律