Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.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_Performance_Theory - Fatal编程技术网

Java 等效方法重载为什么必要?

Java 等效方法重载为什么必要?,java,performance,theory,Java,Performance,Theory,我浏览了谷歌的一些JAVA代码,找到了ImmutableSet: 他们用其他几种方法实现了of()方法: public static <E> ImmutableSet<E> of(E e1, E e2); public static <E> ImmutableSet<E> of(E e1, E e2, E e3); public static <E> ImmutableSet<E> of(E e1, E e2, E e3,

我浏览了谷歌的一些JAVA代码,找到了ImmutableSet:

他们用其他几种方法实现了of()方法:

public static <E> ImmutableSet<E> of(E e1, E e2);
public static <E> ImmutableSet<E> of(E e1, E e2, E e3);
public static <E> ImmutableSet<E> of(E e1, E e2, E e3, E e4);
public static <E> ImmutableSet<E> of(E e1, E e2, E e3, E e4, E e5);
public static <E> ImmutableSet<E> of(E... elements);
publicstaticimmutableset of(e1,e2);
(e1、e2、e3)的公共静态不可变表集;
(e1、e2、e3、e4)的公共静态不可变表集;
(e1、e2、e3、e4、e5)的公共静态不可变表集;
(E…元素)的公共静态不可变表集;
我检查了这里的实现:

有一个create方法具有以下签名:

private static <E> ImmutableSet<E> create(E... elements)
私有静态ImmutableSet创建(E…元素)
它包裹着

private static <E> ImmutableSet<E> create(Iterable<? extends E> iterable, int count);

private静态不可变表集创建(Iterable性能。为了调用该方法的E…版本,调用方必须分配一个新数组。调用方只需在堆栈上推送参数即可调用其他方法。

它们这样做是为了以更有效的方式管理内存。如果您有一个包含一小部分项的不可变集合,则最好显式修复否则,Java将创建一个更大的集合。例如:除非另有规定,否则哈希集的初始大小为12个条目。

它与性能无关,实际上:所有方法都委托给同一个创建方法,该方法无论如何都需要一个数组

我猜它与警告有关。请考虑下面的小片段:

import java.util.List;

class ImmutableSet<T>
{
}
public class ParametersTest
{
    public static void main(String[] args)
    {
        List<String> list0 = null;
        List<String> list1 = null;
        of(list0, list1);
    }

    @SuppressWarnings("unchecked")
    public static <E> ImmutableSet<E> of(E e1, E e2) {
        return create(e1, e2);
    }

    public static <E> ImmutableSet<E> of(E... elements) {
        return create(elements);
    }

    private static <E> ImmutableSet<E> create(E... elements) 
    {
        return null;
    }

}
import java.util.List;
类不可变表集
{
}
公共类参数ST
{
公共静态void main(字符串[]args)
{
List list0=null;
List list1=null;
of(列表0,列表1);
}
@抑制警告(“未选中”)
(e1,e2)的公共静态不可变表集{
返回创建(e1,e2);
}
(E…元素)的公共静态不可变表集{
返回创建(元素);
}
私有静态ImmutableSet创建(E…元素)
{
返回null;
}
}
在main方法中对
的调用很好:它与
方法的
的2-args版本相匹配。现在注释掉
方法的
的2-args版本。然后调用仍然正常,但将直接调用varags版本。这将导致创建一个通用数组,并引发警告。(该警告在2-args版本中明显被抑制)

总之,我假设这是为了避免警告库中希望使用几个泛型类型的对象调用
of
方法的客户端


幸运的是,由于

旁注:如果您使用的是旧的Google Collections库,那么它将不再受支持。请使用新的、闪亮的、取代Google Collections(并且正在积极开发)的库.AFAIK,不可变集合的大小将始终与插入的元素数相适应,无论您使用何种方法对其进行实例化。默认哈希集的大小将为16(在从
hashCode
计算右存储桶时,允许使用二进制
而不是
mod
操作).或者最近有什么变化吗?因为所有提到的
的重载调用了完全相同的
create
方法,我看不出它们有什么不同之处(比如固定大小).你说得对。我错过了它最终委托给唯一方法的部分。但他们仍然调用变量版本的
create
,因此将以任何方式创建数组,不是吗?如果代码是JIT编译的,并且编译器很好,它可能会在寄存器中传递部分或全部参数,假设该方法不是递归的。@AlexD I'我很确定JIT编译器不能用可变方法来实现这一点。@sepp2k,如果编译器很好,没有理由不这样做。在任何给定的调用站点,传递的参数数都是一个已知的常量。调用站点专门化——一种非常强大的优化,可以使许多程序更快。给定的JVM是否真的能实现这种优化优化与否是另一个问题,我不知道答案。你是对的。我大约在一分钟前发现了这个问题:所以我的问题实际上是重复的,很抱歉,但这个答案表明,由于警告,这种方式被转发。