新来的小哥这样写代码!同事直呼“中毒了”~
阅读本文大概需要 5.5 分钟。
沉淀、分享、成长,让自己和他人都能有所收获!?
目录
一、前言
二、代码有毒!
1. 方法命名
2. 最佳排序
3. 有点烧脑
4. 迷之求和
5. 花里胡哨
6. 数字判断
7. 代码健壮
8. 性能优化
9. 无用日志
10. 耗时遍历
三、总结
一、前言
学过的代码记不住?方式不对才记不住,你这么记!
Git:上厕所不叫上厕所,叫拉分支! Socket:厕所就是服务器,坑就是端口! 队列:上厕所叫入队列,先进先出! 栈:去厨房?叫进栈,后进先出! 架构:三居的格局叫MVC,四居的格局叫DDD! 理论:系统结构设计定的好,有点bug没问题,能改。这就是茅坑跟坐便的区别。
二、代码有毒!
以下代码用好了升职加薪,用不好开除走人!
1. 方法命名
public List queryBitchUserInfo(String req) {
return null;
}
指数:⭐⭐⭐ 解毒:小哥应该是想写批量查询用户的方法名,结果把 batch
(批量),写成了bitch
(婊子)点评:接口是上午写的,人是下午走的!
2. 最佳排序
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();
}
}
指数:⭐⭐⭐ 解毒:用数字休眠时常排序,谁醒来的时间早,谁就先输出。 点评:思路清奇,要不是这次排序等了一天,老板也不能踢他!
3. 有点烧脑
@Test
public void test_idx_hashMap() {
Mapmap = 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
有用,其他的都是未实现服务。那你看到有啥问题了吗?这点代码乍一看没什么问题,看明白了就是代码里下砒霜!它的目的就一个,要让所有的key成一个链表放到HashMap中,而且把有用的key放到链表的最后,增加get时的耗时! 首先, new HashMap<>(64);
为啥默认初始化64个长度?因为默认长度是8,插入元素时,当链表长度为8时候会进行扩容和链表树化判断,此时就会把原有的key散列了,不能让所有key构成一个时间复杂度较高的链表。其次,所有的 key
都是刻意选出来的,因为他们在HashMap
计算下标时,下标值都为0,idx =(size - 1) & (key.hashCode() ^ (key.hashCode() >>> 16))
,这样就能让所有key
都散列到同一个位置进行碰撞。而且单词insincere
的意思是;不诚恳的、不真诚的
!最后,前7个key其实都是废 key
,不起任何作用,只有最后一个 key 有服务。那么这样就可以在HashMap中建出来很多这样耗时的碰撞链表,当然要满足0.75
的负载因子,不要让HashMap扩容。整体的效果如下图,key并没有均匀散列; 点评:能写出这种代码就是薪资没给够,等着代码优化提加薪呢!
4. 迷之求和
@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;点评:这种错误就跟开车闯红灯似的,轻则扣分罚款,重则倾家荡产。
5. 花里胡哨
private boolean checkAge(int age ) {
boolean result;
if (age >18)
{
result=true;
} else {
result=false;
}
return result;
}
指数:⭐ 解毒:代码可以运行,但是可以优化为 return age > 18
。点评:你们公司是按照代码行数打绩效?不做格式化、不整洁、不看IDEA工具提示,代码是写给人看的!啥有不是!
6. 数字判断
public boolean isNumber(String str) {
try {
Integer.parseInt(str);
return true;
} catch (Exception e) {
return false;
}
}
指数:⭐⭐ 解毒:判断是不是数字,不抛异常就是,抛异常就不是。这可以使用 StringUtils
工具包判断,也可以自己写正则判断。点评:这代码真烧,用异常做业务。这不是把?蘑菇给狗狗吃吗!?狗狗没死你到是吃蘑菇呀,你吃狗粑粑。
7. 代码健壮
public void neverStop(){
//一直循环
while (true) {
try {
//业务处理流程
} catch (Exception e) {
//抓到异常,不处理、不打日志、就是不要停,继续跑
continue ;
}
}
}
指数:⭐⭐⭐ 解毒:把可能抛异常的代码用tryCatch包起来,一直跑,遇到异常也要跑。这个时候遇到异常,要做一些流程处理,最起码要打日志和报警。 点评:业务开发很多时候都是为了解决异常流程,就像 擦屁屁的纸80%的面积是保护手的。怎么滴,我看你这代码,是非要一直抠破呀!
8. 性能优化
// APP首页查询,优化前
public void queryInitInfo(){
Thread.sleep(3000);
}
// APP首页查询,优化后
public void queryInitInfo(){
Thread.sleep(500);
}
指数:⭐⭐⭐ 解毒:没啥解毒的,一公斤鹤顶红兑了一口口水! 点评:点评不了啦,抓到就开了吧!
9. 无用日志
// 规则引擎校验
public boolean ruleEngine(MatterReq req) {
try {
// 业务流程
} catch (Exception e) {
logger.error(e); // 只打异常,不打入参信息
}
}
指数:⭐ 解毒:日志里只打了异常,没有入参信息,当你的方法有大量的调用时,很难快速定位问题。 点评:下次记得把 产品经理
也打日志里去,要死一起死!
10. 耗时遍历
@Test
public void test_LinkedList() {
// 初始化100万数据
Listlist = new LinkedList (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
进行遍历。点评:根基不牢,地动山摇!一知半解,坑了老铁!
三、总结
好书推荐
推荐阅读:
IDEA 上位?不!Eclipse Theia 1.0 发布!
微信扫描二维码,关注我的公众号
朕已阅
评论