學習彙總(持續更新)

前言接觸的東西越來越多,學到的東西越來越多,解決的問題越來越多,有時候回想起來,覺得很牛逼,但是細想,卻覺得缺少了什麼,覺得自己懂得很多,但是又說不上來。所以決定立項,將學到的東西分類彙總,讓他們有一個體系,讓他們相互連接起來,這樣吹起牛來也不至於太尬。

閱讀本篇博客注意事項:

  1. 目錄較長,標題就是一個知識點的名字
  2. 小的知識點直接在本篇博客進行講解,標題是業內跳轉鏈接,大的知識點需要另開一篇,標題就是外部鏈接,會自動跳過去。
  3. 不僅有我自己寫的文章,還有我見過的優秀的文章的鏈接(不會灌水的放心,絕對乾貨)
  4. 本篇博客置頂持續更新,一開始可能比較空……

題外話:
接下來寫博客的兩大方向已經確定,不再像以前那樣零零散散的記錄所學,想到什麼寫什麼,而是針對某一系列深入研究下去。第一個就是這個學習彙總,將所學詳細的分門別類記錄起來,並且某一段時間會只專注於某一個類別來寫。第二個就是已經在寫的從零搭建後端基礎設施系列(一)-- 背景介紹,這個系列主要是對所學進行實踐,非常的好玩,而且不是單純的對某個知識點進行實踐,而是由面及點的進行。可以說,第一個是理論基礎,第二個是實踐,兩個搭配在一起,樂趣無窮!



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的返回時間??先排查一下,是不是數據庫的問題,發現很快呀。然後就看一下從前端到後端的接口調用鏈,馬上發現問題了。原來在調用第三方接口的時候,沒有使用批量調用,而是單個調用。舉個例子吧
    //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;
    }
    
    所以總結一下,如果量多,能用批量一次獲取就一次獲取,不要過多的RPC調用,發生不必要的損耗。


開發工具

  • 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"
    
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章