Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/393.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 访问成员变量与创建新对象_Java_Object_New Operator - Fatal编程技术网

Java 访问成员变量与创建新对象

Java 访问成员变量与创建新对象,java,object,new-operator,Java,Object,New Operator,因此,我有一些代码返回一个名为MinMax的对象中数组的min和max。我的问题是在for循环中,我们是否需要在每次迭代中创建一个新的MinMax对象。或者我们可以像这样更新MinMax的成员变量: globalMinMax.largest = Math.min(globalMinMax.smallest, localMinMax.smallest); globalMinMax.smallest = Math.max(globalMinMax.largest, localMinMax.large

因此,我有一些代码返回一个名为MinMax的对象中数组的min和max。我的问题是在for循环中,我们是否需要在每次迭代中创建一个新的MinMax对象。或者我们可以像这样更新MinMax的成员变量:

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;
}
私有静态类最小值{
公共整数最小;
公共整数最大;
公共最小最大值(最小整数、最大整数){
这个最小的=最小的;
最大的=最大的;
}
私有静态最小值(整数a、整数b){
返回整数。比较(b,a)<0?新的最小值(b,a):新的最小值(a,b);
}
}
公共静态MinMax findMinMax(列表A){

如果(A.size()此代码太复杂,无法完成它的工作。您应该使用生成的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);
int最小值=A.get(0);
int最大值=A.get(0);
对于(int i=1;i最大值)最大值=A.get(i);
}
返回新的最小最大值(最小值、最大值);

如果您想将MinMax类更多地合并到整个程序中,您可以向类中添加一个名为
generateMaxFromList
的静态方法,该方法将从提供的整数列表中静态生成MinMax对象。

更新
globalMinMax
将是提供的两个方法中更好的解决方案,如果t在多线程环境中不访问数据。您也不需要旋转大量对象(尤其是在循环中)来查找最小值和最大值。当您迭代的源集合包含大量元素时,这可能会导致开销

但是,在一种情况下,您需要在每次迭代中创建
MinMax
对象的新实例。这可能是在您启动多个线程以对数据执行操作时



注意-如果传入的列表为空,则
MinMax
方法中的第一个检查将引发异常。因此,检查
a.size()==0
作为方法中的第一个语句,并执行相应的操作。

为什么
Integer.compare(b,a)<0
b
好?你认为可能有问题吗?你为什么这么认为?你测试了你的想法吗?为什么需要我们的输入?我想知道使用新关键字而不是直接访问对象是否有什么好处。我想知道作者为什么做出这样的决定,这是否重要我不知道我认为在这个例子中这很重要,但是对象创建非常便宜,将对象视为不可变的可以使算法更容易并行化。