可能有损转换从long到int

我希望输入一个int和另一个long ex:1和1000000000,现在我希望创建一个大小为1000000000的数组。然后在数组的每个索引处,存储int val,ex: arr[100000000] = 4

当我试图这样做时,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; } 

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

绕过这污垢快速

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

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

数组的大小只能是int 。 那就是你,不能创建大于Integer.MAX_VALUE(2147483647)的数组,可能少一些元素(取决于VM)。 您可以将值转换为int

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

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

  1. 您不能创建一个包含超过2 ^ 31-1个条目的数组,因此在执行此操作时应使用int值(编译器只是警告您大小将从long截断为int )。 1000000000足够小以适应int ,所以你基本上没有理由使用long y来首先存储这个值。

  2. 根据您的描述,数组本身被指定存储int值,因此它不需要是long值数组。

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

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

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

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

 arr[j]=4; 

它应该是:

 arr[(int)j]=4; 
Interesting Posts