帮公司面试月薪1万6的java程序员,问得都很基础啊
B站就是下面账号
视频可能更有感觉哦
面试的答案在本文章
建议大家先看视频,然后看自己能否回答上
回答不上的回头看看本文章效果更好哦
面试的日子里有程序汪的面试视频和文章,面试不慌了(这广告打的)
这也算模拟面试吧,谢谢大家支持,你没看到视频可能在审批中稍等下下
面试官:String,StringBuffer,StringBuilder的区别
这个面试题有考记性的味道
如果不刷题,你很容易把StringBuffer和StringBuilder搞混
单词比较类似嘛
没办法大家必须背啊
程序汪下楼梯回答:分别从
线程安全
执行效率
存储空间
使用场景
线程安全性:
线程安全 String 、StringBuffer
非线程安全 StringBuilder
执行效率:
StringBuilder > StringBuffer > String
存储空间:
String 的值是不可变的,每次对String的操作都会生成新的String对象,
效率低耗费大量内存空间,从而引起GC。
StringBuffer和StringBuilder都是可变。
使用场景:
1如果要操作少量的数据用 String
2.单线程操作字符串缓冲区 下操作大量数据 = StringBuilder
3.多线程操作字符串缓冲区 下操作大量数据 = StringBuffer
面试官:HashMap的考察
这个面试题很多面试官喜欢问,不管你是什么级别的程序员,都喜欢问
记住不同级别的程序员回答的深度都是不一样的
请不要说这么简单啊,你看看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()判断当前的键是否与表中存在的键相同。
面试官:为什么要设计出迭代器
1.迭代器本质是一种设计模式,为了解决为不同的集合类提供统一的遍历操作接口。
面试官:java单机并发控制
最基础的:
1.同步方法synchronized
2.同步块synchronized
进阶的:
重入锁ReentrantLock
这里不说缓存锁
面试官:多线程创建的方式
1、继承Thread类创建线程
2、实现Runnable接口创建线程
3、实现Callable接口通过FutureTask包装器来创建Thread线程
4、使用ExecutorService、Callable、Future实现有返回结果的线程
一般说出这3种,并把区别说下即可
Thread
Runnable
Callable
面试官:怎么防止前端重复提交?
提交按钮后屏蔽提交按钮(前端js控制)
前端生产唯一id,后端通过唯一索引(简单粗暴,我喜欢)
利用Session防止表单重复提交
程序汪推荐 方法1+方案2 组合套餐万无一失
面试官:SpringAOP的原理
spring实现AOP的思路很简单,
通过预编译方式和运行期动态代理方式实现程序功能的统一维护的一种技术
主要功能:日志记录、性能统计、安全控制、事务处理、异常处理等等
AOP实现方式
预编译:AspectJ
运行期动态代理(JDK动态代理、CGLib动态代理):SpringAOP、JbossAOP
AOP几个相关概念
面向切面的核心思想就是,让核心的业务逻辑代码,不需要去管理一些通用的逻辑,比如说事务,安全等这方面的共同逻辑,解耦业务逻辑和通用逻辑
程序汪建议把 理论+实际应用方式 告诉面试官,虽然你可能没开发过但你一定要把核心概念思想表达出来
SpringAOP后面我专门出篇文章讲,这里简单说下
面试官:批量往mysql导入1000万数据有什么方法?
这个面试题比较高级,面试者没刷过相关面试题或没实际互联网大数据处理经验肯定回答不好
如果1千万条数据一条条插入,肯定会长达几个小时非常慢,
优化数据库插入性能是很有意义的
先不谈什么分库分表设置数据库什么缓存参数
仅仅针对开发层面优化
程序汪的楼梯学习大法
减少IO次数
SQL写法优化
合理设置批量大小
尽量顺序插入
一条SQL语句插入多条数据
在事务中进行插入处理,切记不要1条数据提交一下,肯定要分批处理
数据有序插入,是为了减少索引的维护压力
批量插入SQL例子,Ibatis的小demo
<!-- 批量插入流量模块 -->
<insert id='XXX_表-BATCH-INSERT' parameterClass='java.util.List'>
INSERT INTO
XXX_表(gmt_create,gmt_modified,字段A,字段B,字段C)
VALUES
<iterate conjunction=','>
<![CDATA[
(NOW(),NOW(),#vals[].字段A#,#vals[].字段B#,#vals[].字段C#)
]]>
</iterate>
</insert>
事务
START TRANSACTION; INSERT INTO XXX_表(gmt_create,gmt_modified,字段A,字段B,字段C) VALUES (NOW(),NOW(),#vals[].字段A#,#字段B[].字段C#)... COMMIT;
总结
合并数据+事务+有序数据的优化插入方式
注意SQL批量插入的大小必须合理
事务执行时间不要太长了
实际开发时需要合理设置MYSQL相应配置参数,增加缓存或减少不必要日志磁盘读写