小滴课堂-学习笔记:阿里p6后端工程师/技术经理的java集合框架List了解多少

56 篇文章 0 订阅
32 篇文章 1 订阅

logo 愿景:"让编程不再难学,让技术与生活更加有趣"


更多架构课程请访问 xdclass.net

 

目录

第1集 编程语言面试题之新版javase集合框架List基础篇

第2集 编程语言面试题之新版javase集合框架List 追杀篇《上》

第3集 编程语言面试题之CopyOnWriteArrayList追杀篇《下》

第4集 源码剖析之新版javase扩容机制List暗器篇

第5集 编程语言面试题之新版JDK手写ArrayList大招篇《上》

第6集 编程语言面试题之新版JDK手写ArrayList大招篇《下》

干货文档


第1集 编程语言面试题之新版javase集合框架List基础篇

简介:java集合框架里面List常见基础面试题

  • 考查点:list的基础知识点掌握情况,对应的实现的区别,线程安全、使用场景

  • 难度【***】

  • 说下Vector和ArrayList、LinkedList联系和区别?分别的使用场景

  • 答案:

    • 线程安全

      • ArrayList:底层是数组实现,线程不安全,查询和修改非常快,但是增加和删除慢
      • LinkedList: 底层是双向链表,线程不安全,查询和修改速度慢,但是增加和删除速度快
      • Vector: 底层是数组实现,线程安全的,操作的时候使用synchronized进行加锁
    • 使用场景

      • Vector已经很少用了
      • 增加和删除场景多则用LinkedList
      • 查询和修改多则用ArrayList

 

 

第2集 编程语言面试题之新版javase集合框架List 追杀篇《上》

简介:基于List进行继续追问,初试连环炮

  • 考点: List的掌握情况(追问系列)
  • 难度【***】
  • 如果需要保证线程安全,ArrayList应该怎么做,用有几种方式



方式一:自己写个包装类,根据业务一般是add/update/remove加锁 
​
方式二:Collections.synchronizedList(new ArrayList<>()); 使用synchronized加锁
​
方式三:CopyOnWriteArrayList<>()  使用ReentrantLock加锁
​


 

第3集 编程语言面试题之CopyOnWriteArrayList追杀篇《下》

简介:基于CopyOnWriteArrayList进行继续追问

  • 考点: CopyOnWriteArrayList的掌握情况(追问系列)

  • 难度【** ***】

  • 如果回答到上面的点则继续问,没回到到则问,了解CopyOnWriteArrayList吗?和 Collections.synchronizedList实现线程安全有什么区别, 使用场景是怎样的?

    • CopyOnWriteArrayList:执行修改操作时,会拷贝一份新的数组进行操作(add、set、remove等),代价十分昂贵,在执行完修改后将原来集合指向新的集合来完成修改操作,源码里面用ReentrantLock可重入锁来保证不会有多个线程同时拷贝一份数组

      • 场景:读高性能,适用读操作远远大于写操作的场景中使用(读的时候是不需要加锁的,直接获取,删除和增加是需要加锁的, 读多写少)

       

    • Collections.synchronizedList:线程安全的原因是因为它几乎在每个方法中都使用了synchronized同步*锁

      • 场景:写操作性能比CopyOnWriteArrayList好,读操作性能并不如CopyOnWriteArrayList

     

  • CopyOnWriteArrayList的设计思想是怎样的,有什么缺点?

    答案:设计思想:读写分离+最终一致
    
    缺点:内存占用问题,写时复制机制,内存里会同时驻扎两个对象的内存,旧的对象和新写入的对象,如果对象大则容易发生Yong GC和Full GC
    
    
    
    
    
    

     

 

第4集 源码剖析之新版javase扩容机制List暗器篇

简介:基于List进行继续二次追问,进阶扩容机制+源码剖析

  • 考点:List集合扩容机制
  • 难度【** * **】
  • 说下ArrayList的扩容机制是怎样的

    
    
    
    注意:JDK1.7之前ArrayList默认大小是10,JDk1.7之后是0
    ​
    未指定集合容量,默认是0,若已经指定大小则集合大小为指定的;
    当集合第一次添加元素的时候,集合大小扩容为10
    ArrayList的元素个数大于其容量,扩容的大小= 原始大小+原始大小/2
    ​

     

 

  • 源码解读 JDK ArrayList 扩容核心源码




调试代码
​
List<String> list = new ArrayList<>();
​
for(int i=0;i<10;i++){
    list.add(""+i);
}
System.out.println(list.size());
​
list.add("xdclass.net");
​
System.out.println(list.size());




第5集 编程语言面试题之新版JDK手写ArrayList大招篇《上》

简介:基于List进行继续追问,进阶连环炮,代码实战

  • 考点:源码设计思想、代码编写规范
  • 难度【** * **】
  • 设计一个简单的ArrayList【需要包含 构造函数(有参和无参)、add(obj)、 扩容机制】



 //计算容量+确保容量
    private void ensureCapacityInternal(int minCapacity){
​
        //如果是初次扩容,则使用默认的容量
        if(elementData == EMPTY_ELEMENT_DATA){
            minCapacity = Math.max(DEFAULT_CAPACITY, minCapacity);
        }
​
        //是否需要扩容,需要的最少容量大于现在数组的长度则要扩容
        if(minCapacity - elementData.length > 0){
            int oldCapacity = elementData.length;
​
            int newCapacity = oldCapacity + (oldCapacity>>1);
​
            //如果新容量 < 最小容量, 则讲最新的容量赋值给新的容量
            if(newCapacity - minCapacity < 0){
                newCapacity = minCapacity;
            }
​
            //创建新数组
            Object[] objects = new Object[newCapacity];
​
            //将旧的数组复制到新的数组里面
            System.arraycopy(elementData,0, objects,0,elementData.length);
​
            //修改引用
            elementData = objects;
​
        }
​
    }








 

 

第6集 编程语言面试题之新版JDK手写ArrayList大招篇《下》

简介:基于List进行继续追问,进阶连环炮,代码实战

  • 考点:源码设计思想、代码编写规范
  • 难度【** * **】
  • 设计一个简单的ArrayList【remove(index)、get(index) 、indexOf(o) ,set(int index,Object obj)】

 




System.arraycopy(Object src, int srcPos, Object dest, int destPos,int length)参数介绍
​
Object src : 原数组
int srcPos : 从元数据的起始位置开始
Object dest : 目标数组
int destPos : 目标数组的开始起始位置
int length  : 要copy的数组的长度


 

干货文档

 

 

 

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

dev666

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

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

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

打赏作者

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

抵扣说明:

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

余额充值