String,StringBuffer,StringBuilder的区别
这个题看是简单,但是不一定能够回答全面,所以基础知识还是得靠记住才是王道!你很容易把StringBuffer和StringBuilder搞混。
分别从下面几个方面回答:
线程安全
执行效率
存储空间
使用场景
线程安全性:
线程安全 String 、StringBuffer
非线程安全 StringBuilder
执行效率:
StringBuilder > StringBuffer > String
存储空间:
String 的值是不可变的,每次对String的操作都会生成新的String对象,
效率低耗费大量内存空间,从而引起GC。
StringBuffer和StringBuilder都是可变。
使用场景:
1如果要操作少量的数据用 String
2.单线程操作字符串缓冲区 下操作大量数据 = StringBuilder
3.多线程操作字符串缓冲区 下操作大量数据 = StringBuffer
Java8 中HashMap的内部结构
这个面试题很多面试官喜欢问,不管你是什么级别的程序员,都喜欢问
记住不同级别的程序员回答的深度都是不一样的,哈哈,看看源码你就知道了。
存储结构
默认容量
装载因子
hashcode/equals
1.7和1.8版本变化
1.内部存储结构:数组+链表+红黑树(JDK8),说道红黑树,有些面试官会继续追问红黑树,后面在详细说明红黑树;
2.默认容量16,默认装载因子0.75。
3.key和value对数据类型的要求都是泛型。
4.key可以为null,放在table[0]中。
5.hashcode:计算键的hashcode作为存储键信息的数组下标用于查找键对象的存储位置。equals:HashMap使用equals()判断当前的键是否与表中存在的键相同。
Java单机并发控制
最基础的:
1.同步方法synchronized
2.同步块synchronized
进阶的:
重入锁ReentrantLock,这里不说缓存锁
多线程创建的方式(线程创建的方式)
1、继承Thread类创建线程
2、实现Runnable接口创建线程
3、实现Callable接口通过FutureTask包装器来创建Thread线程
4、使用ExecutorService、Callable、Future实现有返回结果的线程,即通过线程池创建多线程(jdk5.0后新增的方法)
一般说出这3种,并把区别说下即可
Thread
Runnable
Callable
SpringAOP的原理
spring实现AOP的思路很简单,
-
通过预编译方式和运行期动态代理方式实现程序功能的统一维护的一种技术
-
主要功能:日志记录、性能统计、安全控制、事务处理、异常处理等等
-
AOP实现方式
-
-
预编译:AspectJ
-
运行期动态代理(JDK动态代理、CGLib动态代理):SpringAOP、JbossAOP
-
-
AOP几个相关概念
面向切面的核心思想就是,让核心的业务逻辑代码,不需要去管理一些通用的逻辑,比如说事务,安全等这方面的共同逻辑,解耦业务逻辑和通用逻辑
程序汪建议把 理论+实际应用方式 告诉面试官,虽然你可能没开发过但你一定要把核心概念思想表达出来
批量往mysql导入1000万数据有什么方法?
这个面试题比较高级,面试者没刷过相关面试题或没实际互联网大数据处理经验肯定回答不好
如果1千万条数据一条条插入,肯定会长达几个小时非常慢,
优化数据库插入性能是很有意义的
先不谈什么分库分表设置数据库什么缓存参数
仅仅针对开发层面优化
减少IO次数
SQL写法优化
合理设置批量大小
尽量顺序插入
-
一条SQL语句插入多条数据
-
在事务中进行插入处理,切记不要1条数据提交一下,肯定要分批处理
-
数据有序插入,是为了减少索引的维护压力
总结
-
合并数据+事务+有序数据的优化插入方式
-
注意SQL批量插入的大小必须合理
-
事务执行时间不要太长了
-
实际开发时需要合理设置MYSQL相应配置参数,增加缓存或减少不必要日志磁盘读写