做者:小傅哥
博客:https://bugstack.cnhtml
沉澱、分享、成長,讓本身和他人都能有所收穫!😄
學過的代碼記不住?方式不對才記不住,你這麼記!
java
除了有點味道之外,這回是不記住了,咱們編程寫代碼的過程和咱們平常生活的例子,每每都是這樣能夠對應上,有了真實能夠觸及的實物,再去了解編程就會更加容易,也很難忘記。但可能會寫着寫着代碼,就傻笑起來!程序員
除了這些正能量學習的例子,咱們接下來再看看哪些有毒的代碼!編程
如下代碼用好了升職加薪,用很差開除走人!
設計模式
public List<UserInfo> queryBitchUserInfo(String req) { return null; }
batch
(批量),寫成了bitch
(婊子)public static void main(String[] args) { int[] numbers = new int[]{2, 30000000, 1, 6, 40000000, 5}; for (final int number : numbers) { new Thread(new Runnable() { @Override public void run() { try { Thread.sleep(number); System.out.println(number); } catch (InterruptedException ignore) { } } }).start(); } }
@Test public void test_idx_hashMap() { Map<String, String> map = new HashMap<>(64); map.put("alderney", "未實現服務"); map.put("luminance", "未實現服務"); map.put("chorology", "未實現服務"); map.put("carline", "未實現服務"); map.put("fluorosis", "未實現服務"); map.put("angora", "未實現服務"); map.put("insititious", "未實現服務"); map.put("insincere", "已實現服務"); long startTime = System.currentTimeMillis(); for (int i = 0; i < 100000000; i++) { map.get("insincere"); } System.out.println("耗時(initialCapacity):" + (System.currentTimeMillis() - startTime)); }
解毒:這是一個定義HashMap
存放業務實現key,經過key調用服務的功能。但這裏的key
,只有insincere
有用,其餘的都是未實現服務。那你看到有啥問題了嗎?性能優化
new HashMap<>(64);
爲啥默認初始化64個長度?由於默認長度是8,插入元素時,當鏈表長度爲8時候會進行擴容和鏈表樹化判斷,此時就會把原有的key散列了,不能讓全部key構成一個時間複雜度較高的鏈表。key
都是刻意選出來的,由於他們在 HashMap
計算下標時,下標值都爲0,idx = (size - 1) & (key.hashCode() ^ (key.hashCode() >>> 16))
,這樣就能讓全部 key
都散列到同一個位置進行碰撞。並且單詞 insincere
的意思是;不誠懇的、不真誠的
!key
,不起任何做用,只有最後一個 key 有服務。那麼這樣就能夠在HashMap中建出來不少這樣耗時的碰撞鏈表,固然要知足0.75
的負載因子,不要讓HashMap擴容。@Test public void test_add(){ int num = 0; for (int i = 0; i < 100; i++) { num = num++; } System.out.println(num); }
num
結果爲 0,num++
根本沒起啥做用。由於後++,是先用結果,在++操做,不會給賦值。正確寫法是:num = ++ num;private boolean checkAge(int age ) { boolean result; if (age >18) { result=true; } else { result=false; } return result; }
return age > 18
。public boolean isNumber(String str) { try { Integer.parseInt(str); return true; } catch (Exception e) { return false; } }
StringUtils
工具包判斷,也能夠本身寫正則判斷。public void neverStop(){ //一直循環 while (true) { try { //業務處理流程 } catch (Exception e) { //抓到異常,不處理、不打日誌、就是不要停,繼續跑 continue ; } } }
擦屁屁的紙80%的面積是保護手的。怎麼滴,我看你這代碼,是非要一直摳破呀!
// APP首頁查詢,優化前 public void queryInitInfo(){ Thread.sleep(3000); } // APP首頁查詢,優化後 public void queryInitInfo(){ Thread.sleep(500); }
// 規則引擎校驗 public boolean ruleEngine(MatterReq req) { try { // 業務流程 } catch (Exception e) { logger.error(e); // 只打異常,不打入參信息 } }
產品經理
也打日誌裏去,要死一塊兒死!@Test public void test_LinkedList() { // 初始化100萬數據 List<Integer> list = new LinkedList<Integer>(1000000); // 遍歷求和 int sum = 0; for (int i = 0; i < list.size(); i++) { sum += list.get(i); } }
list.get(i)
都是從鏈表的頭開始查找,與ArrayList
不一樣,LinkedList
它時間複雜度是O(n)。那若是說你不知道對方傳過來的是LinkedList
仍是ArrayList
呢,其實能夠經過list instanceof RandomAccess
進行判斷。ArrayList
有隨機訪問的實現,LinkedList
是沒有。同時也可使用加強的for循環或者Iterator
進行遍歷。好的代碼千篇一概,差的程序升值加薪!,這些有毒的代碼,淋漓盡致的展現了程序員的才華出衆,同時也嚴重懷疑就是錢給少了!服務器
敲黑板:想在這編碼這條路上走的更遠,仍是須要腳踏實地的把根基打牢。因此很是推動你閱讀如下系列專欄文章,夯實基礎、拓展能力、提高眼界;數據結構
好!,本篇文章就到這裏,有意思的代碼還有不少,歡迎在評論區留下你的鬼畜代碼!架構