1.ArrayList 与LinkedList的区别
ArrayList底层是数组,LinkedList是双向链表,保存数据是LinkedList的开销比ArrayList大,因为要存储前后节点的地址,相对比来说ArrayList就省了内存了。
插入和删除效率方面,数据量小时,两者区别不大,数据大时,在顶部插入或删除时ArrayList 比LinkedList 慢,在底部插入或删除时反之。
查询效率,ArrayList 比LinkedList 快。
2.sql最左匹配规则
联合索引,只要创建索引时最左的索引字段出现了在where 语句中时,就生效,否则,即使有了除最左以外的其他索引字段,也不会走索引。
3.面向过程与面向对象的区别
java面向对象编程比面向过程的语言性能差,因为java是半编译半解析语言,最终的执行代码不是CPU直接执行的二进制机械码。
为什么说java是半编译半解析语言,因为.java文件需要编译成.class 文件,再由jvm 去解析并运行。
4.重载与重写
先明白这个概念是基本相同的方法名来说的。
重载,同一类内,参数必须不同,其它都可以修改。
重写,子类内,参数,返回值,必须相同,修饰符要大于等于原来权限,异常要小于等于原来。
5.String StringBuffer StringBuilder的区别,为什么String 是不可变的
String 不可变是因为用的final 修饰,常量,不可变所以是多个线程共享的,所以是线程安全的。
StringBuffer 的方法加了同步锁,所以是线程安全的,Builder则没有。
6.volatile关键字的作用
a.保证内存的可见性--共享变量在主内存中,不同的线程有自己的工作内存,volatile保证了他们刷了共享变量后,立即同步刷主内存,避免了线程A对a=0,a+1后,线程B读取时还是a=0的问题。
b.禁止指令重排序--JVM会对非依赖性的代码进行优化排序,某些时候重排序会导致程序走向了非预期的结果。
c.不保证原子性