两年JAVA程序员面试题(1)
1、sql优化的方法
答:
(1)对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引。
(2)应尽量避免在 where 子句中对字段进行 null 值判断。
(3)应尽量避免在 where 子句中使用!=或<>操作符。
(4)应尽量避免在 where 子句中使用 or 来连接条件。
(5)in 和 not in 也要慎用,否则会导致全表扫描。
(6)下面的查询也将导致全表扫描:
select id from t where name like '%abc%'
(7)应尽量避免在 where 子句中对字段进行表达式操作,这将导致引擎放弃使用索引而进行全表扫描。
(8)应尽量避免在where子句中对字段进行函数操作,这将导致引擎放弃使用索引而进行全表扫描。
(9)不要在 where 子句中的“=”左边进行函数、算术运算或其他表达式运算,否则系统将可能无法正确使用索引。
(10)在使用索引字段作为条件时,如果该索引是复合索引,那么必须使用到该索引中的第一个字段作为条件时才能保证系统使用该索引,否则该索引将不会被使用,并且应尽可能的让字段顺序与索引顺序相一致。
(11)很多时候用 exists 代替 in 是一个好的选择。
2、什么是索引?
答:索引指数据库的目录,比如:字典上面的字母目录 (适用于大数据量)。
3、建立索引的优缺点
答:优点:查询速度快
缺点:增删改慢,因为数据库要同步去维护索引文件,所以速度慢
4、索引有哪些?
答:普通 主键 唯一 组合
5、索引检索为什么快?
答:索引结构:B+Tree
6、一般你们会在什么情况下加索引?
答:(1)主键自动建立唯一索引
(2)频繁作为查询条件的字段应该创建索引
(3)查询中与其他表关联的字段,外键关系建立索引
(4)单键/组合索引的选择问题,组合索引的性价比更高
(5)查询中排序的字段,排序字段若通过索引去访问将大大提高排序速度
(6)查询中统计或者分组字段。
(7)过滤条件好的字段选择一段选择加索引
7、怎么知道索引用没用上?
答:通过explain查询sql执行计划,主要看key使用的是哪个索引
8、用过组合索引吗,是有序的吗?
答:用过, 有序
9、什么情况下会使索引失效?
答:(1)like
(2)like “%123%,前面不能+%
(3)使用 关键字 in ,or ,null,!=
10、什么是事务?
答:事务是访问数据库的一个操作序列,数据库应用系统通过事务集来完成对数据库的存取。
11、事物的四大特性(ACID原则)
答:原子性、一致性、隔离性、持久性。
(1)原子性
即不可分割,事务要么全部被执行,要么全部不执行。如果事务的所有子事务全部提交成功,则所有的数据库操作被提交,数据库状态发生变化;如果有子事务失败,则其他子事务的数据库操作被回滚,即数据库回到事务执行前的状态,不会发生状态转换。
(2)一致性
事务的执行使得数据库从一种正确状态转换成另外一种正确状态。
(3)隔离性
在事务正确提交之前,不允许把事务对该数据的改变提供给任何其他事务,即在事务正确提交之前,它可能的结果不应该显示给其他事务。
(4)持久性
事务正确提交之后,其结果将永远保存在数据库之中,即使在事务提交之后有了其他故障,事务的处理结果也会得到保存。
12、事务的隔离级别
答:读未提交、读已提交、可重复读取、可序化。
(1)读未提交:解决了更新丢失,但还是可能会出现脏读。
(2)读已提交:解决了更新丢失和脏读问题。
(3)可重复读取:解决了更新丢失、脏读、不可重复读、电脑还是会出现幻读。
(4)可序化:解决了更新丢失、脏读、不可重复读、幻读(虚读)。
注意:MYSQL数据库支持上面四种隔离级别,默认为可重复读;ORACLE数据库只支持可序化和读已提交这两种隔离级别,默认为读已提交。
13、ArrayList、LinkedList及Vector的区别
答:ArrayList,Vector 的底层实现是扩容数组(默认初始化大小都是10),而LinkedList的底层实现是双向链表,ArrayList查询快,增删慢,LinkedList则是查询慢,增删快,ArrayList、LinkedList线程不安全,Vector线程安全。(扩容机制)ArrayList扩容后的容量是之前的1.5倍,而Vector默认情况下扩容后的容量是之前的2倍。Vector可以设置容量增量,而ArrayList不可以。
14、Map实现类有哪些?
答:Map是键值对的集合接口,实现类主要包括:HashMap、TreeMap、Hashtable、LinkedHashMap。
注意:HashMap是无序的,LinkedHashMap和TreeMap都是有序的。 LinkedHashMap底层存储结构是哈希表+链表,链表记录了添加数据的顺序。TreeMap底层存储结构是二叉树,二叉树的中序遍历保证了数据的有序性。LinkedHashMap有序性能比较高,因为底层数据存储结构采用的哈希表。
15、HashMap和HashTable的区别
答:HashMap只允许一条记录的key值为null,允许多条记录的value为null,而 HashTable的key和value的值均不允许为null。HashMap不是线程安全的,而HashTable是线程安全的(各个方法上添加了synchronized关键字)。
16、如何实现线程安全的HashMap
答:两种方法,通过collections.synchronizedMap()方法包装hashmap对象返回一个新的线程安全的Map;改写HashMap,ConcurrentHashMap。
17、JAVA8新特性有哪些?
答:(1)Lambda表达式(2)方法引用(3)函数式接口(4)默认方法(5)Stream(流Stream)(6)DateTimeAPI(7)Optional类(8)Nashorn javascript引擎。
18、创建线程池的方法有哪些?
答:四种,newCachedThreadPool创建可缓存线程池、newFixedThreadPool创建指定工作线程数量线程池、newScheduledThreadPool创建定长线程池、newSingleThreadExecutor创建单线程化线程池。
19、线程池的七个参数有哪些及作用?
答:(1)corePoolSize线程池核心线程大小(最小线程数量)
(2)maximumPoolSize线程池最大线程数量
(3)KeepAliveTime空闲线程存活时间
(4)Unit空闲线程存活时间单位
(5)WorkQueue工作队列(四种工作队列:ArrayBlockingQueue基于数组的有界阻塞队列、LinkedBlockingQueue基于链表的无界阻塞队列,其实最大容量为Interger.MAX、SynchronousQueue一个不缓存任务的阻塞队列、PriorityBlockingQueue具有优先级的无界阻塞队列)
(6)ThreadFactory线程工厂
(7)handler拒绝策略
20、JVM内存组成
答:JVM主要管理两种类型的内存:堆和非堆。
JVM内存结构:栈、堆、方法区、程序计数器、本地方法栈。