1、== 和 equals

基本类型数据:只能用 "=="

基本数据的包装类:"=="判断首地址,"equals"判断内容

String类型:==判断首地址,"equals"判断内容

非字符串变量:"=="和"equals"方法的作用是相同的,都是用来比较其对象在堆内存的首地址(即用来比较两个引用变量是否指向同一个对象)

 

2、数据库索引

数据库 = 检索数据 + 存储数据

一张表可以建立任意多个索引,每个索引可以是任意多个字段的组合
索引可能会提高查询速度(查询时使用了索引)
但一定会减慢写入速度(每次插入时都需要更新索引)

索引只应该加在经常需要搜索的列上,不要加在写多读少的列上

 

3、StringBuffer 和 StringBuilder

StringBuffer安全,底层方法(如append方法)上加了synchronized,效率低

StringBuilder不安全,效率较高

 

4、redis问题简述

缓存雪崩:系统A,高峰期每秒5000个请求,缓存在高峰期可以抗住4000个请求,于是缓存全盘挂了,这5000个请求全部落在数据库上,数据库挂机。

缓存穿透:系统A,高峰期每秒5000个请求,结果其中4000个请求是黑客发起的恶意攻击,缓存中查不到,直接连接数据库,数据库挂机。

缓存击穿:某个KEY非常热点,访问非常频繁,当这个KEY在失效的瞬间,大量请求击穿缓存,数据库挂机。

 

5、join与yield

join:等待线程结束;它会一只阻塞当前线程,直到目标线程执行完毕。

yield:谦让;它会使当前线程让出cpu(注意:让出cpu不代表当前线程不执行了,让出cpu,还会进行cpu资源的争夺,但能否再次被分配到就不一定了)。

 

6、sleep()和wait()的区别

sleep():来自Thread类;不会释放锁;必须捕获异常;

wait():来自Object类;释放所占用的锁;不需要捕获异常。

 

7、JDK四种线程池拒绝策略(RejectedExecutionHandler)

AbortPolicy策略(默认策略):任务添加到线程池失败,抛出RejectedExecutionException异常;

CallerRunsPolicy策略:任务添加到线程池失败,主线程会调用执行器中的execute方法执行任务;

DiscardOledestPolicy策略:任务添加到线程池失败,会将阻塞队列中最早添加的任务删除,并尝试再次添加当前任务,如果失败则不断重试该策略;

DiscardPolicy策略:任务添加到线程池失败,则放弃,并且不会抛出任何异常。

 

8、execute()和submit()的区别

execute()是在JDK的Executor框架的顶级接口Executor中定义的:

void execute(Runnable command) ;

submit()是在Executor接口的子接口ExecutorService中定义的:

Future submit(Callable task);

execute()无返回值;submit()返回值为Future。

execute()无法捕获异常;submit()可以通过Future.get()捕获抛出的异常。

 

9、JDK中的Future模式

 

 

10、Java1.8新特性

 


11、JDK1.8中的Class对象存放在内存的哪块区域?

heap

 

12、Java中的Fork/Join框架

java.util.concurrent.ForkJoinPool
实现于ExecutorService,运用分而治之思想的线程池
实现这个框架需要继承RecursiveTask(有返回值)或者RecursiveAction(无返回值)
核心算法:"工作窃取"

 

posted on 2019-08-26 16:05  huangChang  阅读(104)  评论(0编辑  收藏  举报