最近一直在找工作京东 阿里这些都去过好几次的,但是结果都是一样。所以,还是自己能力不行吧,虽然自己觉得答的不那么差。在这里做一个总结吧,我想随着我面试失败次数的增加,文章内容也会不断修改,大公司一般问的干货比较多,话不多说.
1. java自动装箱和拆箱
java将基本数据类型自动转成相对应的对象(int->Integer)叫自动装箱,反之(Integer->int)叫自动拆箱。因为装拆箱动作是JVM完成的,所以是自动。
List<Integer> list =new ArrayList();
list.add(1);//自动装箱称Integer
int val = list.get(0);//自动拆箱
Integer o =2;//自动装箱称Integer
int o2 = o;//自动拆箱
其弊端是在循环过程中容易创建多个Integer对象
Integer i;
for(int j=0;j<100;j++){
j+=1;
}
2. HashMap ,HashTable,ConcurrentHashMap(这几个自己看去)
3. ArrayList 的Fail-Fast机制
Fail-Fast 快速失败的意思。主要是针对多线程情况下对ArrayList的一种错误检测机制。例如:正在迭代ArrayList,同时又在对ArrayList进行操作(add,remove),那么程序就会抛出ConcurrentModificationException。
List<String> l = new ArrayList();
l.add("a");
l.add("b");
l.add("c");
for(String str:l){
System.out.println(str);
l.add("d");
}
解决办法:使用CopyOnWriteArrayList替代,原理:CopyOnWriteArrayList在进行iterator()的时候COWIterator会将ArrayList的数据进行备份。
4. 说一说Executor,Executors,ExescutorService,AbstractExecutorService,ThreadPoolExecutor
ThreadPoolExecutor继承AbstractExecutorService实现ExecutorService继承Executor
Executors用来创建ExescutorService实例
Executor声明void execute()方法。
ExecutorService基于Executor声明了其他方法Future submit()
AbstractExecutorService实现了submit()
ThreadPoolExecutor实现了execute()
5. 异步编程(Future)
同步编程
package com.zhuyang.redeem;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
public class Test {
public static void main(String[] args) throws Exception {
long start = System.currentTimeMillis();
Test t = new Test();
List<Integer> count = new ArrayList();
count.add(t.getNumber());
count.add(t.getNumber());
count.add(t.getNumber());
count.add(t.getNumber());
// 运行4次
int total = 0;
for (int i = 0; i < count.size(); i++) {
total += count.get(i);
}
long end = System.currentTimeMillis();
System.out.println("运算结束 耗时:" + (end - start) + "ms totle:" + total);
System.out.println("退出main线程!");
}
public int getNumber() throws Exception {
Thread.sleep(1000);// 等一秒
return new Random().nextInt(100);
}
}
异步编程
package com.zhuyang.redeem;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.FutureTask;
public class Test {
public static void main(String[] args) throws Exception {
new Test().exec();
}
private void exec() throws InterruptedException, ExecutionException {
long start = System.currentTimeMillis();
List<FutureTask<Integer>> futureTasks = new ArrayList();
ExecutorService executorService = Executors.newFixedThreadPool(10);
Callable<Integer> worker = new Callable<Integer>() {
public Integer call() throws Exception {
Integer res = new Random().nextInt(100);
Thread.sleep(1000);
System.out.println("任务执行:获取到结果 :"+res);
return res;
}
};
for (int i = 0; i < 4; i++) {
// 创建一个异步任务
FutureTask<Integer> futureTask = new FutureTask<Integer>(worker);
futureTasks.add(futureTask);
// 提交异步任务到线程池,让线程池管理任务 特爽把。
// 由于是异步并行任务,所以这里并不会阻塞
executorService.submit(futureTask);
}
int count = 0;
for (FutureTask<Integer> futureTask : futureTasks) {
// futureTask.get() 得到我们想要的结果
// 该方法有一个重载get(long timeout, TimeUnit unit) 第一个参数为最大等待时间,第二个为时间的单位
count += futureTask.get();
}
long end = System.currentTimeMillis();
System.out.println("线程池的任务全部完成:结果为:" + count + ",main线程关闭,进行线程的清理");
System.out.println("使用时间:" + (end - start) + "ms");
// 清理线程池
executorService.shutdown();
}
}
6. Synchronized和ReentrantLock
都可以用于同步,都是重入锁(递归锁,在持有锁的情况下可继续获得自身的锁,不需要等待锁,否则容易造成死锁)。ReentrantLock使用更灵活,必须在finally调用unlock();