字符串拼接:请用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则可以省去。

com.netflix.feign

feign-core

8.18.0

com.netflix.feign

feign-jackson

8.18.0

com.netflix.feign

feign-okhttp

8.18.0

我们需要创建一个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]

[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]

其他的用法

早在Spring3里就已经使用了模板方法来简化http请求的开发,使用RestTemplate不仅可以使用java8的lambda表达式,还可使用消息转换器直接将返回值转成对象的形式,更友好的实现了面向对象编程。当然feign更简洁,并且提供了高可用的支持。

java 经典语录_JavaSpring过时的经典语录相关推荐

  1. 儒林外史每回概括简短10字_早安心语正能量经典短句 一句话的简短励志语录

    1.人生就两件事, 一件是拿事儿把时间填满,另一件是拿感觉把心填满 .早安! 早安心语正能量经典短句 一句话的简短励志语录 点击添加图片描述(最多60个字) 2.凭着一股子信念往前冲,到哪儿都是优秀的 ...

  2. 重拾java基础知识总结(超级经典)

    Java基础知识总结(超级经典) 写代码: 1,明确需求.我要做什么? 2,分析思路.我要怎么做?1,2,3. 3,确定步骤.每一个思路部分用到哪些语句,方法,和对象. 4,代码实现.用具体的java ...

  3. 毕向东—Java基础知识总结(超级经典)

    Java基础知识总结(超级经典) 写代码: 1,明确需求.我要做什么? 2,分析思路.我要怎么做?1,2,3. 3,确定步骤.每一个思路部分用到哪些语句,方法,和对象. 4,代码实现.用具体的java ...

  4. 用Java写有关早上的语录,关于早上的励志语录

    早上起来的时候,可以用一些唯美的励志语录来激励自己.以下就是小编整理的[关于早上的励志语录 句句经典]关于早上的励志语录(珍藏篇),欢迎持续关注我们的后续更新.本文来自语录大全网! 1.[天亮了,完美 ...

  5. Java基础知识总结(逆天经典)

    Java基础知识总结(超级经典) 写代码: 1,明确需求.我要做什么? 2,分析思路.我要怎么做?1,2,3. 3,确定步骤.每一个思路部分用到哪些语句,方法,和对象. 4,代码实现.用具体的java ...

  6. 50本永不过时的经典计算机书籍

    跳转到内容 50本永不过时的经典计算机书籍 50本永不过时的经典计算机书籍Twitter Facebook Google+ Pinterest Tumblr 来源:aboutgreatbooks.co ...

  7. 我收藏的罗永浩语录MP3(老罗语录)

    我收藏的罗永浩语录MP3(老罗语录) 列表: 1.老罗语录_email 2.老罗语录_ending 3.老罗语录_HappyAccident 4.老罗语录_LasVigas的离婚通道 5.老罗语录_s ...

  8. [转]QQ经典签名100句 - [绝对经典]

    QQ经典签名100句 - [绝对经典] 转自:http://www.digqq.com/show.php?tid=335 1.树不要皮,必死无疑;人不要脸,天下无敌 2.骚归骚,骚有骚的贞操;贱归贱, ...

  9. 数字IC经典电路(4)——经典滤波器的实现(滤波器简介及Verilog实现)

    数字IC经典电路(4)-经典数字滤波器(滤波器简介及verilog实现) 写在前面的话 数字滤波器分类 经典数字滤波器 FIR滤波器 FFT-FIR滤波器 并行FIR滤波器 串行FIR滤波器 CIC滤 ...

最新文章

  1. 银行软件开发实习生_如何找到学生的软件开发人员实习生
  2. java设计模式-代理模式初探
  3. 晶闸管有几个pn结_晶闸管的电路符号和图片识别
  4. Java 8 中 Date与LocalDateTime、LocalDate、LocalTime互转
  5. java线程死锁 cpu 100%_一文学会Java死锁和CPU 100% 问题的排查技巧
  6. java虚拟机内存监控_深入理解JVM虚拟机9:JVM监控工具与诊断实践
  7. 【转】Apache 配置虚拟主机三种方式
  8. docker存储--理解镜像文件系统aufs/device mapper、主机存储共享、容器间存储共享、分布式存储Flocker
  9. sql server 缓存_深入了解SQL Server缓冲区缓存
  10. 确认过眼神,你是要来百度AI开发者实战营深圳站的人
  11. 关于有偿提供拼图响应式后台的通知.
  12. Linux的版本可分为,Linux不同分类标准下的各种版本解读
  13. 深入了解 HTML 5
  14. 图片放大后很模糊怎么办?
  15. 史上最完整的Android开发工具集合(附带下载地址)
  16. Thinkpad E430c 无线开关
  17. 英语口语收集(十九)
  18. 木兰开源许可证:开源社如是说
  19. 运维工程师手把手教你提高网站的安全性
  20. python爬虫(五)---斗鱼主播图片下载并重命名

热门文章

  1. suface怎么把计算机放到桌面,快速使用Surface的八条技巧
  2. 深度学习框架TensorFlow(4.Fetch and Feed)
  3. VTK:参数对象用法实战
  4. VTK:二次曲面用法实战
  5. wxWidgets:wxRegKey 类演示
  6. wxWidgets:wxResourceTranslationsLoader类用法
  7. wxWidgets:wxMouseCaptureLostEvent类用法
  8. boost::leaf::exception用法的测试程序
  9. boost::fusion::all用法的测试程序
  10. ITK:创建样本测量列表