有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

如果可能的话,传递引用或使用硬编码对象更好吗

是否值得编写更好的代码(ClassB),而不是使用两种单独的检查方法?所以主要的问题是:假设类A比类B快一点,我是对的,还是它的差异并不重要,传递变量(在这种情况下是列表)并不会真正影响生产率,即使这些列表每个都有1000个对象?抱歉,如果这个问题是愚蠢的

 public class ClassA implements Runnable {

    ArrayList<Obj> list1;
    ArrayList<Obj> list2;

    boolean checkList1() {
        for (Obj str : list1) {
            if (str.check()) {
                return true;
            }
        }
        return false;
    }

    boolean checkList2() {
        for (Obj str : list2) {
            if (str.check()) {
                return true;
            }
        }
        return false;
    }

    @Override
    public void run() {
        checkList1();
        checkList2();
    }
}

或者

 public class ClassB implements Runnable {

    ArrayList<Obj> list1;
    ArrayList<Obj> list2;

    boolean checkAnyList(ArrayList<Obj> list) {
        for (Obj str : list) {
            if (str.check()) {
                return true;
            }
        }
        return false;
    }

    @Override
    public void run() {
        checkAnyList(list1);
        checkAnyList(list2);
    }

}

共 (2) 个答案

  1. # 1 楼答案

    最后,你应该测量一下。为此,可以使用高精度计时器,如System.nanoTime()

    不用测量,我更喜欢B级。下面的问题让classB更有趣

    • 避免几乎重复的代码
    • 在引入更多列表时更加灵活
    • JIT编译器根据调用的数量改进代码。因此,classB中的方法可以更早地达到改进的阈值
    • 静态可用列表不太可能比引用列表快。classA的一个小优点是不通过列表,只节省了很少的启动时间

    等我得到真正的数字

  2. # 2 楼答案

    你可以自己测试,但最终差别几乎是不存在的,所以我会选择更容易阅读和维护的版本(我认为是版本2)

    从Java 8开始,也可能是这样的:

    //Note that this doesn't match your code exacly but you should get what I mean.
    //Since you didn't provide any hint on how you'd use the return values of your methods I'm working on assumptions here.
    boolean result = list1.stream().anyMatch(o -> o.check() ) &&
                     list2.stream().anyMatch(o -> o.check() ) ;
    

    由于重构不需要更改多个谓词,一个可能更好的变体可能是:

    //Changes to how you'd check your elements would just require you to change this predicate.
    Predicate<? super Obj> predicate = o -> o.check();
    boolean result = list1.stream().anyMatch( predicate ) &&
                     list2.stream().anyMatch( predicate ) ;