锋盈数科-知识库 Logo
首页
软件开发
计算机基础
Hello Halo
新手必读
关于本知识库
登录 →
锋盈数科-知识库 Logo
首页 软件开发 计算机基础 Hello Halo 新手必读 关于本知识库
登录
  1. 首页
  2. 默认分类
  3. Java&Spring过时的经典语录

Java&Spring过时的经典语录

0
  • 默认分类
  • 发布于 2024-09-25
  • 0 次阅读
黄健
黄健

字符串拼接:请用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的工作原理


过去的理论


记得15年前面试必备的一道题,面试者需要像小时候背《咏鹅》一样倒背如流: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更简洁,并且提供了高可用的支持。

标签: #知识库 257
相关文章
最全的办公楼智能化解决方案

最全的办公楼智能化解决方案 2024-10-16 08:40

办公楼综合体智能化如何建设?有哪些系统?近几年,办公楼智能化的项目越来越多,不少项目经理都参与其它,同事办公楼综合体也是弱电系统涉及的最多的项目之一,本期我们一起来看下,最全的办公楼项目智能化设计方案。

规范标准查询、下载网站 2024-10-12 16:41

我们在工作中经常需要用到各种各样的规范标准,这里给大家介绍一些免费查询和下载规范的网站,个人亲测可用。 标准查找查新网站 工标网: http://www.csres.com/ 中国国家标准化管理委员会:http://openstd.samr.gov.cn/bzgk/gb/index 全国标准信息公共

【计算机网络】网络层协议解析 2024-10-08 11:24

网络层的两种服务 IPv4 * 分类编址 划分子网 无分类地址 IPv4地址应用 IP数据报的发送和转发过程 * 主机发送IP数据报 路由器转发IP数据报 IPv4数据报首部格式 ICMP网际控制报文协议 虚拟专用网VPN与

FFmpeg教程(超级详细版) 2024-10-08 11:24

一、参考资料 通过ffmpeg把图片转换成视频 FFmpeg命令(一)、使用filter_complex命令拼接视频 FFmpeg 视频处理入门教程给新手的 20 多个 FFmpeg 命令示例 FFmpeg命令行转码

计算机网络:物理层 —— 数据的传输方式 2024-10-08 11:24

文章目录 * 传输方式 * 串行传输 * 串行传输方式 特点 应用 并行传输 * 特点 应用 网卡的串/并转换 同步传输 * 同步时钟频率的误差问题 特点 应用<

授权码机制 V2.1 2024-10-07 10:26

大家好,我是机灵鹤。 根据读者朋友们反馈的问题和建议,对 授权码 V2.0 版本做了一些优化。 优化内容主要解决了以下几个问题: 优化了授权机制中的时间校验逻辑,避免用户通过回调本地时间来绕过授权机制的问题。 封装和简化了授权接口,开发者可以更方便地接入到自己的程序中。

目录

IT 外包服务商

  • 意见投递
  • zyf6619

软件开发应用

主菜单

  • 首页
  • 软件开发
  • 计算机基础
  • Hello Halo
  • 新手必读
  • 关于本知识库
Copyright © 2024 your company All Rights Reserved. Powered by Halo.