字符串拼接:请用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过时的经典语录的更多相关文章

  1. 《Spring 5官方文档》 Spring AOP的经典用法

    原文链接 在本附录中,我们会讨论一些初级的Spring AOP接口,以及在Spring 1.2应用中所使用的AOP支持. 对于新的应用,我们推荐使用 Spring AOP 2.0来支持,在AOP章节有 ...

  2. 从零开始学 Java - Spring 集成 Memcached 缓存配置(二)

    Memcached 客户端选择 上一篇文章 从零开始学 Java - Spring 集成 Memcached 缓存配置(一)中我们讲到这篇要谈客户端的选择,在 Java 中一般常用的有三个: Memc ...

  3. 从零开始学 Java - Spring 集成 ActiveMQ 配置(一)

    你家小区下面有没有快递柜 近两年来,我们收取快递的方式好像变了,变得我们其实并不需要见到快递小哥也能拿到自己的快递了.对,我说的就是类似快递柜.菜鸟驿站这类的代收点的出现,把我们原来快递小哥必须拿着快 ...

  4. 从零开始学 Java - Spring 集成 Memcached 缓存配置(一)

    硬盘和内存的作用是什么 硬盘的作用毫无疑问我们大家都清楚,不就是用来存储数据文件的么?如照片.视频.各种文档或等等,肯定也有你喜欢的某位岛国老师的动作片,这个时候无论我们电脑是否关机重启它们永远在那里 ...

  5. 从零开始学 Java - Spring 集成 ActiveMQ 配置(二)

    从上一篇开始说起 上一篇从零开始学 Java - Spring 集成 ActiveMQ 配置(一)文章中讲了我关于消息队列的思考过程,现在这一篇会讲到 ActivMQ 与 Spring 框架的整合配置 ...

  6. 从零开始学 Java - Spring 支持 CORS 请求踩的坑

    谁没掉进过几个大坑 记得好久之前,总能时不时在某个地方看到一些标语,往往都是上面一个伟人的头像,然后不管是不是他说的话,下面总是有看起来很政治正确且没卵用的屁话,我活到目前为止,最令我笑的肚子痛得是下 ...

  7. 从零开始学 Java - Spring MVC 实现跨域资源 CORS 请求

    论职业的重要性 问:为什么所有家长都希望自己的孩子成为公务员? 答:体面.有权.有钱又悠闲. 问:为什么所有家长都希望自己的孩子成为律师或医生? 答:体面.有钱.有技能. 问:为什么所有家长都不怎么知 ...

  8. 从零开始学 Java - Spring AOP 实现用户权限验证

    每个项目都会有权限管理系统 无论你是一个简单的企业站,还是一个复杂到爆的平台级项目,都会涉及到用户登录.权限管理这些必不可少的业务逻辑.有人说,企业站需要什么权限管理阿?那行吧,你那可能叫静态页面,就 ...

  9. 从零开始学 Java - Spring AOP 实现主从读写分离

    深刻讨论为什么要读写分离? 为了服务器承载更多的用户?提升了网站的响应速度?分摊数据库服务器的压力?就是为了双机热备又不想浪费备份服务器?上面这些回答,我认为都不是错误的,但也都不是完全正确的.「读写 ...

随机推荐

  1. JMeter-接口测试之数据驱动

    前言 之前我们的用例数据都是配置在Http 请求中,每次需要增加,修改用例都需要打开 jmeter 重新编辑,当用例越来越多的时候,用例维护起来就越来越麻烦,有没有好的方法来解决这种情况呢?我们可以将 ...

  2. 利用virtualenvwrapper创建虚拟环境出现错误“/usr/bin/python: No module named virtualenvwrapper”

    Linux:CentOS7 python: 系统默认python版本2.7,利用python启动 自己安装python版本3.8,利用python3启动 问题描述: 在上述环境中利用virtualen ...

  3. Object-Oriented Programming Summary Ⅳ

    目录 UML单元总结博客 总结本单元两次作业的设计 总结自己在四个单元中架构设计以及OO方法理解的演进 总结自己在四个单元中测试理解与实践的演进 总结自己的课程收获 立足于自己的体会给课程组提三个具体 ...

  4. PAT资料,持续更新中~~~愿诸君共勉

    <算法笔记>胡凡著,<算法笔记-上机实战训练指南>胡凡著 <经典算法大全> <C陷阱与缺陷> <C程序设计语言-K&R> 链接:ht ...

  5. Java 添加、读取、删除Excel文本框

    本文介绍通过Java程序添加文本框到Excel的方法,添加文本框时,可以添加文本.设置文本方向.文本对齐方式.设置文本框大小.位置.填充色/填充图片.文本框旋转角度.文本框名称.可选文本.文本框隐藏或 ...

  6. GO系列 | 5分钟入门GO【译】

    什么是Google Go? Google Go是由Robert Griesmer,Rob Pike和Ken Thompson在Google设计的一种开源编程语言. Go在语法上类似于C语言: 除了内存 ...

  7. 【JAVA进阶架构师指南】之一:如何进行架构设计

    前言   本博客是长篇系列博客,旨在帮助想提升自己,突破技术瓶颈,但又苦于不知道如何进行系统学习从而提升自己的童鞋.笔者假设读者具有3-5年开发经验,java基础扎实,想突破自己的技术瓶颈,成为一位优 ...

  8. 【学习参考】Animate.css动画演示

    学习参考地址: http://www.dowebok.com/demo/2014/98/

  9. 有关KMP算法

    KMP算法: 此算法的本质是首先对于模板字符串进行计算,生成一个数组(next数组),该数组反映了模板字符串的情况. 例: S: ABADACABABCD P: ABAB 当我们查询到P3与S3(B和 ...

  10. 关于pytorch在windows上编辑的问题集合

    cmake在windows上自动寻找v140(VS2015)的编译器,现在只有VS2013的IDE,所以要修改编译器 修改掉VS2015的编译器名称,报错提示参数CMAKE_C_COMPILER和CM ...