Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/398.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 是ArrayList<;整数>;由JDK优化以执行类似int[]的操作?_Java - Fatal编程技术网

Java 是ArrayList<;整数>;由JDK优化以执行类似int[]的操作?

Java 是ArrayList<;整数>;由JDK优化以执行类似int[]的操作?,java,Java,我们被告知Java的ArrayList对于整数效率较低,因为该列表实际上包含指针,而整数数组包含整数,因此避免了内存分配和访问 我的问题是JDK/JIT编译器是否会优化这种低效率?它提供了所有信息,可以断定这些实现在功能上是等效的,因此它还可以用一个支持int[]的实现替换ArrayList。不,它不能,因为您可以在ArrayList中存储null 编辑:哦,它也不能,因为泛型在编译时被删除-在运行时,JRE不能根据元素类型区分ArrayList。依我看,这比只null更糟糕-您可以将任何对象存

我们被告知Java的ArrayList对于整数效率较低,因为该列表实际上包含指针,而整数数组包含整数,因此避免了内存分配和访问


我的问题是JDK/JIT编译器是否会优化这种低效率?它提供了所有信息,可以断定这些实现在功能上是等效的,因此它还可以用一个支持int[]的实现替换ArrayList。

不,它不能,因为您可以在ArrayList中存储
null


编辑:哦,它也不能,因为泛型在编译时被删除-在运行时,JRE不能根据元素类型区分ArrayList。依我看,这比只
null
更糟糕-您可以将任何对象存储在
ArrayList

否。

理论上可以,但实际上不能。除非自动装箱也能得到优化,否则它可能不会更有效


您可以改为使用包装int[]的方法。

因此此类数组的实现可以如下所示

import java.util.AbstractList; import java.util.List; import java.util.RandomAccess; public class IntArrayList extends AbstractList<Integer> implements List<Integer> , RandomAccess /* todo , Cloneable, java.io.Serializable */{ private static final int INT_SIZE_MINUS_ONE = 15; private static final int RIGHT_SHIFT = 4; private int size; private int isNull[]; private int data[]; IntArrayList(int size) { if (size < 0) { throw new RuntimeException("invalid size"); } this.size = size; isNull = new int[(size + INT_SIZE_MINUS_ONE) >>> RIGHT_SHIFT]; data = new int[size]; } private void rangeCheck(int index) { if (index < 0 || index >= size) { throw new IndexOutOfBoundsException(); } } public Integer set(int index, Integer element) { rangeCheck(index); Integer oldValue = get(index); if (element == null) { isNull[index >>> RIGHT_SHIFT] &= ~(1 << (index & INT_SIZE_MINUS_ONE)); } else { isNull[index >>> RIGHT_SHIFT] |= (1 << (index & INT_SIZE_MINUS_ONE)); data[index] = element; } return oldValue; } @Override public Integer get(int index) { rangeCheck(index); if ((isNull[index >>> RIGHT_SHIFT] & (1 << (index & INT_SIZE_MINUS_ONE))) == 0) { return null; } return new Integer(data[index]); } @Override public int size() { return size; } public boolean isEmpty() { return size == 0; } } 导入java.util.AbstractList; 导入java.util.List; 导入java.util.RandomAccess; 公共类IntArrayList扩展了AbstractList 实现List、RandomAccess/*todo、Cloneable、java.io.Serializable*/{ 私有静态最终整数大小减1=15; 私有静态最终整数右移位=4; 私有整数大小; 私有int为null[]; 私有整数数据[]; IntArrayList(整数大小){ 如果(尺寸<0){ 抛出新的RuntimeException(“无效大小”); } 这个。大小=大小; isNull=新整数[(大小+整数大小减一)>>>右移位]; 数据=新整数[大小]; } 私有无效范围检查(整数索引){ 如果(索引<0 | |索引>=大小){ 抛出新的IndexOutOfBoundsException(); } } 公共整数集(整数索引,整数元素){ 范围检查(索引); 整数值=获取(索引); if(元素==null){
isNull[index>>>RIGHT_SHIFT]&=~(1>>RIGHT_SHIFT]&=(1>>RIGHT_SHIFT]&(1但它不是(乍一看)不可思议的是,Java能够针对整数数组列表的特殊情况进行优化。是的,我熟悉trove,这更像是一个理论问题。+1。@ripper234,我希望它们至少支持列表。自动检测将是理想的,但它们还没有完成基本的转义分析。:PBut那会因为
int
Object
没有类型关系,所以不起作用。虽然泛型系统可能被设计为支持这类事情,但它对类加载器系统的更改要比语言开发人员所能承受的大得多HANCC++,@ DAONE,我能很好地理解它们,不想用自定义类型自动替换列表。它可以在理论上完成,但最好是在开发人员现在完成的。也许编译器/ JIT将在一天内处理这类事情。它可能不值得付出努力(即对于90%的情况来说,改进不是很大)。@01-完全同意“过早优化”标签-这只是我们都喜欢在某个时候进行的理论讨论。理论上,未来的Java编译器/运行时可能能够摆脱类型转换,但
null
问题是通往
int[]的永久障碍
。此外,我知道相当多的代码在ArrayList中存储空值,因此它不可能消失。@Donal Fellows.null在java中总是会引起问题。在这种情况下,可以使用位向量来存储isNull属性。因此我们可以使用更长的int[]要存储来自ArrayList的所有信息,下一个问题是自动将Integer get(int)转换为int get(int),以避免每次调用时自动装箱!(我怀疑这会降低大部分性能)@符号:基本上,当你达到那个优化水平时,你已经超出了期望JIT达到的合理水平,至少在未来几年。真的为什么要否决?如果我的答案完全不正确,请给我一个分数。因为这不是我问题的答案。我知道如何实施有效的IntArray.