2019.05.26 週日--《阿里巴巴 Java 開發手冊》精華摘要

1、寫在開頭

    Java做爲一個編程界最流行的語言之一,有着很強的生命力。代碼的編寫規範也是不容忽視的,今天,我就把本身閱讀的國內的互聯網巨頭阿里巴巴的《阿里巴巴 Java 開發手冊》一些精彩內容摘錄以下。以饗讀者。《阿里巴巴Java開發手冊 終極版v1.3.0.pdf》 下載地址html

 


《阿里巴巴Java開發手冊 終極版v1.3.0.pdf》 

2、精彩摘錄

    4.1)【命名風格】java


【01 強制】抽象類命名使用 Abstract 或 Base 開頭;異常類命名使用 Exception 結尾;測試類 命名以它要測試的類的名稱開始,以 Test 結尾。git

 【02 強制】中括號是數組類型的一部分,數組定義以下:String[] args; 反例:使用 String args[]的方式來定義。程序員

【03強制】POJO 類中布爾類型的變量,都不要加 is,不然部分框架解析會引發序列化錯誤。 spring

==反例:定義爲基本數據類型 Boolean isDeleted;的屬性,它的方法也是 isDeleted(), 框架在反向解析的時候,「覺得」對應的屬性名稱是 deleted,致使屬性獲取不到,進而拋出異 常。shell

【04 強制】包名統一使用小寫,點分隔符之間有且僅有一個天然語義的英語單詞。包名統一使用 單數形式,可是類名若是有複數含義,類名可使用複數形式。 正例: 應用工具類包名爲 com.alibaba.open.util、類名爲 MessageUtils(此規則參考 spring 的框架結構)數據庫

【05 推薦】若是模塊、接口、類、方法使用了設計模式,在命名時體現出具體模式編程

【06 推薦】接口類中的方法和屬性不要加任何修飾符號(public 也不要加),保持代碼的簡潔 性,並加上有效的 Javadoc 註釋。儘可能不要在接口裏定義變量,若是必定要定義變量,確定是 與接口方法相關,而且是整個應用的基礎常量。 正例:接口方法簽名:void f(); 接口基礎常量表示:String COMPANY = "alibaba"; 反例:接口方法定義:public abstract void f(); 說明:JDK8 中接口容許有默認實現,那麼這個 default 方法,是對全部實現類都有價值的默 認實現。設計模式

【不是很理解--todo】接口和實現類的命名有兩套規則:api

1)【強制】對於 Service 和 DAO 類,基於 SOA 的理念,暴露出來的服務必定是接口,內部 的實現類用 Impl 的後綴與接口區別。 正例:CacheServiceImpl 實現 CacheService 接口。 

2)【推薦】若是是形容能力的接口名稱,取對應的形容詞作接口名(一般是–able 的形式)。 正例:AbstractTranslator 實現 Translatable。

4.2)【常量定義】


【不是很理解--todo】【強制】不容許任何魔法值(即未經定義的常量)直接出如今代碼中。 反例:String key = "Id#taobao_" + tradeId; cache.put(key, value);

4.3)【代碼格式】


【01 強制】大括號的使用約定。若是是大括號內爲空,則簡潔地寫成{}便可,不須要換行;若是 是非空代碼塊則: 1) 左大括號前不換行。 2) 左大括號後換行。 3) 右大括號前換行。 4) 右大括號後還有 else 等代碼則不換行;表示終止的右大括號後必須換行。

 【02 強制】if/for/while/switch/do 等保留字與括號之間都必須加空格。

 【03 強制】任何二目、三目運算符的左右兩邊都須要加一個空格。 說明:運算符包括賦值運算符=、邏輯運算符&&、加減乘除符號等。

【04 強制】註釋的雙斜線與註釋內容之間有且僅有一個空格。 正例:// 註釋內容,注意在//和註釋內容之間有一個空格。

4.4)【OOP規約】


【01 強制】Object 的 equals 方法容易拋空指針異常,應使用常量或肯定有值的對象來調用 equals。 

==正例:"test".equals(object); 反例:object.equals("test"); 說明:推薦使用 java.util.Objects#equals(JDK7 引入的工具類)

【02 強制】全部的相同類型的包裝類對象之間值的比較,所有使用 equals 方法比較。

說明:對於 Integer var = ? 在-128 至 127 範圍內的賦值,Integer 對象是在 IntegerCache.cache 產生,會複用已有對象,這個區間內的 Integer 值能夠直接使用==進行 判斷,可是這個區間以外的全部數據,都會在堆上產生,並不會複用已有對象,這是一個大坑, 推薦使用 equals 方法進行判斷。

關於基本數據類型與包裝數據類型的使用標準以下: 

1) 【強制】全部的 POJO 類屬性必須使用包裝數據類型。 

2) 【強制】RPC 方法的返回值和參數必須使用包裝數據類型。 

3) 【推薦】全部的局部變量使用基本數據類型。 

==說明:POJO 類屬性沒有初值是提醒使用者在須要使用時,必須本身顯式地進行賦值,任何 NPE (即空指針異常)問題,或者入庫檢查,都由使用者來保證。 

==正例:數據庫的查詢結果多是 null,由於自動拆箱,用基本數據類型接收有 NPE 風險。 

==反例:好比顯示成交總額漲跌狀況,即正負 x%,x 爲基本數據類型,調用的 RPC 服務,調用 不成功時,返回的是默認值,頁面顯示爲 0%,這是不合理的,應該顯示成中劃線。因此包裝 數據類型的 null 值,可以表示額外的信息,如:遠程調用失敗,異常退出。

參考:Java中基本數據類型和包裝類

【03 強制】序列化類新增屬性時,請不要修改 serialVersionUID 字段,避免反序列失敗;如 果徹底不兼容升級,避免反序列化混亂,那麼請修改 serialVersionUID 值。 說明:注意 serialVersionUID 不一致會拋出序列化運行時異常。

【04 強制】POJO 類必須寫 toString 方法。使用 IDE 的中工具:source> generate toString 時,若是繼承了另外一個 POJO 類,注意在前面加一下 super.toString。 說明:在方法執行拋出異常時,能夠直接調用 POJO 的 toString()方法打印其屬性值,便於排 查問題。

【05 推薦】當一個類有多個構造方法,或者多個同名方法,這些方法應該按順序放置在一塊兒, 便於閱讀,

【06 推薦】 類內方法定義順序依次是:公有方法或保護方法 > 私有方法 > getter/setter 方法。

【07 推薦】循環體內,字符串的鏈接方式,使用 StringBuilder 的 append 方法進行擴展。 

==說明:反編譯出的字節碼文件顯示每次循環都會 new 出一個 StringBuilder 對象,而後進行 append 操做,最後經過 toString 方法返回 String 對象,形成內存資源浪費。 

==反例: String str = "start"; for (int i = 0; i < 100; i++) { str = str + "hello"; }

【08 推薦】類成員與方法訪問控制從嚴: 

1) 若是不容許外部直接經過 new 來建立對象,那麼構造方法必須是 private。

2) 工具類不容許有 public 或 default 構造方法。

3) 類非 static 成員變量而且與子類共享,必須是 protected。 

4) 類非 static 成員變量而且僅在本類使用,必須是 private。

5) 類 static 成員變量若是僅在本類使用,必須是 private。

6) 如果 static 成員變量,必須考慮是否爲 final。

7) 類成員方法只供類內部調用,必須是 private。 

8) 類成員方法只對繼承類公開,那麼限制爲 protected。 

==說明:任何類、方法、參數、變量,嚴控訪問範圍。過於寬泛的訪問範圍,不利於模塊解耦。 思考:若是是一個 private 的方法,想刪除就刪除,但是一個 public 的 service 方法,或者 一個 public 的成員變量,刪除一下,不得手心冒點汗嗎?變量像本身的小孩,儘可能在本身的 視線內,變量做用域太大,無限制的處處跑,那麼你會擔憂的。

4.5)【集合處理】


【01 強制】關於 hashCode 和 equals 的處理,遵循以下規則:

1) 只要重寫 equals,就必須重寫 hashCode。

2) 由於 Set 存儲的是不重複的對象,依據 hashCode 和 equals 進行判斷,因此 Set 存儲的 對象必須重寫這兩個方法。

3) 若是自定義對象作爲 Map 的鍵,那麼必須重寫 hashCode 和 equals。 說明:String 重寫了 hashCode 和 equals 方法,因此咱們能夠很是愉快地使用 String 對象 做爲 key 來使用。

【02 強制】ArrayList的subList結果不可強轉成ArrayList,不然會拋出ClassCastException 異常,即 java.util.RandomAccessSubList cannot be cast to java.util.ArrayList. 

==說明:subList 返回的是 ArrayList 的內部類 SubList,並非 ArrayList ,而是 ArrayList 的一個視圖,對於 SubList 子列表的全部操做最終會反映到原列表上。

== 例子:https://blog.csdn.net/qq_15118961/article/details/80893780

【03 強制】在 subList 場景中,高度注意對原集合元素個數的修改,會致使子列表的遍歷、增長、 刪除均會產生 ConcurrentModificationException 異常。

【04 強制】使用集合轉數組的方法,必須使用集合的 toArray(T[] array),傳入的是類型徹底 同樣的數組,大小就是 list.size()。

【05 強制】使用工具類 Arrays.asList()把數組轉換成集合時,不能使用其修改集合相關的方 法,它的 add/remove/clear 方法會拋出 UnsupportedOperationException 異常。

== 說明:asList 的返回對象是一個 Arrays 內部類,並無實現集合的修改方法。Arrays.asList 體現的是適配器模式,只是轉換接口,後臺的數據還是數組。 

==String[] str = new String[] { "you", "wu" }; List list = Arrays.asList(str); 第一種狀況:list.add("yangguanbao"); 運行時異常。 第二種狀況:str[0] = "gujin"; 那麼 list.get(0)也會隨之修改。

【06 強制】泛型通配符來接收返回的數據,此寫法的泛型集合不能使用 add 方 法,而不能使用 get 方法,作爲接口調用賦值時易出錯。 

==說明:擴展說一下 PECS(Producer Extends Consumer Super)原則:第1、頻繁往外讀取內 容的,適合用<? extends T>。第2、常常往裏插入的,適合用<? super T>。

【07 強制】c。remove 元素請使用 Iterator 方式,若是併發操做,須要對 Iterator 對象加鎖。

【08 強制】 在 JDK7 版本及以上,Comparator 要知足以下三個條件,否則 Arrays.sort, Collections.sort 會報 IllegalArgumentException 異常。

== 說明:三個條件以下 1) x,y 的比較結果和 y,x 的比較結果相反。 2) x>y,y>z,則 x>z。 3) x=y,則 x,z 比較結果和 y,z 比較結果相同。

== 參考資料:http://www.javashuo.com/article/p-exdndlvt-b.html : JAVA Comparator 接口排序用法

【09 推薦】集合初始化時,指定集合初始值大小。

==說明:HashMap 使用 HashMap(int initialCapacity) 初始化, 

==正例:initialCapacity = (須要存儲的元素個數 / 負載因子) + 1。注意負載因子(即 loader factor)默認爲 0.75,若是暫時沒法肯定初始值大小,請設置爲 16(即默認值)。

== 反例:HashMap 須要放置 1024 個元素,因爲沒有設置容量初始大小,隨着元素不斷增長,容 量 7 次被迫擴大,resize 須要重建 hash 表,嚴重影響性能。

【10 推薦】使用 entrySet 遍歷 Map 類集合 KV,而不是 keySet 方式進行遍歷。

==說明:keySet 實際上是遍歷了 2 次,一次是轉爲 Iterator 對象,另外一次是從 hashMap 中取出 key 所對應的 value。而 entrySet 只是遍歷了一次就把 key 和 value 都放到了 entry 中,效 率更高。若是是 JDK8,使用 Map.foreach 方法。 正例:values()返回的是 V 值集合,是一個 list 集合對象;keySet()返回的是 K 值集合,是 一個 Set 集合對象;entrySet()返回的是 K-V 值組合集合。

== 網絡例子: https://blog.csdn.net/lisiben/article/details/84855030

【11 推薦】高度注意 Map 類集合 K/V 能不能存儲 null 值的狀況,以下表格:

4.6)【集合處理】


【強制】獲取單例對象須要保證線程安全,其中的方法也要保證線程安全。 說明:資源驅動類、工具類、單例工廠類都須要注意。

4.7)【控制語句】


【01 強制】在一個 switch 塊內,每一個 case 要麼經過 break/return 等來終止,要麼註釋說明程 序將繼續執行到哪個 case 爲止;在一個 switch 塊內,都必須包含一個 default 語句而且 放在最後,即便它什麼代碼也沒有。

 【02 強制】在 if/else/for/while/do 語句中必須使用大括號。即便只有一行代碼,避免採用 單行的編碼方式:if (condition) statements;

【03 推薦】表達異常的分支時,少用 if-else 方式,這種方式能夠改寫成: if (condition) { ... return obj; } // 接着寫 else 的業務邏輯代碼;

==正例:超過 3 層的 if-else 的邏輯判斷代碼可使用衛語句、策略模式、狀態模式等來實現,

== 參考: http://www.javashuo.com/article/p-artqhpbk-o.html

【04 推薦】循環體中的語句要考量性能,如下操做盡可能移至循環體外處理,如定義對象、變量、 獲取數據庫鏈接,進行沒必要要的 try-catch 操做(這個 try-catch 是否能夠移至循環體外)。

 

4.8)【註釋規約】


【01 強制】類、類屬性、類方法的註釋必須使用 Javadoc 規範,使用/**內容*/格式,不得使用 // xxx 方式。

【02 強制】全部的類都必須添加建立者和建立日期。

【03 強制】方法內部單行註釋,在被註釋語句上方另起一行,使用//註釋。方法內部多行註釋 使用/* */註釋,注意與代碼對齊。

【04 參考】特殊註釋標記,請註明標記人與標記時間。注意及時處理這些標記,經過標記掃描, 常常清理此類標記。線上故障有時候就是來源於這些標記處的代碼。

== 1) 待辦事宜(TODO):( 標記人,標記時間,[預計處理時間]) 表示須要實現,但目前還未實現的功能。這其實是一個 Javadoc 的標籤,目前的 Javadoc 尚未實現,但已經被普遍使用。只能應用於類,接口和方法(由於它是一個 Javadoc 標籤)。

== 2) 錯誤,不能工做(FIXME):(標記人,標記時間,[預計處理時間]) 在註釋中用 FIXME 標記某代碼是錯誤的,並且不能工做,須要及時糾正的狀況。

4.9)【其餘】


【01 強制】後臺輸送給頁面的變量必須加$!{var}——中間的感嘆號。 說明:若是 var=null 或者不存在,那麼${var}會直接顯示在頁面上。

【02 強制】注意 Math.random() 這個方法返回是 double 類型,注意取值的範圍 0≤x<1(可以 取到零值,注意除零異常),若是想獲取整數類型的隨機數,不要將 x 放大 10 的若干倍而後 取整,直接使用 Random 對象的 nextInt 或者 nextLong 方法。

【03 強制】獲取當前毫秒數 System.currentTimeMillis(); 而不是 new Date().getTime(); 說明:若是想獲取更加精確的納秒級時間值,使用 System.nanoTime()的方式。在 JDK8 中, 針對統計時間等場景,推薦使用 Instant 類。

【04 推薦】任何數據結構的構造或初始化,都應指定大小,避免數據結構無限增加吃光內存。

【05 推薦】及時清理再也不使用的代碼段或配置信息。 說明:對於垃圾代碼或過期配置,堅定清理乾淨,避免程序過分臃腫,代碼冗餘。

== 正例:對於暫時被註釋掉,後續可能恢復使用的代碼片段,在註釋代碼上方,統一規定使用三 個斜槓(///)來講明註釋掉代碼的理由。

 

4.10)【異常處理】


【01 強制】對大段代碼進行 try-catch,這是不負責任的表現。catch 時請分清穩定代碼和非穩 定代碼,穩定代碼指的是不管如何不會出錯的代碼。對於非穩定代碼的 catch 儘量進行區分 異常類型,再作對應的異常處理。

【02 參考】在代碼中使用「拋異常」仍是「返回錯誤碼」,對於公司外的 http/api 開放接口必須 使用「錯誤碼」;而應用內部推薦異常拋出;跨應用間 RPC 調用優先考慮使用 Result 方式,封 裝 isSuccess()方法、「錯誤碼」、「錯誤簡短信息」。

== 說明:關於 RPC 方法返回方式使用 Result 方式的理由: 1)使用拋異常返回方式,調用方若是沒有捕獲到就會產生運行時錯誤。 2)若是不加棧信息,只是 new 自定義異常,加入本身的理解的 error message,對於調用 端解決問題的幫助不會太多。若是加了棧信息,在頻繁調用出錯的狀況下,數據序列化和傳輸 的性能損耗也是問題。

 

4.11)【日誌規約】


【強制】應用中不可直接使用日誌系統(Log4j、Logback)中的 API,而應依賴使用日誌框架 SLF4J 中的 API,使用門面模式的日誌框架,有利於維護和各個類的日誌處理方式統一。

【推薦】謹慎地記錄日誌。生產環境禁止輸出 debug 日誌;有選擇地輸出 info 日誌;若是使 用 warn 來記錄剛上線時的業務行爲信息,必定要注意日誌輸出量的問題,避免把服務器磁盤 撐爆,並記得及時刪除這些觀察日誌。

4.12)【單元測試】


【01 強制】好的單元測試必須遵照 AIR 原則。 說明:單元測試在線上運行時,感受像空氣(AIR)同樣並不存在,但在測試質量的保障上, 倒是很是關鍵的。好的單元測試宏觀上來講,具備自動化、獨立性、可重複執行的特色。

 A:Automatic(自動化)  I:Independent(獨立性)  R:Repeatable(可重複)

【02 強制】保持單元測試的獨立性。爲了保證單元測試穩定可靠且便於維護,單元測試用例之間 決不能互相調用,也不能依賴執行的前後次序。

== 反例:method2 須要依賴 method1 的執行,將執行結果作爲 method2 的輸入。

【03 強制】對於單元測試,要保證測試粒度足夠小,有助於精肯定位問題。單測粒度至可能是類級 別,通常是方法級別。

【04 推薦】單元測試的基本目標:語句覆蓋率達到 70%;核心模塊的語句覆蓋率和分支覆蓋率都 要達到 100%

【05 推薦】對於數據庫相關的查詢,更新,刪除等操做,不能假設數據庫裏的數據是存在的, 或者直接操做數據庫把數據插入進去,請使用程序插入或者導入數據的方式來準備數據。

【06 推薦】單元測試做爲一種質量保障手段,不建議項目發佈後補充單元測試用例,建議在項 目提測前完成單元測試。

 

4.13)【安全規約】


【01 強制】用戶請求傳入的任何參數必須作有效性驗證。

== 說明:忽略參數校驗可能致使:

 page size 過大致使內存溢出

 惡意 order by 致使數據庫慢查詢 

 任意重定向 

 SQL 注入

 反序列化注入 

 正則輸入源串拒絕服務 ReDoS 

==說明:Java 代碼用正則來驗證客戶端的輸入,有些正則寫法驗證普通用戶輸入沒有問題, 可是若是攻擊人員使用的是特殊構造的字符串來驗證,有可能致使死循環的結果。

【02 強制】在使用平臺資源,譬如短信、郵件、電話、下單、支付,必須實現正確的防重放限制, 如數量限制、疲勞度控制、驗證碼校驗,避免被濫刷、資損。 說明:如註冊時發送驗證碼到手機,若是沒有限制次數和頻率,那麼能夠利用此功能騷擾到其 它用戶,並形成短信平臺資源浪費。

【03 推薦】發貼、評論、發送即時消息等用戶生成內容的場景必須實現防刷、文本內容違禁詞過 濾等風控策略。

4.14)【MySQL數據庫】


【01 強制】主鍵索引名爲 pk_字段名;惟一索引名爲 uk_字段名;普通索引名則爲 idx_字段名。 說明:pk_ 即 primary key;uk_ 即 unique key;idx_ 即 index 的簡稱。

【02 強制】小數類型爲 decimal,禁止使用 float 和 double。

==說明:float 和 double 在存儲的時候,存在精度損失的問題,極可能在值的比較時,獲得不 正確的結果。若是存儲的數據範圍超過 decimal 的範圍,建議將數據拆成整數和小數分開存儲。

【03 強制】varchar 是可變長字符串,不預先分配存儲空間,長度不要超過 5000,若是存儲長 度大於此值,定義字段類型爲 text,獨立出來一張表,用主鍵來對應,避免影響其它字段索 引效率。

【04 推薦】單錶行數超過 500 萬行或者單表容量超過 2GB,才推薦進行分庫分表。 說明:若是預計三年後的數據量根本達不到這個級別,請不要在建立表時就分庫分表。

【05 強制】業務上具備惟一特性的字段,即便是多個字段的組合,也必須建成惟一索引。

== 說明:不要覺得惟一索引影響了 insert 速度,這個速度損耗能夠忽略,但提升查找速度是明 顯的;另外,即便在應用層作了很是完善的校驗控制,只要沒有惟一索引,根據 墨菲定律,必 然有髒數據產生。

【06 強制】在 varchar 字段上創建索引時,必須指定索引長度,不必對全字段創建索引,根據 實際文本區分度決定索引長度便可。 說明:索引的長度與區分度是一對矛盾體,通常對字符串類型數據,長度爲 20 的索引,區分度會高達 90%以上,可使用 count(distinct left(列名, 索引長度))/count(*)的區分度 來肯定。

【07 推薦】若是有 order by 的場景,請注意利用索引的有序性。order by 最後的字段是組合 索引的一部分,而且放在索引組合順序的最後,避免出現 file_sort 的狀況,影響查詢性能。 正例:where a=? and b=? order by c; 索引:a_b_c 反例:索引中有範圍查找,那麼索引有序性沒法利用,如:WHERE a>10 ORDER BY b; 索引 a_b 沒法排序。

【08 推薦】利用延遲關聯或者子查詢優化超多分頁場景。

==說明:MySQL 並非跳過 offset 行,而是取 offset+N 行,而後返回放棄前 offset 行,返回 N 行,那當 offset 特別大的時候,效率就很是的低下,要麼控制返回的總頁數,要麼對超過 特定閾值的頁數進行 SQL 改寫。

== 正例:先快速定位須要獲取的 id 段,而後再關聯: SELECT a.* FROM 表 1 a, (select id from 表 1 where 條件 LIMIT 100000,20 ) b where a.id=b.id

【09 推薦】建組合索引的時候,區分度最高的在最左邊。

==正例:若是 where a=? and b=? ,a 列的幾乎接近於惟一值,那麼只須要單建 idx_a 索引即 可。

== 說明:存在非等號和等號混合判斷條件時,在建索引時,請把等號條件的列前置。如:where a>? and b=? 那麼即便 a 的區分度更高,也必須把 b 放在索引的最前列。

【10 推薦】防止因字段類型不一樣形成的隱式轉換,致使索引失效。

【11 參考】建立索引時避免有以下極端誤解: 1)寧濫勿缺。認爲一個查詢就須要建一個索引。 2)寧缺勿濫。認爲索引會消耗空間、嚴重拖慢更新和新增速度。 3)抵制唯一索引。認爲業務的唯一性一概須要在應用層經過「先查後插」方式解決

【12 強制】不要使用 count(列名)或 count(常量)來替代 count(*),count(*)是 SQL92 定義的 標準統計行數的語法,跟數據庫無關,跟 NULL 和非 NULL 無關。 說明:count(*)會統計值爲 NULL 的行,而 count(列名)不會統計此列爲 NULL 值的行。

【13 強制】count(distinct col) 計算該列除 NULL 以外的不重複行數,注意 count(distinct col1, col2) 若是其中一列全爲 NULL,那麼即便另外一列有不一樣的值,也返回爲 0。

【14 強制】使用 ISNULL()來判斷是否爲 NULL 值。 

==說明:NULL 與任何值的直接比較都爲 NULL。 1) NULL<>NULL 的返回結果是 NULL,而不是 false。 2) NULL=NULL 的返回結果是 NULL,而不是 true。 3) NULL<>1 的返回結果是 NULL,而不是 true。

【15 參考】TRUNCATE TABLE 比 DELETE 速度快,且使用的系統和事務日誌資源少,但 TRUNCATE 無事務且不觸發 trigger,有可能形成事故,故不建議在開發代碼中使用此語句。 說明:TRUNCATE TABLE 在功能上與不帶 WHERE 子句的 DELETE 語句相同。

 

4.15)【ORM映射】


【01 推薦】不要寫一個大而全的數據更新接口。傳入爲 POJO 類,無論是否是本身的目標更新字 段,都進行 update table setc1=value1,c2=value2,c3=value3; 這是不對的。執行 SQL 時,不要更新無改動的字段,一是易出錯;二是效率低;三是增長 binlog 存儲。

【02 參考】中的 compareValue 是與屬性值對比的常量,通常是數字,表示相等時帶 上此條件;表示不爲空且不爲 null 時執行;表示不爲 null 值時 執行。 

3、番外--Git的使用

    【01 常見Git命令】    


#【001】

統一律念:工做區:改動(增刪文件和內容)

暫存區:輸入命令:git add 改動的文件名,這次改動就放到了 ‘暫存區’

本地倉庫(簡稱:本地):輸入命令:git commit 這次修改的描述,這次改動就放到了 ’本地倉庫’,每一個 commit,我叫它爲一個 ‘版本’。

遠程倉庫(簡稱:遠程):輸入命令:git push 遠程倉庫,這次改動就放到了 ‘遠程倉庫’(GitHub 等)

commit-id:輸出命令:git log,最上面那行 commit xxxxxx,後面的字符串就是 commit-id

#【002】

#編輯修改等

git show # 顯示某次提交的內容 git show $id

git checkout <file-name> #放棄工做區的修改 ,相似於 svn revert

git revert <commit-id> #以新增一個 commit 的方式還原某一個 commit 的修改

#比較diff

git diff <branch1>..<branch2> # 在兩個分支之間比較

git diff --staged # 比較暫存區和版本庫差別

git diff --cached # 比較暫存區和版本庫差別

git whatchanged --since='2 weeks ago' #查看兩個星期內的改動

git diff --word-diff #詳細展現一行中的修改

#查看提交記錄

git log -p -2 # 查看最近兩次詳細修改內容的diff

git blame <file-name> #查看某段代碼是誰寫的, blame 的意思爲‘責怪’,你懂的。

git reflog #顯示本地更新過 HEAD 的 git 命令記錄 ,相似 shell的 history

git log --all --grep='<given-text>' #在 commit log 中查找相關內容

#Git 本地分支管理

git branch -r # 查看遠程分支

git branch <new_branch> # 建立新的分支

git co <branch> # 切換到某個分支

git co $id # 把某次歷史提交記錄checkout出來,但無分支信息,切換到其餘分支會自動刪除

git branch -d <branch> # 刪除某個分支

git branch -vv 展現本地分支關聯遠程倉庫的狀況

git merge <branch> # 將branch分支合併到當前分支

#Git暫存管理

git stash # 暫存

git stash list # 列全部stash

git stash apply # 恢復暫存的內容

git stash drop # 刪除暫存區

#Git遠程分支管理

git pull --no-ff # 抓取遠程倉庫全部分支更新併合併到本地,不要快進合併

git push # push全部分支-- 要慎用,仍是要push具體的分支好一點 https://www.cnblogs.com/djiankuo/p/6492533.html

git push -u origin develop # 首次將本地develop分支提交到遠程develop分支,而且track

git push origin master # 將本地主分支推到遠程主分支

git push origin dev_20190513_registrationpath #咱們的java項目 數據統計的Git push命令

#Git遠程倉庫管理

git remote -v # 查看遠程服務器地址和倉庫名稱

git remote show origin # 查看遠程服務器倉庫狀態

【02 】本地倉庫「三棵樹」    


本地倉庫由 git 維護的三棵「樹」組成。

1)【圖01】本地倉庫git 三棵樹


本地倉庫git 三棵樹

2)【圖02】git本地三棵樹的相互轉化命令:https://josh-persistence.iteye.com/blog/2215214

 


git本地三棵樹的相互轉化命令

3)三棵樹的更詳細的命令示意圖


三棵樹的更詳細的命令示意圖

 

git commit的時候,只是提交的 緩存區內的內容(若是你git add過,不然也等同你本地工做區內容的提交)

== git add能夠實現我以前在 雲主機上保存臨時文件的tmpdjp的操做

==git diff 對比的是工做區和 緩存區的區別

==git diff --cached 對比是 緩衝區和本地的 head版本庫的對比

另外須要指出來的是 git stash 不在上面的「三顆樹」裏,git stash 是暫存區,區別於 緩存區「stage」 

git stash的用法見 https://www.cnblogs.com/tocy/p/git-stash-reference.html

4、寫在最後

    簡單的摘錄,見仁見智,但願喜歡Java開發的同窗能從中收益。

    歡迎關注個人微信公衆號哈 「 程序員的文娛情懷」 http://t.cn/RotyZtu 😊


歡迎關注個人微信公衆號哈 「 程序員的文娛情懷」
相關文章
相關標籤/搜索