【问题标题】:Possible Lossy conversion from long to int [duplicate]从 long 到 int 的可能有损转换 [重复]
【发布时间】:2014-03-16 16:35:13
【问题描述】:

我希望输入一个int 和另一个long 例如:1 和 1000000000,现在我希望创建一个大小为 1000000000 的数组。然后在数组的每个索引处存储 int val,例如:@987654323 @。

当我尝试这样做时,Netbeans 在这一行显示错误:

arr = new long[y+1]` and `arr[j] = 0` 

“从 long 到 int 的可能有损转换”。 这是我的代码:-

public static void main(String[] args) throws IOException       
{     
    BufferedReader s = new BufferedReader(new InputStreamReader(System.in));           
    String[] xe = s.readLine().split(" ");          
    int x = Integer.parseInt(xe[0]);        
    long y = Long.parseLong(xe[1]);
    long []arr;    
    arr = new long[y+1];     
    for(long j=0;j<=y;j++)     
    arr[j] = 4;     
} 

【问题讨论】:

  • 10 亿可以存储为 int,因为上限约为 21 亿。注意:十亿个long 值使用 8 GB 内存。如果您只需设置几个值,Map&lt;Integer, Long&gt; 可能会更好地工作。

标签: java arrays long-integer


【解决方案1】:

在静态数组中,我们不能使用长数据类型值来分配索引位置。 1.在 for/while/do while 循环中将 long 转换为 int。 2. typecast arr[(int)i] 消除错误

【讨论】:

    【解决方案2】:

    我认为您对这里的类型转换有一些误解。如前所述,在 Java 中允许向下转换,您可以将其向下转换为整数

    arr = new long[(int)(y+1)];
    

    但是这里的主要问题是数组分配应该取整数值,以便可以分配相同数量的同质空间。 如果您想要比整数范围更多的空间,那么您应该使用 ArrayList ,它是可动态增长的数组,因为如果我们给用户很大的责任来声明大量的数组内存,那么我们的系统可能会耗尽内存,因为数组是静态内存分配数据结构。 这同样适用于

    arr[j]=4;
    

    应该是:

    arr[(int)j]=4;
    

    【讨论】:

      【解决方案3】:
        1234563 @ 到 int)。 1000000000 小到可以放入int,所以你基本上没有理由首先使用long y 来存储这个值。
      1. 根据您的描述,数组本身被指定用于存储int 值,因此它不需要是long 值的数组。

      简而言之,您可以并且应该将代码中的每个 long 更改为 int

      【讨论】:

        【解决方案4】:

        数组的大小只能是int。也就是说,您不能创建大于 Integer.MAX_VALUE (2147483647) 的数组,可能少一些元素(取决于 VM)。您可以将您的价值投给int

        arr = new long[(int)(y+1)];
        

        但是当y 的值实际上大于最大允许大小时,这将产生无效结果。

        【讨论】:

        【解决方案5】:

        您需要将 y 和 j 转换/转换为 int。 此外,当您仅添加 1 时,您的递增 var 不应该很长。

        【讨论】:

          【解决方案6】:

          数组索引在 Java 中是一个整数,编译器会建议你。所以最大数组大小是(大约)Integer.MAX_VALUE。对于更大的数组,您应该使用 ArrayList。

          快速绕过这片泥土

          arr = new long[(int)y+1];  
          

          【讨论】:

          • 所以当我们从长到 int 的 1000000000 进行类型转换时......我认为这样我们丢失了一些位......
          • 一个ArrayList内部存储了一个数组,所以它无法维护更多的元素。
          • @ranaarjun 是的,您可能会遇到运行时错误。
          • AFAIK ArrayList 受可用 (JVM) 内存限制。
          • 完美!从来没有新的 Java 数组只能有 Integer.MAX_VALUE 值。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2015-02-28
          • 2014-08-02
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多