握草,你竟然在代码里下毒!

小傅哥 等级 841 1 0
标签: Java

握草,你竟然在代码里下毒! 作者:小傅哥 博客:https://bugstack.cn

沉淀、分享、成长,让自己和他人都能有所收获!😄

一、前言

学过的代码记不住?方式不对才记不住,你这么记!

  • Git:上厕所不叫上厕所,叫拉分支!
  • Socket:厕所就是服务器,坑就是端口!
  • 队列:上厕所🚽叫入队列,先进先出!
  • :去厨房🥣叫进栈,后进先出!
  • 架构:三居的格局叫MVC,四居的格局叫DDD!
  • 理论:系统结构设计定的好,有点bug没问题,能改。这就是茅坑跟坐便的区别。

除了有点味道以外,这回是不记住了,我们编程写代码的过程和我们日常生活的例子,往往都是这样可以对应上,有了真实可以触及的实物,再去了解编程就会更加容易,也很难忘记。但可能会写着写着代码,就傻笑起来!

除了这些正能量学习的例子,我们接下来再看看哪些有毒的代码!

二、代码有毒!

以下代码用好了升职加薪,用不好开除走人!

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进行遍历。
  • 点评: 根基不牢,地动山摇!一知半解,坑了老铁!

三、总结

好的代码千篇一律,差的程序升值加薪!,这些有毒的代码,淋漓尽致的展示了程序员的才华出众,同时也严重怀疑就是钱给少了!

敲黑板:想在这编码这条路上走的更远,还是需要脚踏实地的把根基打牢。所以非常推进你阅读以下系列专栏文章,夯实基础、拓展能力、提升眼界;

好!,本篇文章就到这里,有意思的代码还有很多,欢迎在评论区留下你的鬼畜代码!

收藏
评论区

相关推荐

握草,你竟然在代码里下毒!
作者:小傅哥 博客:https://bugstack.cn(https://bugstack.cn) 沉淀、分享、成长,让自己和他人都能有所收获!😄
带你全面了解 Flutter,它好在哪里?它的坑在哪里? 应该怎么学?
回顾了这段时间解答关于 Flutter 的各种问题后,我突然发现很多刚刚接触 Flutter 的萌新,对于 Flutter 都有着不同程度的误解,而每次重复的解释又十分浪费时间,最终我还是决定写篇文章来做个总结。 内容有点长,但是相信能帮你更好地去认识 Flutter 。 Flutter 的起源 Flutter 的诞生其实比较有意思,Flutter
Vue - 深入浅出 Mixin
什么 mixinmixin, 意为混入。比如去买冰激凌,我先要一点奶油的,再来点香草的。我就可以吃一个奶油香草的冰激凌。如果再加点草莓,我可以同时吃三个口味的冰激凌。 代码表示假设把你已有的奶油味的称为 base,把要添加的味道称为 mixins。用 js 伪代码可以这么来写:const base     hasCreamFlavor()      re
Java开发学习路线,看完这篇就够了
Java 开发,我们应该从哪里开始学?应该学习哪些东西?应该按照什么样的顺序来学?Java 开发涉及到的领域非常多,对于开发者而言要掌握的东西也非常多,初入行的小伙伴甚至觉得这些要掌握的东西非常杂乱,其实不然!所有要学习的东西都是有内在关联的。大仙今天就来和大家捋一捋 Java 学习路线图,一起来看看都有哪些东西需要掌握,以及要按照什么样的顺序来学习。](h
2W 字图解 Redis,面试必过必杀技!!
(给架构师修行之路加星标,提升数据技能) > 来源:业余草 > > http://dwz.date/dTu5 今天,“我”不自量力的面试了某大厂的 开发岗位,迎面走来一位风尘仆仆的中年男子,手里拿着屏幕还亮着的 Mac。他冲着我礼貌的笑了笑,然后说了句“不好意思,让你久等了”,然后示意我坐下,说:“我们开始吧,看了你的简历,觉得你对 Redis 应该
Java separatorChar 如何在Java里面添加 -
Java手册 ------ ### separatorChar public static final char separatorChar 与系统有关的默认名称分隔符。此字段被初始化为包含系统属性 `file.separator` 值的第一个字符。在 UNIX 系统上,此字段的值为 `'/'`;在 Microsoft Windows 系统上,
Java中的常用异常处理方法
觉得自己是一个Java专家吗?是否肯定自己已经全面掌握了Java的异常处理机制?在下面这段代码中,你能够迅速找出异常处理的六个问题吗? 1 OutputStreamWriter out = ... 2 java.sql.Connection conn = ... 3 try { // ⑸ 4  Statement stat = conn.createSta
Java学习路线(完整详细版)
 科技在进步,时代也在发展,很多人的理想再也不是骑马喝酒走四方,而是学习掌握java技术,真正的实现高薪就业,说到学习Java,我们今天就来说说Java开发需要学习的内容,说说java学习路线,说说Java学习的课程内容。   Java学习大致分为四大阶段,具体内容如下:   **第一阶段——Java基础**   Java的学习内容从计算机基本概念,D
Java性能调优是道坎,阿里京东美团就卡这了
在进行性能测试时,接口响应时间长,吞吐量低,是否让你无从下手? 在高并发下,JVM 中 Full GC 异常,JVM 堆内存溢出,常常令你焦头烂额? 业务增长迅猛,大量读写操作单表单库,造成数据库死锁,只能目瞪口呆? 面试官一问性能调优就歇菜,还是答不到点子上? 对于很多程序员来说,Java性能
java架构师之路:推荐的15本书
** 一 对于没有Java编程经验的程序员要入门,随便读什么入门书籍都一样,这个阶段需要你快速的掌握Java基础语法和基本用法,宗旨就是“囫囵吞枣不求甚解”,先对Java熟悉起来再说。用很短的时间快速过一遍Java语法,连懵带猜多写写代码,要“知其然”。 在有了一定的Java编程经验之后,你需要“知其所以然”了。这个时候《Java编程
volatile 手摸手带你解析
![](https://oscimg.oschina.net/oscnet/up-dd725cad8a8b1bffe9ae4c3393eccddac22.JPEG) 前言 == volatile 是 Java 里的一个重要的指令,它是由 Java 虚拟机里提供的一个轻量级的同步机制。一个共享变量声明为 volatile 后,特别是在多线程操作时,正确使用
HashMap 和 Hashtable 的 6 个区别,最后一个没几个人知道!
![](https://oscimg.oschina.net/oscnet/3bcbfbae-5fe9-4e66-9190-941b09299a8d.png) HashMap 和 Hashtable 是 Java 开发程序员必须要掌握的,也是在各种 Java 面试场合中必须会问到的。 但你对这两者的区别了解有多少呢? **现在,栈长我给大家总结一下,或
SpringBoot 深度调优,JVM 调优教程
编辑:业余草 来源:https://www.xttblog.com/?p=4937 ------------------------------------------- **项目调优** -------- 作为一名工程师,项目调优这事,是必须得熟练掌握的事情。 在SpringBoot项目中,调优主要通过配置文件和配置JVM的参数的方式进
SpringBoot+SpringSecurity+JWT整合实现单点登录SSO史上最全详解
你知道的越多,不知道的就越多,业余的像一棵小草! ------------------------ 你来,我们一起精进!你不来,我和你的竞争对手一起精进! 编辑:业余草 ------ blog.csdn.net/qq\_38526573/article/details/103409430 ------------------------------
SpringBoot+SpringSecurity+JWT整合实现单点登录SSO史上最全详解
你知道的越多,不知道的就越多,业余的像一棵小草! ------------------------ 你来,我们一起精进!你不来,我和你的竞争对手一起精进! 编辑:业余草 ------ blog.csdn.net/qq\_38526573/article/details/103409430 ------------------------------