Java面试题十二天

一、Java面试题十二天

1.为什么在阿里巴巴Java开发手册中强制要求使用包装类型定义属性呢?

默认值问题:使用基本数据类型定义属性时,如果没有给属性赋初始值,会使用默认值(如 int 的默认值为 0),而使用包装类型定义属性,如果没有给属性赋初始值,属性的值为 null,这样可以更加清晰地表达属性的状态,在一些业务场景上,null是有实际业务含义的。
拆箱问题:在一些特定场景下,如果使用基本数据类型定义属性,需要进行多次装箱和拆箱操作,这个操作会带来额外的性能开销和代码复杂度。而使用包装类型定义属性,可以避免这个问题,提高代码的效率和可读性。在进行拆箱操作时,如果包装类对象为null,会导致NullPointerException异常。
泛型中只能使用对象:Java 中的泛型中只能使用对象类型,如果要在泛型编程中使用基本类型,就必须使用对应的包装类型。
更多的API:包装类型提供了一些额外方法和属性比如 equals()、hashCode()、toString(),这些方法在某些特定场景中会比较有用。

2.8招让接口性能提升100倍

池化思想

如果你每次需要用到线程,都去创建,就会有增加一定的耗时,而线程池可以重复利用线程,避免不必要的耗时。

比如TCP三次握手,它为了减少性能损耗,引入了Keep-Alive长连接,避免频繁的创建和销毁连接。

拒绝阻塞等待

如果你调用一个系统B的接口,但是它处理业务逻辑,耗时需要10s甚至更多。然后你是一直阻塞等待,直到系统B的下游接口返回,再继续你的下一步操作吗?这样显然不合理

参考IO多路复用模型。即我们不用阻塞等待系统B的接口,而是先去做别的操作。等系统B的接口处理完,通过事件回调通知,我们接口收到通知再进行对应的业务操作即可。

远程调用由串行改为并行

比如设计一个商城首页接口,需要查商品信息、营销信息、用户信息等等。如果是串行一个一个查,那耗时就比较大了。这种场景是可以改为并行调用的,降低接口耗时。

锁粒度避免过粗

在高并发场景,为了防止超卖等情况,我们经常需要加锁来保护共享资源。但是,如果加锁的粒度过粗,是很影响接口性能的。

不管你是synchronized加锁还是redis分布式锁,只需要在共享临界资源加锁即可,不涉及共享资源的,就不必要加锁。

耗时操作,考虑放到异步执行

耗时操作,考虑用异步处理,这样可以降低接口耗时。比如用户注册成功后,短信邮件通知,是可以异步处理的。

使用缓存

把要查的数据,提前放好到缓存里面,需要时,直接查缓存,而避免去查数据库或者计算的过程

提前初始化到缓存

预取思想很容易理解,就是提前把要计算查询的数据,初始化到缓存。如果你在未来某个时间需要用到某个经过复杂计算的数据,才实时去计算的话,可能耗时比较大。这时候,我们可以采取预取思想,提前把将来可能需要的数据计算好,放到缓存中,等需要的时候,去缓存取就行。这将大幅度提高接口性能。

压缩传输内容

压缩传输内容,传输报文变得更小,因此传输会更快。

你可能感兴趣的:(面试题,java,开发语言,设计模式)