JAVA

ArrayList、Vector、LinkedList区别
1. ArrayList复制移动代价较高,不适合插入和删除
2. Vector支持线程同步,访问比ArrayList慢
3. LinkedList是用链表存储的,适合动态插入或删除


HashTable、HashMap、LinkedHashMap和TreeMap区别
1. HashTable不支持null key和null value,因为每个方法里面都有synchronize方法所以是线程安全的
2. TreeMap会按照key排序
3. LinkedHashMap有序,FIFO
4. HashMap是数组+链表


HashMap和ConcurrentHashMap
1. Hashmap本质是数组加链表。根据key取得hash值,然后计算出数组下标,如果多个key对应到同一个下标,就用链表串起来,新插入的在前面。
a. JDK1.7用的数据结构是数组+链表
b. JDB1.8之后使用的是数组+链表+红黑树(链表深度到达8的时候)
2. ConcurrentHashMap:在hashMap的基础上,ConcurrentHashMap将数据分为多个segment(段),默认16个(concurrency level),然后每次操作对一个segment(段)加锁,避免多线程锁的几率,提高并发效率


JAVA序列化方式
1. 通过实现原生Serializable接口实现
2. 实现Externalizable
3. JSON序列化:可读性好方便调试


关键字
1. final
a. final修饰类:该类不可继承
b. final修饰方法:该方法不能被子类覆盖(但它不能修饰构造函数)
c. final修饰字段属性:属性值第一次初始化后不能被修改
d. 使用final可以提高程序执行的效率,将一个方法设成final后编译器就可以把对那个方法的所有调用都置入“嵌入”调用里。


2. static
a. static修饰成员函数则该函数不能使用this对象
b. static不能修饰构造函数、函数参数、局部成员变量
c. static修饰成员字段则当类被虚拟机加载时按照声明先后顺序对static成员字段进行初始化。
d. static修饰语句块:当类被虚拟机加载时按照声明先后顺序初始化static成员字段和static语句块
e. static所修饰的方法和字段只属于类,所有对象共享,java不能直接定义全局变量,是通过static来实现的。


3. synchronize
将代码块声明为synchronize使代码块具有原子性和可见性,可能会造成线程的阻塞


4. volatile
保证变量的可见性,需要确保对变量的写入操作不依赖变量的当前值

线程的几个状态
新建、可运行、运行、阻塞、死亡


创建线程的三种方式
1. 继承Thread类创建线程类
2. 通过Runnable接口创建线程类
3. 通过Callable和Future创建线程


JAVA线程间通信
1. 使用 volatile 关键字
2. 使用Object类的wait() 和 notify() 方法
3. 使用JUC工具类 CountDownLatch
4. 使用 ReentrantLock 结合 Condition
5. 基本LockSupport实现线程间的阻塞和唤醒


Synchronized和ReentrantLock的区别
1. 都是用来协调多线程对共享对象、变量的访问
2. 都保证了可见性和互斥性
3. Synchronized是JVM层面的,不需要用户手动释放锁,不可中断,非公平锁
4. ReentrantLock是API层面的,需要用户手动释放锁,可中断,公平or非公平


创建线程池的四种方式
1. newCachedThreadPool创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。
2. newFixedThreadPool 创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。
3. newScheduledThreadPool 创建一个定长线程池,支持定时及周期性任务执行。
4. newSingleThreadExecutor 创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行。


线程池构造的七个参数
线程池的构造函数有7个参数,分别是corePoolSize、maximumPoolSize、keepAliveTime、unit、workQueue、threadFactory、handler
1. corePoolSize 线程池核心线程大小
2. maximumPoolSize 线程池最大线程数量
3. keepAliveTime 空闲线程存活时间
4. unit 空闲线程存活时间单位
5. workQueue 工作队列
6. threadFactory 线程工厂
7. handler 拒绝策略


JAVA虚拟机(JVM)
JAVA中的堆
JVM所管理的最大的一块内存空间,主要用于存放各种类的实例对象
堆被划分成两个不同的区域:新生代(Young)、老年代(Old)
这样划分的目的是为了使JVM能够更好的管理堆内存中的对象,包括内存的分配以及回收
1. 新生代中,每次垃圾收集时都发现大批对象死去,只有少量对象存活,便采用了复制算法,只需要付出少量存活对象的复制成本就可以完成收集。
2. 而老年代中因为对象存活率高、没有额外空间对它进行分配担保,就必须采用“标记-清理”或者“标记-整理”算法
新生代与老年代的比例的值为1:2(该值可以通过参数 –XX:NewRatio 来指定),即:新生代=1/3的堆空间大小。老年代=2/3的堆空间大小。
清理方式
1. Minor GC是新生代GC
2. Major GC是老年代GC
3. Full GC是清理整个堆空间,包括年轻代和老年代
垃圾回收机制GC
System.gc(); 手动回收垃圾
finalize()方法是在每次执行GC操作之前时会调用的方法


策略算法
1. 计数算法
2. 标记–清除算法
3. 标记–整理算法
4. 复制算法
5. 分代算法


收集器CMS和G1的区别
1. CMS收集器是老年代的收集器,G1收集器收集范围是老年代和新生代
2. CMS收集器以最小的停顿时间为目标的收集器,G1收集器可预测垃圾回收的停顿时间
3. CMS收集器是使用“标记-清除”算法进行的垃圾回收,容易产生内存碎片;G1收集器使用的是“标记-整理”算法,进行了空间整合,降低了内存空间碎片。
4. 垃圾回收的过程不一样
5. CMS并发收集,但是会造成内存碎片过多;GG就有效的使用了连续空间,不会导致连续空间不足提前造成GC的触发


类加载
程序主动使用某个类时,如果该类还未被加载到内存中,则JVM会通过加载、连接、初始化3个步骤来对该类进行初始化
1. 加载指的是将类的class文件读入到内存
2. 连接将java类的二进制代码合并到JVM的运行状态之中
3. 初始化阶段是执行类构造器<clinit>()方法的过程

posted on 2022-02-03 21:03  xiao_xin  阅读(30)  评论(0)    收藏  举报

导航