那些让面试官直呼内行的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知识点的主要内容,如果未能解决你的问题,请参考以下文章