Itz*_*984 0 java database fifo
我想在数据结构中保存整数,但不知道我可能得到的整数的数量.我希望数据库是FIFO类型.什么是最好的目的?
除了使用数据库之外,如果你只有一些插入器,你可以将它们写入普通文件.普通文件保留顺序,但删除条目可能很昂贵.
您可以使用普通文件在大约0.1秒内写入/重写100万个整数.
int原语的有效收集是TIntArrayList.它像@ JPelletier的建议,但包装了一个int [].一百万个int值应该占用大约4 MB的内存或磁盘.
编辑:这表明,对于100万个数字,ArrayList是一个糟糕的选择.主要是因为remove(0)是O(n)而不是O(1)
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
// based on http://www.cs.princeton.edu/introcs/43stack/RingBuffer.java.html
public class IntRingBuffer {
private final int[] a; // queue elements
private int N = 0; // number of elements on queue
private int first = 0; // index of first element of queue
private int last = 0; // index of next available slot
// cast needed since no generic array creation in Java
public IntRingBuffer(int capacity) {
a = new int[capacity];
}
public boolean isEmpty() { return N == 0; }
public int size() { return N; }
public void enqueue(int item) {
if (N == a.length) { throw new RuntimeException("Ring buffer overflow"); }
a[last] = item;
last = (last + 1) % a.length; // wrap-around
N++;
}
// remove the least recently added item - doesn't check for underflow
public int dequeue() {
if (isEmpty()) { throw new RuntimeException("Ring buffer underflow"); }
int item = a[first];
N--;
first = (first + 1) % a.length; // wrap-around
return item;
}
public static void main(String... args) {
int size = 1000000;
{
long start = System.nanoTime();
IntRingBuffer list = new IntRingBuffer(size);
for(int i=0;i< size;i++)
list.enqueue(i);
for(int i=0;i< size;i++)
list.dequeue();
long time = System.nanoTime() - start;
System.out.println(list.getClass().getSimpleName()+": Took "+time/1000/1000+" ms to add/remove "+size+" elements");
}
{
long start = System.nanoTime();
List<Integer> list = new LinkedList<Integer>();
for(int i=0;i< size;i++)
list.add(i);
for(int i=0;i< size;i++)
list.remove(0);
long time = System.nanoTime() - start;
System.out.println(list.getClass().getSimpleName()+": Took "+time/1000/1000+" ms to add/remove "+size+" elements");
}
{
long start = System.nanoTime();
List<Integer> list = new ArrayList<Integer>();
for(int i=0;i< size;i++)
list.add(i);
for(int i=0;i< size;i++)
list.remove(0);
long time = System.nanoTime() - start;
System.out.println(list.getClass().getSimpleName()+": Took "+time/1000/1000+" ms to add/remove "+size+" elements");
}
}
}
Run Code Online (Sandbox Code Playgroud)
打印
IntRingBuffer: Took 31 ms to add/remove 1000000 elements
LinkedList: Took 252 ms to add/remove 1000000 elements
ArrayList: Took 325832 ms to add/remove 1000000 elements
Run Code Online (Sandbox Code Playgroud)