访问成员变量vs创建新对象

问题描述:

所以我有一些代码返回一个数组中的最小值和最大值,称为min max。我的问题是在for循环中,我们需要在每次迭代中创建一个新的MinMax对象。或者可能我们刚刚更新,像这样MINMAX的成员变量:访问成员变量vs创建新对象

globalMinMax.largest = Math.min(globalMinMax.smallest, localMinMax.smallest); 
globalMinMax.smallest = Math.max(globalMinMax.largest, localMinMax.largest)); 

不是每次都创建一个新的极小极大像我们做带星行下面的代码中

private static class MinMax { 
    public Integer smallest; 
    public Integer largest; 

    public MinMax(Integer smallest, Integer largest) { 
    this.smallest = smallest; 
    this.largest = largest; 
    } 

    private static MinMax minMax(Integer a, Integer b) { 
    return Integer.compare(b, a) < 0 ? new MinMax(b, a) : new MinMax(a, b); 
    } 
} 

public static MinMax findMinMax(List<Integer> A) { 
    if (A.size() <= 1) { 
     return new MinMax(A.get(0), A.get(0)); 
    } 

    MinMax globalMinMax = MinMax.minMax(A.get(0), A.get(1)); 
    // Process two elements at a time. 
    for (int i = 2; i + 1 < A.size(); i += 2) { 
    MinMax localMinMax = MinMax.minMax(A.get(i), A.get(i + 1)); 
    **********Do we need to create a new object here?***** 
    globalMinMax 
     = new MinMax(Math.min(globalMinMax.smallest, localMinMax.smallest), 
        Math.max(globalMinMax.largest, localMinMax.largest)); 
    } 
    // If there is odd number of elements in the array, we still 
    // need to compare the last element with the existing answer. 
    if ((A.size() % 2) != 0) { 
     globalMinMax 
     = new MinMax(Math.min(globalMinMax.smallest, A.get(A.size() - 1)), 
        Math.max(globalMinMax.largest, A.get(A.size() - 1))); 
    } 
    return globalMinMax; 
} 
+0

为什么'Integer.compare(b,a) shmosel

+0

你认为可能有问题吗?你为什么这么认为?你测试了你的想法吗?你为什么需要我们的输入? – shmosel

+0

我想知道是否有利用新的关键字,而不是直接访问对象。我想知道为什么作者作出这个决定,是否重要 – Matt

此代码是太复杂它在做什么。您应该使用您生成的MinMax类来充当列表的最小/最大值的存储,但不应在计算过程中使用它。

int minimum = A.get(0); 
int maximum = A.get(0); 
for(int i=1; i < A.size(); i++){ 
    if(A.get(i) < minimum) minimum = A.get(i); 
    if(A.get(i) > maximum) maximum = A.get(i); 
} 
return new MinMax(minimum, maximum); 

如果要纳入MINMAX类多地进入你的整个程序,你可以添加一个静态方法称为有点像类:

寻找最低为/最大列表一样简单generateMinMaxFromList,它将从提供的Integer列表中静态生成minMax对象。

如果未在多线程环境中访问数据,更新globalMinMax将是更好的解决方案。你也不需要旋转很多物体(特别是在一个循环内)只是为了找到最小值和最大值。当你迭代的源代码集合有很多元素时,这可能会导致开销。

但是,有一种情况需要在每次迭代中创建一个新的MinMax对象实例。这将是当你启动多个线程来处理数据时。


- 在MinMax方法中的第一检查将抛出一个异常,如果传入的列表为空。从而检查A.size() == 0作为方法中的第一条语句并执行相应的操作。