java 经典语录_JavaSpring过时的经典语录
字符串拼接:請(qǐng)用StringBuffer代替String直接相加提高性能
過去的理論
有沒有人告訴過你開發(fā)中不要
String newString = "牛郎"+"織女";
而是要根據(jù)是否線程安全采用
String newString = new StringBuffer("牛郎").append("織女").toString();
或者
String?newString =?new?StringBuilder("牛郎").append("織女").toString();
因?yàn)槭褂眠^程中會(huì)創(chuàng)建多個(gè)字符串對(duì)象,而String內(nèi)部是一個(gè)固定長(zhǎng)度的字符串?dāng)?shù)組,所以采用這種方法會(huì)浪費(fèi)內(nèi)存。
更新的理論
在jdk8之前,+拼接底層使用的是concat做字符串拼接就是說:
String newString = "牛郎"+"織女";
等價(jià)于
String newString = "牛郎".concat("織女");
String#concat底層將要拼接的字符串以數(shù)組的形式復(fù)制到一個(gè)新數(shù)組中,空間開銷確實(shí)大。但是jdk8對(duì)+的拼接底層做了優(yōu)化:
編譯期會(huì)把所有的可以final的字符串合成一個(gè)字符串。原理就和一般人會(huì)用
final long dayInMillisecond = 24*3600*1000;
來代替直接將后面的值計(jì)算出來,因?yàn)檫@樣更直觀,執(zhí)行期效率是一樣的。
而對(duì)于需要?jiǎng)討B(tài)拼接的,會(huì)內(nèi)部轉(zhuǎn)成StringBuilder處理。所以對(duì)于動(dòng)態(tài)字符串一般來說效果是一樣的,對(duì)于靜態(tài)效率反而高些。
但是凡事都有特例,也有jdk處理不夠智能的地方。但是根據(jù)java的走勢(shì)來說,符合:簡(jiǎn)單即正義。長(zhǎng)遠(yuǎn)來說,越簡(jiǎn)單的寫法越是jdk優(yōu)化的重點(diǎn),效率還會(huì)有提升的空間。
其他的用法
除了一般的字符串拼接,有時(shí)候還需要將列表等一些集合用符號(hào)(比如,)連接起來,java8以上提供了StringJoiner來完成這件事。比如list拼接:
Lists.newArrayList("迢迢牽牛星",
"皎皎河漢女")
.stream().collect(Collectors.joining(","));
底層用的就是StringJoiner。
如果使用google的guava的話,這種情況還有更簡(jiǎn)單的寫法:
Joiner.on(",").join(Lists.newArrayList("迢迢牽牛星","皎皎河漢女"));
它底層用的是StringBuilder和StringJoiner底層是一樣的。
面試簡(jiǎn)述SpringMVC的工作原理
過去的理論
記得2015年前面試必備的一道題,面試者需要像小時(shí)候背《詠鵝》一樣倒背如流:SpringMVC的工作原理。經(jīng)典回答是這樣:
SpringMVC 框架是以請(qǐng)求為驅(qū)動(dòng),圍繞 Servlet 設(shè)計(jì),將請(qǐng)求發(fā)給控制器,然后通過模型對(duì)象,分派器來展示請(qǐng)求結(jié)果視圖。
更新的理論
早在Spring3里就封裝好了RESTful風(fēng)格開發(fā)方式,開發(fā)者只需要將請(qǐng)求的Controller替換成RestController或者方法上加上@ResponseBody即可。
目前在前后端分離的場(chǎng)景下,經(jīng)典的SpringMVC中請(qǐng)求流程基本不全用上。
Spring提供了兩種方法將資源的Java表述形式轉(zhuǎn)換為發(fā)送給客戶端的表述形式:內(nèi)容協(xié)商和消息轉(zhuǎn)換器。
內(nèi)容協(xié)商就是經(jīng)典的方法,當(dāng)控制器的處理方法完成時(shí),返回一個(gè)邏輯視圖。內(nèi)容協(xié)商是一個(gè)特殊的視圖解釋器。
消息轉(zhuǎn)換提供了一種更為直接的方式,DispatcherServlet不再需要那么麻煩地將模型數(shù)據(jù)傳送到視圖中。只是控制器產(chǎn)生數(shù)據(jù)給消息轉(zhuǎn)換器后就直接返回給客戶端了。
使用HttpClient還是OkHttp來做http請(qǐng)求
過去的理論
有沒有人告訴過你使用OkHttp來代替HttpClient更簡(jiǎn)潔高效。OkHttp使用build模式創(chuàng)建對(duì)象,而且在發(fā)送異步請(qǐng)求的時(shí)候不需要引入其他的依賴。
更新的理論
在基于Spring的JAVA服務(wù)端開發(fā)中一般會(huì)使用各種框架幫我們?nèi)ネ瓿筛鞣N單調(diào)重復(fù)的工作,比如不管是HttpClient還是OkHttp都需要將返回的reponse自己用編解碼工作轉(zhuǎn)成對(duì)象再處理。但是如果使用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
我們需要?jiǎng)?chuàng)建一個(gè)bean來指定url和處理超時(shí)重試、
日志打印等高可用方面的問題。
@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的簡(jiǎn)化開發(fā)主要是使用了聲明式代替命令式,
在http請(qǐng)求這里當(dāng)然也可以這么用:
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);
}
運(yùn)行一下,發(fā)現(xiàn)執(zhí)行過程這么清晰:
[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里就已經(jīng)使用了模板方法來簡(jiǎn)化http請(qǐng)求的開發(fā),使用RestTemplate不僅可以使用java8的lambda表達(dá)式,還可使用消息轉(zhuǎn)換器直接將返回值轉(zhuǎn)成對(duì)象的形式,更友好的實(shí)現(xiàn)了面向?qū)ο缶幊獭.?dāng)然feign更簡(jiǎn)潔,并且提供了高可用的支持。
總結(jié)
以上是生活随笔為你收集整理的java 经典语录_JavaSpring过时的经典语录的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 新生儿什么保险合适
- 下一篇: java 重构函数_包会,教你用Java