Java面试题总结-01

反射–类加载三个阶段

加载 Loading
	JVM将类的class文件读入内存,并为之创建一个java.lang.Class对象。此过程由类加载器完成
	
连接 Linking
	将类的二进制数据合并到JRE中
    1. 验证 Verification 
       对文件进行安全的校验 
       文件格式是否正确
       元数据验证是否正确
       符号引用是否正确...
       -Xverify:none可以关闭大部分的类验证措施,缩短虚拟机加载时间
    2. 准备 Preparation
       对静态变量分配内存
       默认初始化
    3. 解析 Resolution
       虚拟机将会把常量池中的符号引用替换为直接引用
       
初始化 Initialization
	JVM负责对类进行初始化,这里主要是指静态成员
	真正的执行在类中定义的java代码 静态代码块..

线程并发与并行

并发:同一时刻,多个任务交替执行,单核CPU实现多任务就是并发
并行:同一时刻,多个任务同时执行,多核CPU实现多任务并行

CAS算法

CAS(Compare-And-Swap)是一种硬件对并发的支持 针对多处理器操作而设计的处理器中的一种特殊指令 用于管理对共享数据的并发访问
CAS是一种无锁的非阻塞算法的实现
CAS包含了3个操作数:
    内存值:V
    预估值:A
    新值:B
	当且仅当V的值等于A时 CAS通过原子方式用新值B来更新V的值 否则不会执行任何操作

多线程状态转换

新建:线程被创建出来
就绪:具有CPU的执行资格,但是不具有CPU的执行权
运行:具有CPU的执行资格,也具有CPU的执行权
阻塞:不具有CPU的执行资格,也不具有CPU的执行权
死亡:不具有CPU的执行资格,也不具有CPU的执行权

线程池

public class MyTest {
    public static void main(String[] args) {
        //根据任务数量创建线程对应的线程个数
        ExecutorService executorService = Executors.newCachedThreadPool();

        //往线程池中提交任务
        executorService.submit(new Runnable() {
            @Override
            public void run() {
                System.out.println(Thread.currentThread() + "执行AAA");
            }
        });

        //关闭线程池
        executorService.shutdown();
    }
}

集合扩容机制

arrayList
	无参构造:初始elementData容量为0,第一次添加为10
	之后都是1.5倍扩容
vector
	底层维护了一个数组
	线程安全
	无参构造:第一次默认扩容10个
	之后都是2倍扩容	
linkedList
	底层维护了一个双向链表

hashSet 
	底层是hashMap,map值固定为PRESENT
	第一次添加table表扩容到16 之后按扩容因子(0.75)扩容
	16*0.75 不管是加在table表还是链表上都(size++)
	如:16(12) -> 32(24) -> 64(48)
	若一条链表个数达到8个并且table的大小>=64就会进行树化(红黑树)
	一条链表个数到8个但table大小没到64,则table表一直2倍扩容直到>=64
linkedHashSet
	底层维护了一个hash表+双向链表
	每一个节点有before和after属性 这样可以形成双向链表
	是hashSet的子类
	底层是linkedHashMap,维护了一个数组table+双向链表
	第一次添加时,直接将数组table扩容到16,存放的节点类型(LinkedHashMap$Entry)
	数组是(HashMap$Node[]) 存放的元素是(LinkedHashMap$Entry)
	
hashMap
	底层维护了Node类型的数组table,默认为null
	添加key-val,通过key的hash值得到table的索引。判断该索引处是否有元素,没有直接添加。如果有元素,判断该处的key和准备加入的key是否相同,相同则直接替换val,不相同则需判断是树结构还是链表结构做处理
	第一次添加则扩容table容量到16,临界值为12(16*0.75)
	之后扩容table为原来的2倍
	若一条链表个数达到8个并且table的大小>=64就会进行树化(红黑树)

LinkedList和ArrayList之间互相转换

ArrayList与类LinkedList不能强制数据类型转换。

1.通过构造方法转换
ArrayList arrayList = new ArrayList();
LinkedList linkedList = new LinkedList(arrayList);
LinkedList linkedList = new LinkedList();
ArrayList arrayList = new ArrayList(linkedList);
 
2.通过list的add方法
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值