为什么 Java 整数文本的默认类型是 int 而不是 long?[已关闭]

2022-09-03 07:16:30

我很困惑为什么Java整数文本默认为而不是.这似乎造成了不必要的混乱。intlong

首先,它要求程序员在将值分配给超过最大大小(2147483647)的 时采用特殊语法(将“L”附加到文本)。longint

long x = 2147483647; // Compiles
long y = 2147483648; // Does not compile
long z = 2147483648L; // Compiles

其次,在使用包装类时,程序员必须始终使用文本表示法,如 SO 问题中所述。Longlong

Long x = 250; // Does not compile
Long y = 250L; // Compiles

第三,考虑到从文本到“较窄”数据类型(和)的隐式转换在所有情况下(据我所知)都工作得很好,似乎简单地使所有整数文本类型都是显而易见的解决方案......右?这难道不会完全消除在特殊情况下将“L”附加到整数文本的奇怪系统的需求吗?intshortbytelong


答案 1

此行为是设计1,并已编入 JLS:Java 语言规范中。

首先,请注意,这与加宽无关,这就是为什么(有效的)整数文本被提升为长值的原因。相反,这与 int 文本的规范有关:

如果十六进制、八进制或二进制 int 文本不适合 32 位,则会出现编译时错误。

最小和最大的有符号 32 位整数值分别为 -2147483648 和 2147483647。


1 个我不在乎为什么它以这种方式工作,像C#这样的语言有不同的规则。


答案 2

速度

只需使用所需的大小,即可提高效率。对于从 -2^31 到 2^31 的数字,整数很好。如果使用 long,其中 int 就足够了,则会减慢代码的速度。例如,此代码在我的计算机上以 7.116 秒的速度运行。通过将其切换到使用 int,我将计算机上的运行时间减少到 3.74 秒:

public class Problem005 {

  private static boolean isDivisibleByAll(long n, long ceiling) {
    for (long i = 1; i < ceiling; i++)
      if (n % i != 0)
        return false;
    return true;
  }

  public static long findSmallestMultiple (long ceiling) {
    long number = 1;
    while (!isDivisibleByAll(number, ceiling))
      number++;
    return number;
  }

}

public class Stopwatch {
  private final long start;

  public Stopwatch() {
    start = System.currentTimeMillis();
  }

  public double elapsedTime() {
    long now = System.currentTimeMillis();
    return (now - start) / 1000.0;
  }

}

public class Main {

  public static void main(String[] args) {

    Stopwatch stopwatch005 = new Stopwatch();

    long highestMultiple = 20;
    long findSmallestMultipleOutput = findSmallestMultiple(highestMultiple);
    double findSmallestMultipleTime = stopwatch005.elapsedTime();
    System.out.println("Problem #005");
    System.out.println("============");
    System.out.print("The multiple of the numbers 1-" + highestMultiple + " is = ");
    System.out.print(findSmallestMultipleOutput);
    System.out.println(" with a time of " + findSmallestMultipleTime + " seconds.\n ");
  }   
}

更改为使用 int:

public class Problem005 {

  private static boolean isDivisibleByAll(int n, int ceiling) {
    for (int i = 1; i < ceiling; i++)
      if (n % i != 0)
        return false;
    return true;
  }

  public static int findSmallestMultiple (int ceiling) {
    int number = 1;
    while (!isDivisibleByAll(number, ceiling))
      number++;
    return number;
  }

}