作者:小傅哥
博客:https://bugstack.cn
沉淀、分享、成长,让自己和他人都能有所收获!😄
学过的代码记不住?方式不对才记不住,你这么记!
除了有点味道以外,这回是不记住了,我们编程写代码的过程和我们日常生活的例子,往往都是这样可以对应上,有了真实可以触及的实物,再去了解编程就会更加容易,也很难忘记。但可能会写着写着代码,就傻笑起来!
除了这些正能量学习的例子,我们接下来再看看哪些有毒的代码!
以下代码用好了升职加薪,用不好开除走人!
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
进行遍历。好的代码千篇一律,差的程序升值加薪!,这些有毒的代码,淋漓尽致的展示了程序员的才华出众,同时也严重怀疑就是钱给少了!
敲黑板:想在这编码这条路上走的更远,还是需要脚踏实地的把根基打牢。所以非常推进你阅读以下系列专栏文章,夯实基础、拓展能力、提升眼界;
好!,本篇文章就到这里,有意思的代码还有很多,欢迎在评论区留下你的鬼畜代码!