内容提要
文章指出,部分Java与Spring经典面试理论已过时:JDK8后字符串“+”拼接已优化,无需强制使用StringBuffer;SpringMVC在前后端分离场景下多用消息转换器;HTTP请求可用Feign、RestTemplate替代HttpClient或OkHttp,声明式开发更简洁高效。
延伸解读
字符串拼接:从“强制优化”到“信任编译器”
文章指出,JDK8之前“+”拼接底层使用concat,确实可能产生额外对象开销,因此旧理论建议改用StringBuffer或StringBuilder。但JDK8对“+”做了编译期优化:静态字符串直接合并,动态拼接则自动转为StringBuilder处理。这意味着多数场景下,直接使用“+”与手动拼接性能相当,静态拼接甚至更优。开发者应更关注代码简洁性,而非过早进行手动优化。
SpringMVC面试题:前后端分离下的视角转换
经典SpringMVC工作原理强调DispatcherServlet、控制器、视图解析器等完整流程,但文章提醒,在前后端分离场景中,控制器通常直接返回数据而非逻辑视图。Spring提供内容协商和消息转换器两种方式,后者让DispatcherServlet不再需要将模型数据传送到视图,控制器产生数据后直接经消息转换器返回客户端。因此,面试或学习时应理解RESTful风格下流程的简化。
HTTP客户端选型:声明式调用减少样板代码
文章对比了HttpClient、OkHttp与Spring生态中的方案。HttpClient和OkHttp都需要手动处理响应编解码,而RestTemplate借助消息转换器可直接将返回值转为对象,并支持Lambda表达式。Feign则更进一步,通过声明式接口定义HTTP请求,省去手动创建和配置客户端的重复工作,还能集成超时重试、日志打印等高可用特性。在Spring服务端开发中,声明式方案通常更简洁高效。
Q&A
JDK8之后,字符串拼接还需要用StringBuffer吗?
不需要。JDK8对字符串的“+”拼接做了优化:编译期会把所有可以final的字符串合成一个字符串,对于需要动态拼接的会内部转成StringBuilder处理。所以对于动态字符串一般来说效果是一样的,对于静态效率反而高些。
在前后端分离的场景下,SpringMVC的工作原理有什么变化?
在前后端分离的场景下,经典的SpringMVC请求流程基本不全用上。Spring提供了两种方法将资源的Java表述形式转换为发送给客户端的表述形式:内容协商和消息转换器。消息转换提供了一种更为直接的方式,DispatcherServlet不再需要将模型数据传送到视图中,控制器产生数据给消息转换器后就直接返回给客户端。
在Spring项目中,做HTTP请求应该用HttpClient、OkHttp还是Feign?
在基于Spring的Java服务端开发中,一般会使用Feign来简化HTTP请求。Feign可以省去自己编解码的工作,并且通过声明式接口来定义HTTP请求,更简洁高效。RestTemplate也可以使用消息转换器直接将返回值转成对象,但Feign更简洁,并且提供了高可用的支持。
Java中如何将列表用逗号连接成字符串?
Java8以上提供了StringJoiner来完成,比如使用Stream的Collectors.joining(",")。如果使用Google的Guava,可以用Joiner.on(",").join(list),它底层用的是StringBuilder和StringJoiner底层是一样的。
为什么说简单即正义在Java字符串拼接中体现?
因为JDK8对“+”拼接做了优化,使得简单写法在大多数情况下效率不差,甚至静态拼接效率更高。根据Java的走势,越简单的写法越是JDK优化的重点,效率还会有提升的空间。
Feign相比HttpClient和OkHttp有什么优势?
Feign使用声明式接口,省去了自己编解码的工作,并且可以方便地指定URL、处理超时重试、日志打印等高可用方面的问题。它让HTTP请求的执行过程更清晰,代码更简洁。