原创 拍案叫絕!Jackson內存設計中的組合拳——TextBuffer和BufferRecycler

Jackson作爲Java三大Json框架之一,也是SpringBoot的默認序列化框架,具有速度快、內存佔用低等特點。在rest服務盛行的今天,序列化和反序列化操作在系統中是一個極其常見的操作,這部分帶來的內存開銷也是一塊重點。

原创 基於AQS分析CountDownLatch的原理

示例代碼 先貼一段示例代碼 public class TestCountDownLatch { public static CountDownLatch countDownLatch = new CountDownLat

原创 SpringBoot是如何進行自動裝配的

註解裝配 我們知道,當我們在啓動Spring應用時,我們需要爲Spring提供配置信息(XML或Configuration),這個配置文件中配置了我們的各種Bean信息 在我們自己的應用中,Spring會讀取我們Resource下

原创 SpringMVC的入參轉換和響應參數轉換

在上一篇文章中講了大概的執行流程,這裏詳細講一下入參轉換和響應轉換的實現原理 入參轉換和響應轉換的流程都是在通過Adapter調用HandlerMethod時發生的。 如下是請求頭設置,SpringMVC會根據content-ty

原创 劍指Offer刷題Java版——替換空格

題目 請實現一個函數,將一個字符串中的每個空格替換成“%20”。例如,當字符串爲We Are Happy.則經過替換之後的字符串爲We%20Are%20Happy。 解題思路 第一反應是replace對不對?API大家都會用

原创 Mysql的Explain中的type分析

ALL 全表掃描 Index 索引表全表掃描,其性能不會比ALL高,因爲它實際還是會回表查數據的,每在索引表中查一條索引就回主表查一次數據 除非是排序情況,因爲聚集索引是按照主鍵排序的,而其他索引是根據索引的列排序的。如果是需要列

原创 劍指Offer刷題Java版——兩個棧實現隊列

題目 用兩個棧來實現一個隊列,完成隊列的Push和Pop操作。 隊列中的元素爲int類型。 解題思路 兩個棧一個用來壓入,一個用來彈出。需要彈出的時候就把壓入棧裏的元素搞到彈出棧中即可。很簡單的題,沒啥可說的 解題代碼 pub

原创 CompletableFuture的用法及簡要原理

//自定義線程池 private static ThreadPoolExecutor executor = new ThreadPoolExecutor(8,16,20, TimeUnit.SECONDS,new LinkedBl

原创 劍指Offer刷題Java版——構建乘積數組

題目 給定一個數組A[0,1,…,n-1],請構建一個數組B[0,1,…,n-1],其中B中的元素B[i]=A[0]A[1]…*A[i-1]A[i+1]…*A[n-1]。不能使用除法。 解題思路 引用的牛客網的答案 既然不能用乘法

原创 Java中的對象拷貝

我們在開發中有時候會經常需要進行對象拷貝的情況,舉個例子 public static void main(String[] args) { m1(o); m2(o); } pub

原创 圖解JDK7中的HashMap閉環和丟失問題

關於HashMap的線程安全問題,網上資料很多。對於1.7版本的閉環問題,看了很多網上的資料一直搞不懂,今天又琢磨了一下,終於明白了,用自己看得懂的方式記錄下。 首先說下閉環產生的原因:1.7的HashMap在擴容複製時,採用的是

原创 maven常用插件示例——編譯、打包、拷貝依賴和資源、ant腳本

記錄下maven打包的常用插件使用方法 <build> <plugins> <!--編譯插件,JDK8,編碼UTF-8--> <plugin> <groupId>org.apache.maven.plugi

原创 SpringAOP使用CGLIB代理對protect方法無效

之前項目中遇到由於Mybatis緩存以及事物隔離導致的併發問題,無法拿到最新的數據,因此就將方法拆開,並將事物傳播設置爲了REQUIRES_NEW解決,詳情看這記一次鎖和事物導致的併發問題 doInsert這個方法是沒有寫在接口中

原创 基於Javassist實現JDK的動態代理Proxy

使用 首先複習一下怎麼使用動態代理 定義一個用戶接口 實現一個用戶接口的實現類 實現一個InvocationHandler 使用Proxy.newProxyInstance創建一個代理即可使用 public interface

原创 Cglib動態代理的底層原理

使用 老規矩,先回憶一下怎麼使用cglib的動態代理 寫一個方法攔截器作爲回調 創建Enhancer並設置父類和回調 使用Enhancer創建代理類 public class MyMethodInterceptor imple