文章目录
一、自我介绍
个人背景、项目经历、实习经历。
二、简历相关
2.1 React Native
2.2 印象最深的项目
三、Java后台
3.1 线程创建
- 继承Thread类并重写该类的run()方法。
- 实现Runnable接口创建线程重写run()方法。
- 创建Callable接口的实现类并实现call()方法,然后创建该实现类的实例(从java8开始可以直接使用Lambda表达式创建Callable对象)。
3.2 Java异步实现方式
- JDK1.8之前的Future
JDK并发包里的Future代表了未来的某个结果,向线程池中提交任务的时候会返回该对象,可以通过future获得执行的结果,但是JDK1.8之前的Future有点鸡肋,并不能实现真正的异步,需要阻塞的获取结果,或者不断的轮询。 - JDK1.8之后的Future
JDK1.8中提供了lambda
表达式,使得Java向函数式语言又靠近了一步。借助JDK原生的CompletableFuture
可以实现异步的操作,同时结合lambda
表达式大大简化了代码量。 - Spring的异步方法
先把longTimeMethod
封装到Spring的异步方法中,这个异步方法的返回值是Future的实例。这个方法一定要写在Spring管理的类中,注意注解@Async
。
3.3 JVM内存
JVM内存区域主要分为:
- 线程私有区域:程序计数器、虚拟机栈、本地方法区。
- 线程共享区域:JAVA堆、方法区。
- 直接内存。
3.4 Java GC
- 如何确定垃圾
(1)引用计数法:通过引用计数来判断一个对象是否可以回收。即一个对象如果没有任何与之关联的引用, 即他们的引用计数都不为0,则说明对象不太可能再被用到,那么这个对象就是可回收对象。
(2)可达性分析:为了解决引用计数法的循环引用问题,Java使用了可达性分析的方法。通过一系列的GC roots
对象作为起点搜索。如果在GC roots
和一个对象之间没有可达路径,则称该对象是不可达的。不可达对象经过两次标记为可回收对象,则将面临回收。 - 垃圾收集算法
(1)标记清除算法:分为两个阶段,标记阶段标记需要回收的对象,清除阶段回收对象占用的空间。
(2)复制算法:按内存容量将内存划分为等大小的两块。每次只使用其中一块,当这一块内存满后将尚存活的对象复制到另一块上去,把已使用的内存清掉。
(3)标记整理算法:标记阶段和标记清除算法相同,标记后不是清理对象,而是将存活对象移向内存的一端。然后清除端边界外的对象。
(4)分代收集算法:新生代采用复制算法,老年代采用标记复制算法
3.5 TCP和UDP
- TCP提供面向连接的、可靠的数据流传输;
UDP提供的是非面向连接的、不可靠的数据流传输。 - TCP传输单位称为TCP报文段;
UDP传输单位称为用户数据报。 - TCP注重数据安全性;
UDP数据传输快,因为不需要连接等待,少了许多操作,但是其安全性一般。
四、代码题
4.1 反转链表
public static class Node {
public int data;
public Node next;
public Node(int data) {
this.data = data;
}
}
public static Node reverseList(Node node) {
Node pre = null, next = null;
while (node != null) {
next = node.next;
node.next = pre;
pre = node;
node = next;
}
return pre;
}