You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java优化疑问:用数组查询还是OR语句?字符替代字符串更优?

问题解答

一、直接OR语句 vs 数组流查询的优劣

先纠正示例1的错误

你示例1里用==比较字符串是错误的!Java中==比较的是字符串对象的引用地址,不是内容。如果number是通过new String("6")创建的,或者不是常量池里的对象,==会返回false,正确写法应该用equals():

String number = "6";
if (number.equals("0") || number.equals("2") || number.equals("6") || number.equals("8")) {
    System.out.println("TRUE");
}

性能与场景对比

  • 直接OR语句:性能最优,没有任何额外的对象创建、流初始化开销,就是简单的条件判断,适合选项数量少(比如你这4个)且固定不变的场景。缺点是如果后续要添加/删除选项,得修改if条件,维护起来稍麻烦。
  • 数组流方式:代码更简洁,选项集中在数组里,修改选项只需要改数组。但流的创建有一定开销,对于4个元素的场景,性能比直接OR差一点,但日常业务场景中这点差异可以忽略不计。适合选项可能变动、数量较多的场景。

二、更优的查询方式

推荐两种更实用的方案:

1. 使用HashSet

初始化一个静态不可变的HashSet,查询时用contains()方法,时间复杂度O(1),性能稳定,且维护方便:

// 建议把Set定义为静态常量,只初始化一次
private static final Set<String> VALID_NUMBERS = new HashSet<>(Arrays.asList("0", "2", "6", "8"));

public static void main(String[] args) {
    String number = "6";
    if (VALID_NUMBERS.contains(number)) {
        System.out.println("TRUE");
    }
}

2. 使用字符串Switch语句

Java 7及以上支持字符串类型的switch,代码结构清晰,性能也不错:

String number = "6";
switch (number) {
    case "0":
    case "2":
    case "6":
    case "8":
        System.out.println("TRUE");
        break;
    default:
        // 处理不符合的情况
        break;
}

三、改为char类型是否更高效易懂?

是的,非常推荐改成char类型:

  1. 性能更优:char是基本数据类型,内存占用远小于String(String是对象,包含额外的对象头、字符数组等开销)。而且char比较可以直接用==,不用调用equals(),减少方法调用开销。
  2. 语义更清晰:你存储的是单个数字字符,用char比String更贴合场景,别人看代码一眼就知道这是单个字符,而不是可能包含多个字符的字符串。
  3. 代码更简洁:
char number = '6';
if (number == '0' || number == '2' || number == '6' || number == '8') {
    System.out.println("TRUE");
}

如果用Set的话,char版本也更高效:

private static final Set<Character> VALID_CHARS = new HashSet<>(Arrays.asList('0', '2', '6', '8'));

public static void main(String[] args) {
    char number = '6';
    if (VALID_CHARS.contains(number)) {
        System.out.println("TRUE");
    }
}

内容的提问来源于stack exchange,提问作者Hero586

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 02:45:27