面试浩鲸科技
1.哪些情况不走索引,还有oracle的数据类型隐式转换
测试表 t_test3 , 字段 c1 varchar2(20), 字段上创建了索引
select * from t_test3 where c1=11; -- 结果:观察执行计划,不使用索引,全表扫描,执行的时候做的转换为 (TO_NUMBER("C1")=11)
测试表 t_test4 , 字段 c1 number, 字段上创建了索引
select * from t_test4 where c1=‘11‘; -- 结果:观察执行计划,使用了索引,转换为 "C1"=11
类型转换有隐式和显示
to_char(), to_number(), to_date()
2.redis的持久化方式
有两种AOF和RDB。
AOF就是将修改命令追加到操作日志中,1s同步一次, 当文件很大时,根据现有的内存数据rewrite文件精简变小。性能低,一致性高。
RDB:就是半小时或几小时一次将内存数据快照到文件中。性能高IO少,一致性低
3.redis的数据类型
string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合)
4.concurrentHashMap的实现方式CAS加synchronized
由Node<K,V>[] table数组和链表和红黑树组成
先根据key算出hash值,根据hash值放在数组的某个位置上。若该位置Node为空没有元素,则使用CAS方式尝试添加根据该对象的偏移量判断当前值和期待的值一样则更新成新值。
如果该Node有元素则用synchronize锁定该Node,遍历列表修改或者添加末尾,红黑数的话就添加到树上。
更详细的: https://www.cnblogs.com/zerotomax/p/8687425.html#go0
5.创建线程的方式
(1)使用ThreadPoolExecutor类
public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue) { this(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue, Executors.defaultThreadFactory(), defaultHandler); }
corePoolSize:线程池的核心线程数;
maximumPoolSize:线程池的最大线程数;
keepAliveTime:线程池空闲时线程的存活时长;
unit:线程存活时长大单位,结合上个参数使用;
workQueue:存放任务的队列,使用的是阻塞队列;
threadFactory:线程池创建线程的工厂;
handler:在队列(workQueue)和线程池达到最大线程数(maximumPoolSize)均满时仍有任务的情况下的处理方式;
(2)使用Executors类
本质上是一种方式,都是通过ThreadPoolExecutor类的方式
Java通过Executors提供四种线程池,分别为:
a、newFiexedThreadPool(int Threads):创建固定数目线程的线程池。
b、newCachedThreadPool():创建一个可缓存的线程池,不限制大小,调用execute 将重用以前构造的线程(如果线程可用)。如果没有可用的线程,则创建一个新线程并添加到池中。终止并从缓存中移除那些已有 60 秒钟未被使用的线程。
c、newSingleThreadExecutor()创建一个单线程化的Executor。
d、newScheduledThreadPool(int corePoolSize)创建一个支持定时及周期性的任务执行的线程池,多数情况下可用来替代Timer类。
6.JVM内存模型和垃圾回收机制???
7.数据库索引数据结构
https://blog.csdn.net/bible_reader/article/details/100007292
原文:https://www.cnblogs.com/t96fxi/p/12623716.html