我有一个程序,我需要在尽可能短的时间内(以毫秒为单位)对类似List的对象进行100,000到1,000,000次随机读取读取,以实现类似细胞自动机的程序.我认为我正在使用的更新算法已经过优化(有效跟踪活动单元等).列表确实需要改变大小,但性能并不重要.所以我想知道使用Arrays而不是ArrayLists的性能是否足以在如此短的时间内处理那么多读取时产生差异.目前,我正在使用ArrayLists.
编辑:我忘了提到:我只是存储整数,所以另一个因素是使用Integer包装类(在ArrayLists的情况下)与int(在数组的情况下).有没有人知道使用ArrayList实际上是否需要3个指针查找(一个用于ArrayList,一个用于底层数组,一个用于Integer-> int),因为数组只需要1(数组地址+偏移到特定的INT)?HotSpot会优化额外的外观吗?这些额外的观察有多重要?
Edit2:另外,我忘了提到我还需要进行随机访问写入(写入,而不是插入).
我想用这段代码克隆我的arraylist:
ArrayList<String> _names;
ArrayList<String> names = (ArrayList<String>) _names.clone();
Run Code Online (Sandbox Code Playgroud)
据我所知,没什么特别的.但是,我的编译器发出以下警告:
类型安全:未选中从Object转换为ArrayList <String>
有人知道一个更清洁的解决方案,不会给我一个警告吗?
我在Java中有一个ArrayList,我需要在其中查找所有出现的特定对象.方法ArrayList.indexOf(Object)只找到一个匹配项,所以我似乎需要其他东西.
ArrayList的以下两个声明有什么区别?
ArrayList<Integer> nunbers = new ArrayList<Integer>();
Run Code Online (Sandbox Code Playgroud)
VS
ArrayList<Integer> nunbers = new ArrayList<>();
Run Code Online (Sandbox Code Playgroud)
他们中的一个比另一个更受欢迎吗?
你好,我是Java的初学者,这是我的问题:我的第一堂课有以下变量:
import java.util.ArrayList;
public class numbers {
private int number1 = 50;
private int number2 = 100;
}
Run Code Online (Sandbox Code Playgroud)
我也有这门课:
import java.util.ArrayList;
public class test {
private numbers number;
}
Run Code Online (Sandbox Code Playgroud)
我的问题是:我想将number1和number2变量存储到ArrayList中,然后从类test中访问这个ArrayList.我怎样才能做到这一点?
例如:
Object o1 = new ArrayList<String>();
Object o2 = new ArrayList<String>(){};
Object o3 = new ArrayList<String>(){{}};
Run Code Online (Sandbox Code Playgroud)
有什么不同?
我不能谷歌java的第2 /第3语法,任何参考?
List li = new LinkedList();
for (int i = 0; i < 100; i++) {
li.add(i);
}
long start1 = System.nanoTime();
li.get(57);
long end1 = System.nanoTime();
long diff1 = end1-start1;
System.out.println("Time taken by LinkedList = "+diff1);
List al = new ArrayList();
for (int i = 0; i < 100; i++) {
al.add(i);
}
Run Code Online (Sandbox Code Playgroud)
我在两个列表上执行的操作,当我打印出所用的时间时,ArrayList总是比LinkedList运行得更快.有人可以解释哪个时间表现更好吗?如果代码中有问题,请告诉我.谢谢!
看看javadoc我看到一个ArrayList有一个重载的add方法:
public boolean add(E e)
将指定的元素追加到此列表的末尾.
和
public void add(int index,E element)
将指定元素插入此列表中的指定位置.将当前位于该位置的元素(如果有)和任何后续元素向右移动(向其索引添加一个元素).
我注意到第一个返回了一段boolean时间,第二个是a void.事实证明,第一个addHAS返回一个boolean因为:
返回:true(由Collection.add(E)指定)
所以我去了Collection.add(E):
布尔加法(E e)
确保此集合包含指定的元素(可选操作).如果此集合因调用而更改,则返回true.(如果此集合不允许重复并且已包含指定的元素,则返回false.)
所以我的问题是,为什么add指定返回boolean而不是void?当我想要的add东西,我希望只做一个操作.
据我所知,还有其他数据结构,与ArrayList相反,不允许重复(例如集合).但即使这样,问题也不可能按照以下方式解决:
public void add(E e){
if(e is not in set){
add e;
}
}
Run Code Online (Sandbox Code Playgroud)
这样,如果e集合中的IS没有采取行动.为什么返回a boolean而不是void方法更好?
我正在研究Java 8文档ArrayList.我得到的最大数组大小定义为Integer.MAX_VALUE - 8平均值2 ^ 31 - 8 = 2 147 483 639.然后,我的重点是,为什么8减去或why not less than 8或more than 8减去?
/**
* The maximum size of array to allocate.
* Some VMs reserve some header words in an array.
* Attempts to allocate larger arrays may result in
* OutOfMemoryError: Requested array size exceeds VM limit
*/
private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8;
Run Code Online (Sandbox Code Playgroud)
我得到了一些相关的答案,但没有实现我的目标.
有些人根据文档给出了一些逻辑"Some …
当尝试从一个数组(带图像)渲染超过120个项目时,列表的滚动变慢.基本上,当我在无限滚动中加载新数据时,我将旧数组数据与新数组数据连接起来.
另一方面,像dribbble,behance这样的热门网站似乎没有这个问题.也许这个问题特定于Angular.js?有人在他们的项目中遇到过这个问题吗?
arraylist ×10
java ×9
arrays ×3
collections ×2
performance ×2
angularjs ×1
casting ×1
clone ×1
indexof ×1
java-7 ×1
javascript ×1
linked-list ×1