总结
面试难免让人焦虑不安。经历过的人都懂的。但是如果你提前预测面试官要问你的问题并想出得体的回答方式,就会容易很多。
此外,都说“面试造火箭,工作拧螺丝”,那对于准备面试的朋友,你只需懂一个字:刷!
给我刷刷刷刷,使劲儿刷刷刷刷刷!今天既是来谈面试的,那就必须得来整点面试真题,这不花了我整28天,做了份“Java一线大厂高岗面试题解析合集:JAVA基础-中级-高级面试+SSM框架+分布式+性能调优+微服务+并发编程+网络+设计模式+数据结构与算法等”
且除了单纯的刷题,也得需准备一本【JAVA进阶核心知识手册】:JVM、JAVA集合、JAVA多线程并发、JAVA基础、Spring 原理、微服务、Netty与RPC、网络、日志、Zookeeper、Kafka、RabbitMQ、Hbase、MongoDB、Cassandra、设计模式、负载均衡、数据库、一致性算法、JAVA算法、数据结构、加密算法、分布式缓存、Hadoop、Spark、Storm、YARN、机器学习、云计算,用来查漏补缺最好不过。
分析使用无参构造器,创建和使用ArrayList。有参构造器阅读源码过程差不多,不一样的是
初次扩容
!
源程序
@SuppressWarnings(value = “all”)
public class ArrayListSource {
public static void main(String[] args) {
// 使用无参构造器创建ArrayList
ArrayList list = new ArrayList();
// 使用有参构造器创建ArrayList
// ArrayList list = new ArrayList(8);
// 向集合添加10条数据
for (int i = 1; i <= 10; i++) {
list.add(i);
}
// 再向集合添加5条数据
for (int i = 11; i <= 15; i++) {
list.add(i);
}
list.add(100);
list.add(200);
}
}
分析过程
1.创建一个空的数组【elementData】
2.执行list.add(E e)
-
先确保内部容量,是否要扩容
ensureCapacityInternal
-
然后再执行赋值
第一次添加的时候
Debug F7 into
进入源码!如果装填的数据是基本类型,塞入前会有一步装箱操作。
3.确定最小容量【minCapacity】,第一次扩容为10
4.确定是否需要扩容
-
modCount++ 记录集合被修改的次数
-
如果elementData的大小不够,就调用grow()去扩容
5.扩容,通过扩容机制来确定要扩容到多大
-
第一次newCapacity=10
-
第二次及其以后,按照数组原容量的1.5倍扩容
-
扩容使用的是
Arrays.copyOf
6.完成扩容,数据放入数组
grow()扩容函数详解
jdk 1.8.0_221源码片段
private void grow(int minCapacity) {
// overflow-conscious code
int oldCapacity = elementData.length;
int newCapacity = oldCapacity + (oldCapacity >> 1);
if (newCapacity - minCapacity < 0)
newCapacity = minCapacity;
if (newCapacity - MAX_ARRAY_SIZE > 0)
newCapacity = hugeCapacity(minCapacity);
// minCapacity is usually close to size, so this is a win:
总结
无论是哪家公司,都很重视高并发高可用的技术,重视基础,重视JVM。面试是一个双向选择的过程,不要抱着畏惧的心态去面试,不利于自己的发挥。同时看中的应该不止薪资,还要看你是不是真的喜欢这家公司,是不是能真的得到锻炼。其实我写了这么多,只是我自己的总结,并不一定适用于所有人,相信经过一些面试,大家都会有这些感触。
最后我整理了一些面试真题资料,技术知识点剖析教程,还有和广大同仁一起交流学习共同进步,还有一些职业经验的分享。
-1715811734680)]