集合讲解(ArrayList、HashMap等)

本文详细介绍了Java集合框架中的ArrayList、HashMap等数据结构,包括它们的底层实现、优缺点以及扩容机制。ArrayList基于数组,查询快但增删慢,扩容时会创建新数组并拷贝原有元素。HashMap是非同步的,使用数组+链表/红黑树实现,适合快速查找。线程安全的选择有Vector和ConcurrentHashMap。LinkedList作为双向链表,适用于频繁增删操作。此外,文章还涵盖了数据结构的基础知识,如线性表、队列和栈。
摘要由CSDN通过智能技术生成

集合的用处
最主要的是以前用数组作为容器存储时,总会遇到扩容问题,数组不能自动扩容在之就是数组进行增删操作时,需要开发者自己实现 集合就优化了这些

所有集合的底层都是由Collection,Map,Iterator 三个接口派生而出;
集合分类实现表(红线为重点集合)

Collection

Collection接口有三种子类型集合:List,Set,Queue,再下面是一些抽象类,可根据源码来查看。常用的就是ArrayList,Linked List,Hash Set,LinkedHashSet,ArrayBlockingQueue等(值得一提的是在JDK1.8之后可以用我们lambda表达式进行遍历);

List

List接口元素有序可重复

list接口最主要还是提供了一些索引来完成CURD,索引(index)让集合变得有序,可重复;


ArrayList

ArrayList类是List接口的实现类,其中有包含一些AbstractList和底层接口Collection的一些抽象方法(了解即可),底层数据结构是数组,有序可重复的。

ArrayList是数组的包装类,jdk1.2出现,提供了操作底层数据的很多方法,同时向ArrayList做添加操作时,容器可以自动扩容;

Arraylist是线程不安全的。

根据数组实现集合,可以根据角标获取其中的数据(name[1])
数组的特点:连续的内存空间,有下标。(查询快,增删慢)
查询快:通过数组的下标直接获取队形的数据。
增删慢:插入或删除元素可能会涉及到下标的移动。

ArrayList的扩容机制ArrayList默认数组长度是10,当前数组容量占满时,会触发扩容。
扩容的规则
(1)创建一个长度为当前数组长度1.5倍的新数组。
(2)然后将当前数组的元素拷贝到新数组,在新数组上继续添加元素。
(3)将内存地址指向新数组。


Vector

Vector也是基于数组实现,和ArrayList最大的区别就是Vector是线程安全的。
它是一个线程安全的List

VectorArrayList类似,是长度可变的数组,与ArrayList不同的是,Vector是线程安全的,它给几乎所有的public方法都加上了synchronized关键字。由于加锁导致性能降低,在不需要并发访问同一对象时,这种强制性的同步机制就显得多余,所以现在Vector已被弃用。

CopyOnWriteArrayList 的读操作不会阻塞其他操作;写操作则是通过复制一份,对复制版本进行操作,不会影响原来的数据。和 Vector 相对效率提高不少。缺点就是可能读取的不是最新的值。


LinkedList

基于链表实现 (双向链表)。

链表的特点:每一个结点元素,保存上一个元素的地址和下一个元素的地址。(查询慢,增删快
查询慢:查询需要遍历每一个元素 。
增删快:插入,删除,只需要改变元素的地址指向。

区别于ArrayList除了以上三点,他不单单是只实现了List接口,还实现了Deque接口,

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值