Java&Spring过时的经典语录
字符串拼接:请用StringBuffer代替String直接相加提高性能
过去的理论
有没有人告诉过你开发中不要
String newString = "牛郎"+"织女";
而是要根据是否线程安全采用
String newString = new StringBuffer("牛郎").append("织女").toString();
或者
String newString = new StringBuilder("牛郎").append("织女").toString();
因为使用过程中会创建多个字符串对象,而String内部是一个固定长度的字符串数组,所以采用这种方法会浪费内存。
更新的理论
在jdk8之前,+拼接底层使用的是concat做字符串拼接就是说:
String newString = "牛郎"+"织女";
等价于
String newString = "牛郎".concat("织女");
String#concat底层将要拼接的字符串以数组的形式复制到一个新数组中,空间开销确实大。但是jdk8对+的拼接底层做了优化:
编译期会把所有的可以final的字符串合成一个字符串。原理就和一般人会用
final long dayInMillisecond = 24*3600*1000;
来代替直接将后面的值计算出来,因为这样更直观,执行期效率是一样的。
而对于需要动态拼接的,会内部转成StringBuilder处理。所以对于动态字符串一般来说效果是一样的,对于静态效率反而高些。
但是凡事都有特例,也有jdk处理不够智能的地方。但是根据java的走势来说,符合:简单即正义。长远来说,越简单的写法越是jdk优化的重点,效率还会有提升的空间。
其他的用法
除了一般的字符串拼接,有时候还需要将列表等一些集合用符号(比如,)连接起来,java8以上提供了StringJoiner来完成这件事。比如list拼接:
Lists.newArrayList("迢迢牵牛星",
"皎皎河汉女")
.stream().collect(Collectors.joining(","));
底层用的就是StringJoiner。
如果使用google的guava的话,这种情况还有更简单的写法:
Joiner.on(",").join(Lists.newArrayList("迢迢牵牛星","皎皎河汉女"));
它底层用的是StringBuilder和StringJoiner底层是一样的。
面试简述SpringMVC的工作原理
过去的理论
记得2015年前面试必备的一道题,面试者需要像小时候背《咏鹅》一样倒背如流:SpringMVC的工作原理。经典回答是这样:

SpringMVC 框架是以请求为驱动,围绕 Servlet 设计,将请求发给控制器,然后通过模型对象,分派器来展示请求结果视图。
更新的理论
早在Spring3里就封装好了RESTful风格开发方式,开发者只需要将请求的Controller替换成RestController或者方法上加上@ResponseBody即可。
目前在前后端分离的场景下,经典的SpringMVC中请求流程基本不全用上。
Spring提供了两种方法将资源的Java表述形式转换为发送给客户端的表述形式:内容协商和消息转换器。
内容协商就是经典的方法,当控制器的处理方法完成时,返回一个逻辑视图。内容协商是一个特殊的视图解释器。
消息转换提供了一种更为直接的方式,DispatcherServlet不再需要那么麻烦地将模型数据传送到视图中。只是控制器产生数据给消息转换器后就直接返回给客户端了。
使用HttpClient还是OkHttp来做http请求
过去的理论
有没有人告诉过你使用OkHttp来代替HttpClient更简洁高效。OkHttp使用build模式创建对象,而且在发送异步请求的时候不需要引入其他的依赖。
更新的理论
在基于Spring的JAVA服务端开发中一般会使用各种框架帮我们去完成各种单调重复的工作,比如不管是HttpClient还是OkHttp都需要将返回的reponse自己用编解码工作转成对象再处理。但是如果使用feign则可以省去。
<dependency>
<groupId>com.netflix.feign</groupId>
<artifactId>feign-core</artifactId>
<version>8.18.0</version>
</dependency>
<dependency>
<groupId>com.netflix.feign</groupId>
<artifactId>feign-jackson</artifactId>
<version>8.18.0</version>
</dependency>
<dependency>
<groupId>com.netflix.feign</groupId>
<!--这里也可以换成feign-httpclient-->
<artifactId>feign-okhttp</artifactId>
<version>8.18.0</version>
</dependency>
我们需要创建一个bean来指定url和处理超时重试、
日志打印等高可用方面的问题。
@Bean
public TestHttpService testHttpService() {
TestHttpService service = Feign.builder()
.encoder(new JacksonEncoder())
.decoder(new JacksonDecoder())
.options(new Request.Options(1000, 3500))
.retryer(new Retryer.Default(5000, 5000, 3))
.logger(logger)
.logLevel(Logger.Level.FULL)
.target(TestHttpService.class, testUrl);
return service;
}
Spring的简化开发主要是使用了声明式代替命令式,
在http请求这里当然也可以这么用:
public interface TestHttpService {
    @RequestLine("GET /xxxx?appkey={appkey}&ips={ip}&username={username}&operator={operator}")
    Response getTest(@Param(value = "appkey") String appkey,
                                       @Param(value = "ip") String ip,
                                       @Param(value = "username") String username,
                                       @Param(value = "operator") String operator);
}
运行一下,发现执行过程这么清晰:
[TestHttpService] ---> GET http://xxx/x?appkey=x&ips=x&username=x&operator=x HTTP/1.1
[TestHttpService] ---> END HTTP (0-byte body)
[TestHttpService] <--- HTTP/1.1 200 OK (154ms)
[TestHttpService] connection: keep-alive
[TestHttpService] content-length: 28
[TestHttpService] content-type: application/json;charset=utf-8
[TestHttpService] date: Sun, 29 Mar 2020 02:19:43 GMT
[TestHttpService] m-traceid: -264385071732215405
[TestHttpService] server: openresty
[TestHttpService] version: oceanus
[TestHttpService]
[TestHttpService] {"data":[],"isSuccess":true}
[TestHttpService] <--- END HTTP (28-byte body)
其他的用法
早在Spring3里就已经使用了模板方法来简化http请求的开发,使用RestTemplate不仅可以使用java8的lambda表达式,还可使用消息转换器直接将返回值转成对象的形式,更友好的实现了面向对象编程。当然feign更简洁,并且提供了高可用的支持。
Java&Spring过时的经典语录的更多相关文章
- 《Spring 5官方文档》 Spring AOP的经典用法
		原文链接 在本附录中,我们会讨论一些初级的Spring AOP接口,以及在Spring 1.2应用中所使用的AOP支持. 对于新的应用,我们推荐使用 Spring AOP 2.0来支持,在AOP章节有 ... 
- 从零开始学 Java - Spring 集成 Memcached 缓存配置(二)
		Memcached 客户端选择 上一篇文章 从零开始学 Java - Spring 集成 Memcached 缓存配置(一)中我们讲到这篇要谈客户端的选择,在 Java 中一般常用的有三个: Memc ... 
- 从零开始学 Java - Spring 集成 ActiveMQ 配置(一)
		你家小区下面有没有快递柜 近两年来,我们收取快递的方式好像变了,变得我们其实并不需要见到快递小哥也能拿到自己的快递了.对,我说的就是类似快递柜.菜鸟驿站这类的代收点的出现,把我们原来快递小哥必须拿着快 ... 
- 从零开始学 Java - Spring 集成 Memcached 缓存配置(一)
		硬盘和内存的作用是什么 硬盘的作用毫无疑问我们大家都清楚,不就是用来存储数据文件的么?如照片.视频.各种文档或等等,肯定也有你喜欢的某位岛国老师的动作片,这个时候无论我们电脑是否关机重启它们永远在那里 ... 
- 从零开始学 Java - Spring 集成 ActiveMQ 配置(二)
		从上一篇开始说起 上一篇从零开始学 Java - Spring 集成 ActiveMQ 配置(一)文章中讲了我关于消息队列的思考过程,现在这一篇会讲到 ActivMQ 与 Spring 框架的整合配置 ... 
- 从零开始学 Java - Spring 支持 CORS 请求踩的坑
		谁没掉进过几个大坑 记得好久之前,总能时不时在某个地方看到一些标语,往往都是上面一个伟人的头像,然后不管是不是他说的话,下面总是有看起来很政治正确且没卵用的屁话,我活到目前为止,最令我笑的肚子痛得是下 ... 
- 从零开始学 Java - Spring MVC 实现跨域资源 CORS 请求
		论职业的重要性 问:为什么所有家长都希望自己的孩子成为公务员? 答:体面.有权.有钱又悠闲. 问:为什么所有家长都希望自己的孩子成为律师或医生? 答:体面.有钱.有技能. 问:为什么所有家长都不怎么知 ... 
- 从零开始学 Java - Spring AOP 实现用户权限验证
		每个项目都会有权限管理系统 无论你是一个简单的企业站,还是一个复杂到爆的平台级项目,都会涉及到用户登录.权限管理这些必不可少的业务逻辑.有人说,企业站需要什么权限管理阿?那行吧,你那可能叫静态页面,就 ... 
- 从零开始学 Java - Spring AOP 实现主从读写分离
		深刻讨论为什么要读写分离? 为了服务器承载更多的用户?提升了网站的响应速度?分摊数据库服务器的压力?就是为了双机热备又不想浪费备份服务器?上面这些回答,我认为都不是错误的,但也都不是完全正确的.「读写 ... 
随机推荐
- IP 数据报
			IP 数据报 1.IP 数据报的格式 一个 IP 数据报由首部和数据两部分组成.(数据报也可以说是数据包) 首部的前一部分是固定长度,共 20 字节,是所有 IP 数据报必须具有的. 在首部的固定部分 ... 
- java反序列化-ysoserial-调试分析总结篇(4)
			1.前言 这篇文章继续分析commoncollections4利用链,这篇文章是对cc2的改造,和cc3一样,cc3是对cc1的改造,cc4则是对cc2的改造,里面chained的invoke变成了i ... 
- APPium+Python+iOS屏幕滑动方法对比
			最近在学习appium自动化,对iOS手机进行滑动操作进行总结: 1.mobile:scroll;该方法在实际使用调用时,会滚动2次.执行时间很长. 向下滚动整个屏幕driver.execute_sc ... 
- pip install mysqlclient报错(OSError: mysql_config not found)
			报错截图 一般情况是系统没有安装libmysqld-dev 执行 sudo apt install libmysqld-dev完成安装后再 pip install mysqlclient就可以了(系统 ... 
- javascript简单轮播图
			**轮播图实现原理: 通过多张图片平铺,用overflow:hidden只显示一张图片.其他的隐藏,无缝滚动用定时器改变元素的left值让图片呈现左右滚动的效果.** HTML布局和内容: 1.容器c ... 
- 前端每日实战:145# 视频演示如何用纯 CSS 创作一个电源开关控件
			效果预览 按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以全屏预览. https://codepen.io/comehope/pen/PdMyJd 可交互视频 此视频是可 ... 
- 面向web前端及node开发人员的vim配置
			鉴于 window 下基本用不到 vim,所以下面内容不再提及 window,具体可以在相应 github 中查看手册操作基础:已装有上有 nodejs(npm).没装的可以移步官网:https:// ... 
- JavaScript的函数(一)
			,1,在javascript中,函数即对象.函数里面的参数可以是个函数,例如: data.sort(function(a,b){return a-b;}) 函数的返回值,return语句导致函数停止执 ... 
- 对javaweb项目中web.xml重用配置的理解(个人学习小结)
			<!-- 所有的总结描述性与语言都在注释中 --><?xml version="1.0" encoding="UTF-8"?> < ... 
- [每日一题系列] LeetCode 1013. 将数组分成和相等的三个部分
			题目: 给你一个整数数组 A,只有可以将其划分为三个和相等的非空部分时才返回 true,否则返回 false. 形式上,如果可以找出索引 i+1 < j 且满足 (A[0] + A[1] + . ... 
