IntelliJ建议用.lengthCompare(X)==0替代.length==X,为何更优?
我当初第一次看到IntelliJ弹这个提示的时候满脸问号——好好的str.length() == 5为啥要改成str.lengthCompare(5) == 0?多敲好几个字符,完全没必要啊!后来仔细查了下Java的API和IntelliJ的提示说明,才明白这背后其实是为了代码的通用性和安全性,主要有这几个核心原因:
适配所有CharSequence实现,通用性更强
Java 11之后,CharSequence接口新增了lengthCompare(int)方法,所有实现这个接口的类(比如String、StringBuilder、CharBuffer,还有你自己写的自定义字符序列)都能直接调用。如果你现在写的是String的length() == X,哪天重构代码把变量改成CharSequence类型,就不用修改这行比较逻辑;而且如果是处理第三方库返回的CharSequence,用lengthCompare()也不用关心具体实现的length()会不会有问题。安全处理超大长度的字符序列
虽然咱们日常用的String底层是char数组,最大长度只能到Integer.MAX_VALUE(大概20亿字符),但有些特殊的CharSequence实现(比如处理超大流式文本、或者内存映射文件的字符序列)可能用long来存储长度,这时候调用length()会直接抛出IllegalStateException(因为它必须返回int,没法表示超过int范围的数值)。而lengthCompare()内部会用正确的数值比较逻辑(比如把参数转成long和实际长度对比),避免这种异常。更连贯的比较语义(延伸场景更实用)
虽然判断“等于”的时候lengthCompare() == 0确实比length() == X冗长,但如果是判断长度大于、小于某个值,lengthCompare()的写法更统一:比如cs.lengthCompare(10) > 0就表示长度大于10,cs.lengthCompare(5) < 0表示小于5,不用来回写cs.length() > 10、cs.length() < 5。尤其是在复杂的条件判断或者链式调用里,这种语义更连贯,可读性反而更高。
当然啦,如果你的代码明确只会处理String,而且永远不会涉及超大长度的场景,那length() == X完全没问题,甚至更简洁。但IntelliJ是从“代码健壮性、可维护性”的角度出发,推荐一种更通用的写法,避免未来重构或者扩展时踩坑。
内容的提问来源于stack exchange,提问作者Yuchen

