Java集合框架的一些小知识

目录

一、List和ArraysList

二、Queue和Deque

三、ArrayList和LinkList的区别与联系

四、其他相关知识


一、List和ArraysList

🍑List是一个接口,而ArrayList是List接口的一个实现类。

       ArrayList类继承并实现了List接口。 
 📝因此,List接口不能被构造,也就是我们说的不能创建实例对象,但是我们可以像下面那样为List接口创建一个指向自己的对象引用,而ArrayList实现类的实例对象就在这充当了这个指向List接口的对象引用。

List<Integer> res = new ArrayList<Integer>(); 

 

🌰List a=new ArrayList();

📝则a拥有List的所有属性和方法,不会拥有其实现类ArrayList的独有的属性和方法。

a只能调用类ArrayList中重写List类的抽象方法

📝如果List与ArrayList中有相同的属性(如int i),有相同的方法(如void f()),

则a.i是调用了List中的i,成员变量不会被重写

a.f()是调用了ArrayList中的f();——因为list中的成员方法f()在ArraysList中进行了重写


二、Queue和Deque

🔔Queue和Deque是接口,在实例化时必须实例化LinkedList的对象,因为LinkedList实现了Queue接口

Queue<Integer> q = new LinkedList<>()

  

  • add 增加一个元素
  • offer 添加一个元素并返回true 如果队列已满,则返回false
  • remove 移除并返回队列头部的元素 如果队列为空,则抛出一个NoSuchElementException异常
  • poll 移除并返问队列头部的元素 如果队列为空,则返回null
  • element 返回队列头部的元素 如果队列为空,则抛出一个NoSuchElementException异常
  • peek 返回队列头部的元素 如果队列为空,则返回null


 

Deque<TreeNode> stack = new LinkedList<TreeNode>();

 Deque的一些方法

头部尾部
当操作失败时抛出异常false或null抛出异常false或null
插入addFirst(e)offerFirst(e)addLast(e)offerLast(e)
删除removeFirst()offerFirst()removeLast()offerLast()
检查获取getFirst()peekFrist()getLast()peekLast()

 

 


三、ArrayList和LinkList的区别与联系

List:是一个接口,规范了ArrayList 和 LinkedList中要实现的方法
ArrayList:实现了List接口,底层为动态类型顺序表
LinkedList:实现了List接口,底层为双向链表

 

1. ArrayList的实现是基于数组,LinkedList的实现是基于双向链表。

2. 对于随机访问,ArrayList优于LinkedList , ArrayList可以根据下标以O(1)时间复杂度对元素进行get()随机访问。而LinkedList的每一个元素都依靠地址指针和它后一个元素连接在一起,在这种情况下,随机访问某个元素的时间复杂度是O(n)

3. 对于插入和删除操作,LinkedList优于ArrayList,因为当元素被添加到LinkedList任意位置的时候,不需要像ArrayList那样重新计算大小或者是更新索,但LinkedList在中间插入数据时间复杂度是O(n)

4. LinkedList比ArrayList更占内存,因为LinkedList的节点除了存储数据,还存储了两个引用,一个指向前一个元素,一个指向后一个元素。

时间复杂度的分析 

对于查找indexOf(),ArrayList时间复杂度是O(n)。LinkedList也是O(n) 

ArrayList 是线性表(数组)
get() 直接读取第几个下标,复杂度 O(1)
add(E) 添加元素,直接在后面添加,复杂度O(1)
add(index, E) 添加元素,在第几个元素后面插入,后面的元素需要向后移动,复杂度O(n)
remove()删除元素,后面的元素需要逐个移动,复杂度O(n)

LinkedList 是链表的操作
get() 获取第几个元素,依次遍历,复杂度O(n)
add(E) 添加到末尾,复杂度O(1)
add(index, E) 添加第几个元素后,需要先查找到第几个元素,直接指针指向操作,复杂度O(n)
remove()删除元素,直接指针指向操作,复杂度O(1)     (此处描述不严谨) 


四、其他相关知识

 📝上一张图总结一些

📝一些简单的解释和说明 

  • 1. Collection:是一个接口,包含了大部分容器常用的一些方法
  • 2. List:是一个接口,规范了ArrayList 和 LinkedList中要实现的方法
  •     ArrayList:实现了List接口,底层为动态类型顺序表
  •     LinkedList:实现了List接口,底层为双向链表
  • 3. Stack:底层是栈,栈是一种特殊的顺序表
  • 4. Queue:底层是队列,队列是一种特殊的顺序表
  •     Deque:是一个接口
  • 5. Set:集合,是一个接口,里面放置的是K模型
  •     HashSet:底层为哈希桶,查询的时间复杂度为O(1)
  •     TreeSet:底层为红黑树,查询的时间复杂度为O( ),关于key有序的
  • 6. Map:映射,里面存储的是K-V模型的键值对
  •     HashMap:底层为哈希桶,查询时间复杂度为O(1)
  •     TreeMap:底层为红黑树,查询的时间复杂度为O( ),关于key有序

来张图总结一下 

 

  • 11
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 8
    评论
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

是小鱼儿哈

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值