java - 哪种方法更好地比较方法检查中的值或检查它是否存在于数组中?
问题描述
考虑我有一个场景,当它满足条件时需要完成某些很棒的任务。
public class Check101 {
public static boolean validColor(String color) {
return color.equals("RED")
|| color.equals("BLUE")
|| color.equals("GREEN");
}
public static List<String> validColorList= new ArrayList<String>(Arrays.asList("RED","GREEN","BLUE"));
public static void main(String[] args) {
String color = "RED";
if (validColor(color)) {
//do awesome work
}
if(validColorList.contains(color)){
//do awesome work
}
}
}
现在它看起来很好,因为它只有原色,如果有效颜色增加到假设(i)100 和(ii)1600 万色怎么办。那么哪个是最好的方法呢?请注意,我受限于不使用 Set/HashMap 或 O(1) 可搜索容器,并被要求仅回答这个奇怪的场景。
解决方案
当您使用 aList
时,没有理由将 via 生成的列表复制Arrays.asList("RED","GREEN","BLUE")
到另一个ArrayList
. 您可以简单地声明它
public static List<String> validColorList = Arrays.asList("RED","GREEN","BLUE");
当您不允许使用 aSet
时,两种方法都会执行线性搜索,这在性能方面同样糟糕。但是列表方法更易于维护,因为添加另一个值只需要添加该值(到初始化列表),而不是添加另一个if
语句。
这可能会扩展到 100 个值,而即使是线性搜索的性能缺陷也可能与 100 个值无关,只要您不经常执行查找,例如在紧密循环中。
但是,这两种方法都不能用于 16M 色。这甚至不是不切实际或具有灾难性的表现,这是不可能的。Java 方法的最大代码大小为 65536 字节,这适用于持有if
语句的普通方法或构造List
. 每个表达式或语句都需要几个字节,因此这两种方法都将在几千个值的阈值处停止工作。即使您将代码拆分为多个方法,您可以在单个类中定义的字符串常量的数量也少于 65535。
要管理更多的值,您应该将名称列表作为资源嵌入到您的代码中,并使用类似的东西,例如
public static final List<String> validColorList;
static {
try {
validColorList = Files.readAllLines(
Paths.get(MyClass.class.getResource("color-list").toURI()));
} catch(IOException|URISyntaxException ex) {
throw new ExceptionInInitializerError(ex);
}
}
但是,当我们进行此类更改时,没有理由对另一个强烈推荐的更改犹豫不决:
public static final Set<String> validColorList;
static {
try {
validColorList = new HashSet<>(Files.readAllLines(
Paths.get(SO59045501.class.getResource("color-list").toURI())));
} catch(IOException|URISyntaxException ex) {
throw new ExceptionInInitializerError(ex);
}
}
if
链接语句的方法没有等效的方法。
推荐阅读
- spring - 何时使用 new 运算符创建对象或在测试类时使用自动连线?
- python - python:如何将类函数结果分配给同一类中的类变量
- android - 如何从片段打开新视图?
- android - 在片段内调用 RecyclerView 适配器方法
- javascript - iOS 11.4 Safari 不尊重“触摸动作:操纵”
- java - 如何让一个按钮在每次按下时随机播放声音列表?
- date - bat 脚本 - 仅在给定的多个不同日期运行命令
- mysql - 如何在 SELECT 语句的列部分使用从 DATE_FORMAT() 返回的值
- html - Bootstrap 卡中的左对齐按钮
- regex - 我可以在我想要的字符串之前或之后 grep 一定数量的行吗?