前言:接觸的東西越來越多,學到的東西越來越多,解決的問題越來越多,有時候回想起來,覺得很牛逼,但是細想,卻覺得缺少了什麼,覺得自己懂得很多,但是又說不上來。所以決定立項,將學到的東西分類彙總,讓他們有一個體系,讓他們相互連接起來,這樣吹起牛來也不至於太尬。
閱讀本篇博客注意事項:
- 目錄較長,標題就是一個知識點的名字
- 小的知識點直接在本篇博客進行講解,標題是業內跳轉鏈接,大的知識點需要另開一篇,標題就是外部鏈接,會自動跳過去。
- 不僅有我自己寫的文章,還有我見過的優秀的文章的鏈接(不會灌水的放心,絕對乾貨)
- 本篇博客置頂持續更新,一開始可能比較空……
題外話:
接下來寫博客的兩大方向已經確定,不再像以前那樣零零散散的記錄所學,想到什麼寫什麼,而是針對某一系列深入研究下去。第一個就是這個學習彙總,將所學詳細的分門別類記錄起來,並且某一段時間會只專注於某一個類別來寫。第二個就是已經在寫的從零搭建後端基礎設施系列(一)-- 背景介紹,這個系列主要是對所學進行實踐,非常的好玩,而且不是單純的對某個知識點進行實踐,而是由面及點的進行。可以說,第一個是理論基礎,第二個是實踐,兩個搭配在一起,樂趣無窮!
-
java基礎
JDK1.8 HashMap put源碼剖析
jdk1.8 LinkedHashMap源碼剖析
java直接內存限制條件
兩個對象值相同 (x.equals(y) == true),但卻可有不同的 hash code,這句話對不對?
LinkedHashMap是如何保證有序的? -
數據庫
MYSQL入門語句
MYSQL數據檢索總結
MYSQL常用函數總結
索引和約束的創建
局域網內如何連接MYSQL數據庫 -
網絡
Socket編程服務端原理簡單介紹
Socket編程客戶端原理簡單介紹
Socket編程-1V1聊天
socket編程UDP服務器原理簡介
socket編程UDP客戶端原理簡介
socket編程UDP小例子
socket多人聊天程序C語言版(一)
socket多人聊天程序C語言版(二)
關於使用UDP實現多人聊天程序的Thinking
Socket多人聊天MFC版
socket非阻塞模式服務器設計與實現
socket select模型服務器設計
基於select模型的多人聊天程序(C++)
重疊I/O之完成例程
完成端口模型
重疊I/O之事件通知
WSAEventSelect模型例子
WSAAsyncSelect模型例子
重疊I/O完成例程模型如何同時投遞WSARecv和WSASend
深入淺出JAVA BIO、NIO和AIO(附詳細代碼實例)
帶你搞懂Thrift核心源碼(JAVA) -
springboot
springboot之BeanPostProcessor功能及例子(一)
springboot之事件監聽機制
spring自定義註解失效的原因
idea+spring boot+mybatis+restful風格的demo
細說@Transactional用法及原理
【追根究底】 爲什麼@Transactional註解失效了?
【追根究底】@Lazy註解爲什麼會失效?
【追根究底】使用@Lazy註解爲什麼會產生兩層代理?
【細品springboot源碼】徹底弄懂spring bean的創建過程(上)
@DependsOn用法和原理 -
linux
如何安裝CentOS7字符界面
Linux下用戶和組的增、刪、改
Linux如何編譯源代碼安裝軟件
Linux如何用rpm安裝軟件
Linux如何更改yum源
Linux如何用yum安裝軟件或服務
shell腳本基本語法詳解
linux常用查找命令詳解
Linux文件的普通權限詳解
Linux管道命令符
如何使用Linux重定向符
個性化配置putty並保存配置
使用putty遠程連接linux
linux如何用fdisk命令分區
centos7如何開放端口 -
數據結構
線性表之順序表
棧、遞歸、循環的關係
順序表的動態增長
KMP算法next數組詳解
KMP算法詳解
字符串數據結構實現(鏈表方式)
廣義表C/C++實現詳解
二叉樹遞歸實現
二叉樹非遞歸實現
二叉查找樹
棧應用之中綴轉後綴表達式計算(C++、JAVA)
棧應用之中綴轉後綴表達式(C語言版)
線性表之單鏈表
線性表之循環鏈表
字符串數據結構實現(數組方式)
線性表之雙向鏈表
線性表之順序棧
線性表之鏈棧
線性表之順序隊列
線性表之鏈隊列
線性表之循環隊列
約瑟夫問題詳解+源碼 -
算法
Lake Counting
迷宮的最短路徑
劍指offer–替換空格
劍指offer–用兩個棧實現隊列
插入、快排、堆排、歸併、計數和桶排序詳解以及測試 -
開發工具
如何正確使用git和github
git用法進階
git如何刪除某幾個commit
如何將本地倉庫和遠程master倉庫關聯push
idea 不停的 updating indices
idea debug的時候出現because it happened inside debugger evaluation
maven報錯"was cached in the local repository, resolution will not be reattempted until the update interval of nexus has elapsed or updates are forced"
.gitignore規則不生效的解決辦法
java基礎 |
-
java直接內存限制條件
ByteBuffer.allocateDirect受到-XX:MaxDirectMemorySize參數的限制,如果沒有設置該參數,那麼受到-Xmx參數的限制 -
兩個對象值相同 (x.equals(y) == true),但卻可有不同的 hash code,這句話對不對?
首先,這句話是對的,因爲你可以重寫這兩個方法,你可以隨意規定它們的規則@Override public int hashCode() { return 0; } @Override public boolean equals(Object obj) { return true; }
但是,這是不符合規範的,如果這樣用了。。。會被打得很慘的。。。
重寫equals的規範:- 自反性,即自己和自己比較肯定相等,
x.equals(y) == true
- 對稱性,即
x.equals(y) == true && y.equals(x) == true
- 傳遞性,即
x.equals(y) == true && y.equals(z) == true && x.equals(z) == true
- 一致性,即不管調用多少次
x.equals(y)
,要麼恆爲true,要麼恆爲false x.equals(null)
恆爲false`
重寫hashcode規範:x.equals(y) == true
時,x.hashCode() == y.hashCode()
x.hashCode() == y.hashCode( )
時,x.equals(y) == true
爲什麼建議這樣做呢?我們都知道hashmap中判斷key是否相等是先用的hash值再用的equals如果我new了兩個對象,key的值相等,但是hashcode不相等,這樣就會出導致,相同的key值卻返回false
Key k1 = new Key(1); Key k2 = new Key(1); 沒重寫的情況下 k1.equals(k2) == false K1.hashCode() != k2.hashCode 只重寫equals,在hashmap中會發生這兩個key不是同一個 k1.equals(k2) == true K1.hashCode() != k2.hashCode 兩個都重寫,這兩個就相當於是一樣的key了 k1.equals(k2) == true K1.hashCode() == k2.hashCode
- 自反性,即自己和自己比較肯定相等,
-
LinkedHashMap是如何保證有序的?
LinkedHashMap是繼承HashMap的,所有的put、get等操作都是使用hashmap的。hashmap中有一些protected方法是專門用來給LinkedHashMap重寫用的(多態)
LinkedHashMap中的實現如下,發現每一個方法都多了一個linkNodeLast,其作用是,將每一個插入的節點,都放入自己維護的雙向鏈表的尾部
遍歷的時候,遍歷這個雙向鏈表,那麼就能保證和插入的順序是一致的final LinkedHashMap.Entry<K,V> nextNode() { LinkedHashMap.Entry<K,V> e = next; if (modCount != expectedModCount) throw new ConcurrentModificationException(); if (e == null) throw new NoSuchElementException(); current = e; next = e.after; return e; }
多線程 |
數據庫 |
網絡 |
springboot |
- @DependsOn用法和原理
- 用法
假設有A、B類
第一種正常用法,A
依賴於B
,需要B
創建後,A
才能創建。
這是一種錯誤的用法,會造成循環依賴(這個和隱式的循環依賴不同,這是人爲直接指定的顯式循環依賴),直接報錯@DependsOn("b") @Component public class A { public void sayA(){} } @Component public class B { public void sayB(){} }
@DependsOn("b") @Component public class A { public void sayA(){} } @DependsOn("a") @Component public class B { public void sayB(){} }
- 原理
看doGetBean
方法即可
代碼可以很清楚的看出來爲什麼不能那樣用了。正常情況下會調用protected <T> T doGetBean(final String name, @Nullable final Class<T> requiredType, @Nullable final Object[] args, boolean typeCheckOnly) throws BeansException { …… // Guarantee initialization of beans that the current bean depends on. String[] dependsOn = mbd.getDependsOn(); if (dependsOn != null) { for (String dep : dependsOn) { //這裏會判斷是否循環依賴,是的話,就會報錯 if (isDependent(beanName, dep)) { throw new BeanCreationException(mbd.getResourceDescription(), beanName, "Circular depends-on relationship between '" + beanName + "' and '" + dep + "'"); } registerDependentBean(dep, beanName); try { getBean(dep); } catch (NoSuchBeanDefinitionException ex) { …… } } …… }
getBean
去創建或從緩存獲取依賴。因爲可能一開始B先於A創建了,然後創建A的時候,依賴已經創建後,getBean
就會直接從緩存拿。
- 用法
linux |
-
centos7如何開放端口
-
如何查看某個端口是否開放
第一種,netstat -aptn 第二種,直接用Telnet ip 端口號命令來測試一下
-
查看防火牆運行狀態
firewall-cmd --state 如果是not running systemctl start firewalld.service
-
開啓端口
firewall-cmd --zone=public --add-port=xxx/tcp --permanent --zone=public:表示作用域爲公共的; --add-port=xxx/tcp:添加tcp協議的端口xxx; --permanent:永久生效,如果沒有此參數,則只能維持當前服務生命週期內,重新啓動後失效;
-
重啓防火牆
systemctl restart firewalld.service
-
5.重新載入配置
firewall-cmd --reload
-
容器 |
數據結構 |
算法 |
工作經驗 |
- 接口性能優化
最近發現項目中有些接口返回非常慢,一個搜索接口居然接近1s的返回時間??先排查一下,是不是數據庫的問題,發現很快呀。然後就看一下從前端到後端的接口調用鏈,馬上發現問題了。原來在調用第三方接口的時候,沒有使用批量調用,而是單個調用。舉個例子吧
所以總結一下,如果量多,能用批量一次獲取就一次獲取,不要過多的RPC調用,發生不必要的損耗。//bad case public List<Result> search(){ //從數據庫查找到相應結果 List<XXDomain> domains = dao.search(xxx); //處理原始結果 List<Result> res = new ArrayList<>(); for(XXDomain domain: domains){ Result r = new Result(); //需要根據某個屬性作爲參數,去調用第三方接口,獲取某些信息 //如果domains有幾十上百個的話,那麼是不是需要幾十上百次RPC? //就算RPC性能再好,每一個10ms以下,那量一多,是不是就變慢了? otherService.get(domain.xxx); …… res.add(r); } return res; } //good case public List<Result> search(){ //從數據庫查找到相應結果 List<XXDomain> domains = dao.search(xxx); //1.將需要的參數提取出來 …… //2.調用第三方的批量獲取接口,將信息存到map中,下面想怎麼用就怎麼用 …… //處理原始結果 List<Result> res = new ArrayList<>(); for(XXDomain domain: domains){ Result r = new Result(); //在這裏,只需要在map中拿,就好了,不需要再發生RPC調用 map.get(domain.xxx); …… res.add(r); } return res; }
開發工具 |
-
git如何刪除某幾個commit
1.
git log
找到你要刪除的分支的前一個
2.git rebase -I commit-id
3.修改要刪除的commit的pick 爲drop即可 -
如何將本地倉庫和遠程master倉庫關聯push
1.github上創建一個帶有文件的倉庫
2.本地已經寫好一個項目,並想把它push上去
3.git init
4.git add .
5.git commit -m ""
6.git remote add upstream url
7.git fetch upstream
8.git merge upstream/master master --allow-unrelated-histories
9.git push upstream master
-
idea 不停的 updating indices
在File-Invalidate Caches / Restart中,選擇Invalidate and Restart
-
idea debug的時候出現because it happened inside debugger evaluation
解決辦法(雖然網上有說爲什麼,這是某位仁兄寫的原因because it happened inside debugger evaluation,但是我按照這個思路,實在定位不到springboot中的問題,所以就不講爲什麼了,直接貼解決辦法。)
-
maven報錯"was cached in the local repository, resolution will not be reattempted until the update interval of nexus has elapsed or updates are forced"
如圖,mvn install的時候,報錯。實測,將劃線部分的jar包刪除,重新下載即可。
-
.gitignore規則不生效的解決辦法
第一條命令放心操作,不會將你提交的代碼刪除的(一開始我也有點慌,因爲執行第一條後,git status
居然發現狀態是delete
,哈哈),實測是可以的。git rm -r --cached . git add . git commit -m "update .gitignore"