1. 方法命名
public List<UserInfo> 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() {
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
有用,其他的都是未实现服务。那你看到有啥问题了吗?-
这点代码乍一看没什么问题,看明白了就是代码里下砒霜!它的目的就一个,要让所有的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万数据
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
进行遍历。