问题总结。。。

Collection


arrayList

优点:
底层使用数组实现,数组地址连续,遍历比较快(下标,直接通过地址寻找)
使用iterator遍历
缺点:
线程不安全
当数据比较大时,新增和删除性能过低,
删除第五个:复制一个新数组,指定1-5不变,6-10复制过去

linkedList
链表
优点
新增和删除不需要频繁的移动数据,只要改变地址指向,性能高


hashMap

TreeMap
根据key自动排序

总结:arraylist和vector区别
大量数据下
arrayList适合查询,更改
linkedList适合新增,删除

arraylist每次扩容0.5倍(扩容频率高),jdk1.6之后使用,快,不安全
vector每次扩容1倍(扩容频率低) ,jdk1.5之前,慢,安全

hashMap与hashTable区别

都实现了Map接口
相同点:都实现了map接口
不同点:
Map:1.6之后使用,线程不安全,速度快
Table:1.5之前用,慢,安全,不支持null作为key,不仅实现了map接口,还继承了dictionary类


Set
HashSet      底层使用哈希表实现,无序且唯一,线程不安全,效率高,元素的唯一性是靠重写hashCode和equal方法来实现的,
linkedHashSet: 采用链表和哈希表共同实现,链表保证元素的顺序与存储顺序一致,哈希表保证元素的唯一性
TreeSet:             底层使用二叉树来实现,元素唯一且已经排好序,唯一性也需要hashCode和equal,二叉树结构保证有序性

总结Set:
HashSet: 
底层其实包装了一个hashMap,
底层数据结构是数组 + 连表 + 红黑树
有比较好的查找和读取性能,可以有null值,
通过hashCode和equal方法确保唯一性
线程不安全

linkedHashSet
继承HashSet 本质是LinkedHashMap的实现
底层数据结构由哈希表(是一个元素为连表的数组)和双向链表组成
有序,hashCode确定存储位置,链表来维护元素的插入顺序
不安全,可以有null值

TreeSet
实现了SortedSet接口,底层是用TreeMap实现的,本质红黑树原理
排序分两种:自然排序(存储元素实现comparable接口),定制排序(创建TreeSet时,传递一个自己实现的Comparator对象)
正常情况下不能有null值,可以重写Comparable接口,就可以有null值了

Map
1.HashMap
Map接口基于哈希表的实现,根据键的HashCode值存储数据,大多数情况可以直接定位到它的值,特点是访问快,遍历顺序不确定,线程不安全,最多一个键为null,
可以用Collections的synchronizedMap方法使HashMap具有线程安全的能力,或者使用ConcurrentHashMap
2.HashTable
 都实现了map,table更继承了dictionary类,线程安全,不允许key和value为null,并发不concurrentHashMap
不建议使用,线程安全时使用hashmap,不安全使用concurrenthashmap
3.LinkedHashMap
继承HashMap,是Map接口的的哈希表和链表实现,他维护着一个双重链表,此链表定义了迭代顺序,该迭代顺序可以是插入顺序或者是访问顺序
4.TreeMap
TreeMap实现SortMap接口,能够根据保存的记录的键的升序排序,也可以指定排序的比较器,当用Iterator遍历时,得到的结果是排序后的结果

面试问题
1.线程池常用参数
 corePoolSize—核心线程(常驻线程),
 maxinumPoolSize—线程池最大线程数(包括核心线程必须大于1),
 keepActiveTime-多余空闲线程存活时间,除核心线程外的线程,空闲时间超过该时间会自动销毁
 unit:keepActiveTime的单位
 workQueue:任务队列,被提交还未执行的任务
 threadFactory:生成线程池中线程的线程工厂,用于创建线程
 handle:拒绝策略,当任务队列满了,且工作线程 >= maxinumPoolSize时,如何来拒绝请求执行的runnable的策略

2.hashMap底层实现
 https://blog.csdn.net/shi_xiansheng/article/details/117792691

数组:查询效率高,新增删除效率低
链表:查询效率低,新增删除效率高
HashMap使用数组和链表或红黑树,解决了数组和链表的缺点
jdk1.7之前,数组+ 链表
1.7之后: 数组 + 链表 + 红黑树(平衡二叉树)
HashMap存储过程:

 1.计算“刘德华”的hashCode值,该值用来定位到要把这个元素存放到数组什么位置
  “刘德华”调用hashCode()方法会返回一个int型的整数,(哈希码和调用它的对象地址和内容有关)
    哈希码特点: 没有被修改的同一个对象,equal返回true,无论何时哈希码值都是相同的
           两个不同的对象,equal返回false,hashCode值也可能相同,(hashCode相同,也不一定代表两个对象相同)
    “刘德华”的hashCode为20977295数组长度为16,则“刘德华”的在数组中的索引为20977295%16=1

 分两种情况:
  1.数组索引为1的地方是空的,直接放进去
  2.不为空,这种时候我们判断该位置的对象是否和“刘德华”相等
   判断:首先根据hashCode判断,再根据equal判断,如果hashCode相同,再去判断equal是否相同,如果hashCode都不相同,那就没必要去比    较equal,hashCode都不相同(hashCode并不完全可信,不同的对象hashCode也可能相同),equal肯定也不相同

   如果两者相等则覆盖,不相等则在原来的元素下面使用链表的结构存储该元素
 每个元素节点都有一个next属性指向下一个节点,这里由数组变成了数组 + 链表结构
 而数组 + 链表 + 红黑树结构又是什么怎么回事呢?
 因为链表中元素过多时,影响查询效率,所以当链表中元素的个数达到8的时候,链表存储就变成了红黑树存储,原因在于红黑树是平衡二叉树,在查找方 面性能比链表高

 HashMap两个重要的参数:初始容量,加载因子0.75f
 当数组中存储的元素超过16*0.75时,会调用rehash()将数组的容量扩容为原来的两倍,并会对原来存储的元素重新计算hashCode值,重新分配到新生 成的数组里,所以扩容是非常消耗性能的

 
3.bean的生命周期,
 1.通过构造方法创建bean实例(无参构造)
 2.为bean的属性设置值和对其他bean的引用(调用set方法)
 3.把bean实例传递bean后置处理器的方法postProcessBeforeInitialization
 4.调用bean的初始化方法(需要进行配置初始化方法)
 5.把bean实例传递bean后置处理器的方法postProcessAfterInitialization
 6.bean就可以使用了
 7.当容器关闭时,调用bean的 destroy方法(需要进行配置销毁的方法)
   当没有配置bean的后置处理时没有3和5
4.beanFactory和factoryBean区别
 https://blog.csdn.net/weixin_56311692/article/details/125782919
5.hashMap底层逻辑
6.jdk中都提供了那些锁
 https://www.jianshu.com/p/a16146970170
 1.关键字 synchronized 代码块(锁对象),对象方法(锁对象),静态方法(锁类)
 2.可重入锁 ReentrantLock
 3.读写分离锁 ReadWriterLock 读的时候不加锁,写的时候加锁,
  读写 加锁
  写写 加锁
  读读 不加锁
 总结:重入锁完全可替代synchronized,,能不用就不用,且带来更多强大的功能,如:中断相应,超时等待,公平锁等.
         读写锁将读写分离,在读多写少的场景里,能极大的提高程序的性能.
 ◦ 
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值