那些让面试官直呼内行的Java知识点

Posted 负债程序猿

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了那些让面试官直呼内行的Java知识点相关的知识,希望对你有一定的参考价值。

接上一篇 那些让面试官直呼内行的Java知识点(一)

其实此系列并非全是Java知识点,但都是作为Java语言开发者应该掌握的,好兄弟不骗好兄弟~

1、mysql中char和varchar有什么区别?

都是用来存字符串,但是:

  • char长度固定,最大长度255,实际长度小于设置长度时用空格补齐,举个栗子,char(5),如果你实际存的字符串是"abc",那么mysql在存储时会在abc后面加两个空格来补齐,即"a b c _ _",在你拿数据时,这两个空格又会被抹去,你得到的数据依然是abc三个字符;适合用来存身份证号、手机号等固定长度的数据;
  • varchar长度不固定,设置的长度是指最大长度,最大65535,存多少就是多少,如varchar(100),只要长度小于100的字符串都能存进去,字符串多长就用多长,不会追加空格;

2、java里Integer的最大值是多少?最大值+1等于多少?

最大值是2的31次方-1,即2147483647

最大值+1等于-2147483648

3、java是怎么保证finally里面的代码能够顺利执行的?

编译器在编译的时候,会把finally里面的代码复制多份,分别放在try和catch内所有能够正常执行以及异常执行逻辑的出口处,最直观的就是我们可以在字节码文件里看到很多份finally内部代码;
如下面这段代码

4、关于mybatis的缓存机制

mybatis有一级缓存和二级缓存

  • 一级缓存作用于单个session,默认开启,无需手动使用;
  • 二级缓存作用于整个mapper,默认开启,但需要手动使用;

如何使用二级缓存:在你的*Mapper.xml文件中添加cache标签即可,如下图

5、导致线程阻塞的原因有哪些?

  • 主动调用Thread.sleep(1000)方法:暂时放弃对cpu的使用,不会释放锁,睡眠时间到了后直接进入就绪态,拿到cpu时间片立即执行;
  • 主动调用Thread.yield()方法:向调度系统表明当前线程愿意放弃其对处理器的使用;
  • 遇到Object类的wait()方法:放弃当前持有的锁,进入等待状态,直到有其他线程将其唤醒;
  • 遇到Thread类的join()方法:当线程t调用在当前线程内部调用join时,当前线程会陷入阻塞,直到线程t执行完;
  • cpu时间片用完:线程调度是由操作系统控制,同一个系统里面线程那么多,cpu不可能只执行你这一个线程,所以每个线程在执行前都需要先拿到cpu时间片,用完后进入就绪态,再次拿到时间片即可开始执行;

6、java如何实现 “一次编译、处处运行” ?

当然是靠jvm啦~

我们敲的代码最终都会被编译成字节码,对项目打包其实打包的也是字节码;
而Java程序(Java程序其实就是一个字节码包)运行需要依赖jvm环境,不管什么平台,jvm规范都是同一套,所以我们的Java程序只要打包成字节码后,不管在哪里运行效果都是一样的

7、mysql事务有哪些特性?

mysql事务有ACID四大特性,我直接借用《高性能mysql》中的原话吧(网上这方面的资料多如牛毛,送兄弟们一句话,这些纯文字性的概念最好还是看官方的,因为每个人理解都不一样,我把我理解的内容讲给你听,你最后听到的可能并不是我想让你听到的,消息在传递过程中很容易失真,自己理解的才是最原始的,别听网上那些叼毛胡说)

下面这个转账场景是很经典、很能阐述事务特性的例子,好好捋捋


8、mybatis插入一条数据,怎么获得这条数据的id?

比如你插入一个user对象

userMapper.insert(User user);

在insert标签上加个配置

<insert id="insert" parameterType="User" keyProperty="id" useGeneratedKeys="true">

然后 新插入user的id会赋到你传入的user对象,通过user.getId()就能拿到了

当然 你先insert进去再select出来拿id也不是不行

9、redis如何管理过期的key?

redis采用 定期 + 惰性 删除的方式来管理key

redis会周期性地扫描当前所有key,发现过期的立即清除,这招叫 定期删除;
但是这样有个问题,扫描间隔太长的话,可能导致某些key多存活一个周期;太短的话,又会很影响性能,所以除了定期扫描,redis在使用某个key时会先校验key是否过期,如果过期直接删除,这招叫 惰性删除

10、什么是逻辑删除?有什么优缺点?

逻辑删除是指在删除数据库中数据时,通过修改一个额外字段来标识该数据是否被删除,而不真正从磁盘上删除数据

如下,0表示未删除,1表示已删除,查询时只需要判断是0还是1就知道该数据是否已删除

拿mysql来讲

优点:

1、当数据量大了以后,删除数据会造成b+树重排序,如果删除操作频繁会很影响mysql整体性能,有好兄弟肯定想说,插入也会导致重排序啊,但是插入我们避免不了的呀;
2、数据留着万一以后想做点统计啥的就很方便;

缺点:

1、数据量大了以后,很影响查询性能;
2、占用磁盘空间

优缺点五五开吧,实际开发中还是看业务需要


如文中有错,请及时指出~

ok我话说完

以上是关于那些让面试官直呼内行的Java知识点的主要内容,如果未能解决你的问题,请参考以下文章

死磕这50道MySQL面试题,阿里面试官直呼内行(上)

手写HashMap,快手面试官直呼内行

手写HashMap,快手面试官直呼内行

手写HashMap,快手面试官直呼内行

为什么要用HashMap?这样回答面试官直呼内行手撕HashMap系列

java并发面试题,看完直呼内行