上周三,我盯着监控报警,手抖得差点把咖啡泼在键盘上。 用户登录时,系统突然返回“用户名重复”,但明明没重复。 一查日志——一个static变量在多线程下被改了。 不是代码逻辑错,是static用错了。 这破事,我干过第3次了。 今天不扯理论,只说点血淋淋的实战经验。 --- 一、static:别把它当“全局变量”用 1. static是什么? static就是“类的”,不是“对象的”。 类加载一次,static变量就初始化一次,所有对象共享。 java public class User { public static int userCount = ...
上周在团队群里,Java老哥@我:“兄弟,你写的Kotlin工具类,我调用的时候总报错,是不是写错了?” 我点开他的代码——DateUtils.formatDate(date)。 我:??? 然后我翻出自己写的Kotlin类,发现确实没加@JvmStatic。 当时真想把键盘砸了:Kotlin的companion object在Java里根本不是静态方法,得写成DateUtils.Companion.formatDate(date)。 Java同事要写这么长,能不骂人吗? --- 为什么Java调用Kotlin总踩坑? Kotlin没有static,所有“静态”...
上周五,我盯着屏幕,手抖得差点把咖啡泼在键盘上。 用户输入"10000000000"(十亿),系统返回"-1410065408"。不是代码写错了——是int溢出了。这破事,我干过第7次了。 这不是个例。我见过太多团队,为了"省内存"用int存ID,结果第2147483648单直接报错;为了"方便"用float算钱,结果0.1+0.2=0.30000000000000004;甚至有人用==比较Integer,结果用户权限乱了。 今天不扯理论,只说点血淋淋的实战经验。 --- 一、别让"默认类型"坑了你 Java的默认类型陷阱,比你想象的多。 1. int不是万能的 java i...
别让Java数据类型坑了你:一个被“int”逼到崩溃的程序员手记 上周三,我盯着屏幕,手抖得差点把咖啡泼在键盘上。 用户输入“10000000000”(十亿),系统返回“-1410065408”。 不是代码写错了——是int溢出了。 这破事,我干过第7次了。 今天不扯理论,只说点血淋淋的实战经验。 --- 一、基本数据类型:别被“默认”骗了 Java的8种基本类型,别信网上说的“int能存20亿”。 真实情况是: int最大值是 2,147,483,647(21亿),超了就变负数。 去年有个订单系统,用int存订单ID,结果第2147483648单直...
从Java到Kotlin:那些年我踩过的变量、控制和函数坑 去年接手一个老Android项目,老板说“用Kotlin重写吧”。我心想:不就是加个val/var?结果第一天就翻车了——我把val写成var,结果在循环里改了不该改的值,线上日志刷屏“空指针”。那会儿真想把键盘砸了。后来才明白:Kotlin的语法不是“换个词”,是把Java里那些啰嗦的细节全藏起来了。今天不整大道理,就聊聊我怎么从“变量都分不清”到“写函数像写诗”的。 --- 一、变量:别让val和var把你绕晕 Java式思维: String name = "老王"; int age = 30; (变量...
去年,我负责的电商平台在618前夜崩溃了——订单系统突然卡死,后台日志全是"java.lang.IllegalMonitorStateException"。排查了整整24小时,最后发现是并发问题。不是代码逻辑错,是我不懂Java并发的坑。今天不讲理论,只说人话,配上我踩过的血泪。 --- 1. i++不是原子操作,别信"简单"二字 坑点:count++看起来简单,但实际是读-改-写三步,多线程下会丢失更新。 实测:1000个线程同时count++,最终值平均只有850(不是1000)。 解决方案: java // ❌ 错误:普通int int count = 0; // 多线程下会...
去年冬天,我们团队的订单系统在双11前崩溃了——用户下单后,状态一直显示“处理中”,但后台数据库没记录。排查了整整一周,最后发现是并发问题。不是代码逻辑错,而是我对Java内存模型一窍不通。今天不讲理论,只说人话,配上我踩过的坑。 --- 一、原子性:你以为的“一步”其实是“三步” 问题:count++ 看起来是原子操作,但实际是 读-改-写 三步: java int count = 0; // 线程A执行:读count=0 → 改为1 → 写回 // 线程B执行:读count=0 → 改为1 → 写回 // 结果:count=1,但应该=2 实测:1000个线程同时count++,最...
上个月,我帮一个团队优化Kotlin代码,发现他们用了1000行的list.filter { ... }.map { ... },结果导致内存飙升30%。别以为这些只是"小问题",在Kotlin里,细节决定性能。以下是我用过、踩过坑的优化技巧,不讲理论,只说干货。 --- 一、数据结构:别让集合操作"吃掉"你的内存 1. 序列(Sequence)是你的救星 kotlin // ❌ 低效:创建了中间集合 val result = list.filter { it > 0 }.map { it 2 } // ✅ 高效:惰性计算,避免中间集合 val result = list.asS...