#软件开发笔面经#7.15北京时间上午十点一面简单自我介绍,讲一下之前接触过的项目,只是简单的介绍了一下项目,没有太深问大概十分钟。-----------------------------开始问些简单八股--------------------------1、讲一下hashcode()和equals()关系 equals()和==有什么区别2、讲一下重载和重写的区别3、讲一下深拷贝、浅拷贝的区别深拷贝会从堆内存中完全复制一个对象,浅拷贝只是复制对象的符号引用,但是浅拷贝对象和原对象共指向同一个内存地址4、讲一下Java异常的基类 运行时异常举几个例子,简单聊一下什么情况下会出现StackOverFlow、ArrayIndexOutOfBoundsException、NullPointerException5、Java并发了解吧 5.1 讲一下 线程的几种状态(new、ready、running、waiting、terminated) 状态间是如何切换的、线程在ready状态能否sleep(不能,因为在ready状态还没有获取到资源,而sleep是线程运行时操作,且不会释放资源) 5.2 sleep 和 wait 的区别,sleep不会释放资源,wait会释放资源6、聊一下锁吧(因为在聊线程并发的时候,我总是提到锁的问题,所以面试官就顺着聊了) 6.1 聊一下 乐观锁 和 悲观锁 CAS 什么原理,属于什么,Java中哪些操作使用了CAS,CAS是否是原子性的,如何规避ABA的问题(这个是我自己提的,但是我忘了怎么解决了,扣分-1) 6.2 聊一下 公平锁 和 非公平锁 自己聊到了 reentrantLock 是怎么实现公平锁和非公平锁的 (参数设置true / false), synchronized 是公平的吗(这里又聊错了扣分-1,synchronized是非公平锁,这意味着在多个线程竞争同一个锁的时候,锁的分配是随机的,不能保证先等待的线程先获得锁) (非公平锁的实现更加简单,不需要维护一个复杂的等待队列和公平调度机制,减少锁实现中的开销) 6.3 聊一下 重入锁(reentrantLock)(没聊明白扣分 -1) 重入锁允许线程在持有锁的情况下再次获取锁而不会被阻塞,重入锁可以防止死锁 6.4 了解死锁吗?如何避免死锁?用什么可以避免死锁?如何解除死锁7、线程池说一下适合什么场景吧,最好结合自己做过的项目举例 聊了一下自己在项目中应用线程池的场景,--------在之前的项目中 MySQL 应该是主要应用数据库吧,来简单聊一下 MySQL---------8、讲一下什么数据适合做 索引 不为 null、差异化大的数据、不经常修改的数据、作为join外键的字段、(面试官还举了他们最近项目的几条数据问适不适合做 索引字段) 8.1 考验最左匹配原则,现在有这样一个联合索引(a,b,c,d) 那么在 查询 where a=2 and b=3 and c > 4 and d = 5这个语句用到了什么索引 (答错了扣分-1) 由于 c 用到了范围查询,因此这里只用到了(a,b,c)联合索引,没有命中d的索引 那么 在 查询 where a in {1,2,3} b = 3 这里用到了什么索引 这里 a 用到了等值查询或IN关键字,因此 b可以命中索引,所以这里是命中了(a,b)索引9、讲一下项目中遇到的慢SQL 是怎么排查的,后面是怎么解决的 EXPLAIN 语句查看是否命中索引,10、SQL事务了解吗,并发情况下会有什么问题 简单介绍一下 SQL 事务隔离级别(那四种)分别解决了什么问题(脏读、不可重复读、幻读)11、来做个简单SQL题 (答错了扣分 -1) 当前有一个表 想要查询 第二高薪资的员工,怎么用一个sql写出来 使用子查询 或 窗口函数------------------差不多还剩二十几分钟了,来做一个简单的算法题----------------用的如流内嵌的代码考验窗口输出 最大值连续子序列 ,O(n) 复杂度的怎么写------------------卡点一小时结束面试,半小时后官网挂了-----------------------