如何在Java中对数组求和

Bat*_*eba 4 java

我正在编写一个函数来在Java中对两个数组(不一定大小相等)求和并返回结果.

这是我的尝试:

 public static <T> T[] sumArrays(T[] lhs, T[] rhs)
    {
        T[] out = new T[Math.max(lhs.length, rhs.length)];

        for (int i = 0; i < Math.max(lhs.length, rhs.length); ++i){            
            if (i < Math.min(lhs.length, rhs.length)){
                out[i] = lhs[i] + rhs[i];                
            } else if (i < lhs.length){
                out[i] = lhs[i];
            } else /* if (i < rhs.length)*/{
                out[i] = rhs[i];
            }            
        }
        return out;        
    }
Run Code Online (Sandbox Code Playgroud)

但是我有几个观察结果,尽管有编译错误.

  1. 为什么这个函数不在Java库中,这在极端情况下是巨大的?

  2. 我有动力使用泛型,因为你会在C++中使用模板.

  3. 我担心得到输入数据的深层副本; lhs和``rhs.任何人都可以向我保证吗?C++允许我传递一个常量引用; 我肯定知道.

  4. T[]对于泛型类型,out的实例化似乎是非法的.我错过了什么?

  5. 编译器会优化我的重复Math.max(lhs.length, rhs.length)吗?

  6. 编译器不喜欢lhs[i] + rhs[i].大概是因为它不知道T的类型,但是C++允许你这样做,因为在它知道类型之前它不会尝试编译模板.

  7. 返回时是否会拿出一份深刻的副本?同样,C++编译器也不需要额外的副本.

也许我太老了,不习惯Java ;-)

Mar*_*nik 9

1)为什么这个函数不是在极其庞大的Java库中?

在这里询问意见,偏离主题.

3)我担心得到输入数据的深层副本; lhs和rhs.任何人都可以向我保证吗?C++允许我传递一个常量引用; 我肯定知道.

7)返回时是否会拿出一份深刻的副本?同样,C++编译器也不需要额外的副本.

在Java中不会自动完成深度复制.此外,深度复制通常是一个定义不明确的问题.

4)T[]对于泛型类型,out的实例化似乎是非法的.我错过了什么?

除了无法实例化泛型类型的数组之外,泛型类型仅涵盖引用类型.你可能只对这里的原始类型感兴趣,所以它们没用.

5)编译器会优化我的重复Math.max(lhs.length, rhs.length)吗?

有些JIT可能,但你不能有任何保证.提取到局部变量.

6)编译器不喜欢lhs[i] + rhs[i].大概是因为它不知道它的类型T,但C++允许你这样做,因为它不会尝试编译模板,直到它知道类型.

不幸的是,你在这里遇到了很多麻烦.没有办法将算法生成所有原始Java类型.

  • C++模板在编译时使用特定类型进行实例化,因此它们与Java Generics几乎没有什么关系.是的,JG是Java的一个跛脚特征,具有可怕的推重比,并且已经受到了很多批评. (2认同)