ArrayList的初始化容量为10,在新增元素的时候,会判断当前容量是否充足,充足则不进行扩容,
不充足则计算扩容的容量,为当前旧容量+旧容量左移一位,即当前旧容量的1.5倍,然后将元素拷贝至新数组
Jdk1.7 数组 + 链表
Jdk1.8 数组 + 链表 + 红黑树
IdentityHashMap
TreeMap
ConcurrentHashMap
1.继承Thread类
2.实现Runnable
3.实现Callable
4.使用线程池ThreadPoolExecutor
5.使用Future
6.使用CompletableFuture
1.Runnable没有返回值,Callable有返回值
2.Runnable不能抛出异常,Callable可以获取到异常
将任务放在FutureTask中,启动线程后get出来,代码如下
public class CallableTest {
public static class CallerTask implements Callable<String> {
@Override
public String call() throws Exception {
return "caller task";
}
}
public static class CallerExceptionTask implements Callable<String> {
@Override
public String call() throws Exception {
throw new RuntimeException("caller task throw exception");
}
}
public static void main(String[] args) {
//创建异步任务
FutureTask<String> futureTask = new FutureTask<>(new CallerExceptionTask());
//启动线程
new Thread(futureTask).start();
String s = null;
try {
s = futureTask.get();
} catch (InterruptedException | ExecutionException e) {
e.printStackTrace();
}
System.out.println("异步任务返回值:" + s);
}
}
使用valotile关键字
1.sleep方法不会释放锁,wait方法会释放锁
2.sleep方法是Thread类中的,wait方法是Object类中
3.sleep方法到了时间会自动唤醒,wait方法需要notify或者notifyAll唤醒
4.sleep方法需要try catch ,而wait方法不需要
5.sleep方法可以在方法内任意位置,wait方法必须同步代码块里
Java堆、方法区(元空间)、Java虚拟机栈、本地方法栈、程序计数器
Java字节码执行的行号指示器,涉及到线程切换时记录当前线程执行到哪了
应用类加载器、扩展类加载器、启动类加载器
在加载一个类时,首先委托自己的父类加载器进行加载
1.字段数据区分度不高
2.索引坏掉
3.like查询使用左模糊
4.建立了复合索引,但查询条件没有以复合索引的第一个字段开始
5.查询列使用了函数
6.查询列使用了运算
使用Explain关键字查看SQL语句
本文系作者在时代Java发表,未经许可,不得转载。
如有侵权,请联系nowjava@qq.com删除。