ArrayList<Integer> array = new ArrayList<Integer>();
array.add(3);
array.add(4);
array.add(5); // Appends to the end of this list
int myInt = array.remove(0); // Return first element
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");
}
}
}
印刷品
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
# 1 楼答案
你是说数据库吗?因为你可以用ArrayList来表示:
如果你真的需要一个数据库,你能告诉我们你想做什么的更多细节吗
[编辑] 我建议你阅读:Java Best Practices – Vector vs ArrayList vs HashSet谢谢
# 2 楼答案
任何可以通过JDBC访问的关系数据库:MySQL、PostgreSQL、Oracle、SQLServer、DB2、Informix、Interbase、Firebird、Ingress,随便你说
如果你正在寻找轻量级的东西,你可以看看SQLite's API for Java
# 3 楼答案
听起来你说的是排队。看看JMS,看看这是不是你想要的概念。虽然对于这样一个简单的任务来说,它似乎是一个很大的工具,但它将为您提供FIFO持久化(您希望的任何数据库)功能
# 4 楼答案
除了使用数据库之外,如果你只有一些整数,你可以将它们写入一个普通文件。普通文件保留顺序,但是删除条目可能会很昂贵
使用普通文件,您可以在大约0.1秒内写入/重写100万个整数
int原语的一个有效集合是TIntArrayList。它类似于@JPelletier的建议,但包含一个int[]。一百万个int值需要大约4MB的内存或磁盘
编辑:这表明对于100万个数字来说,ArrayList是一个糟糕的选择。主要是因为remove(0)是O(n)而不是O(1)
印刷品
# 5 楼答案
我不认为真的有“FIFO数据库”这样的东西。数据库通常允许您使用某种索引方案以任何所需的顺序访问数据。通过将序列号附加到每条记录并按顺序读取,可以在数据库中实现FIFO队列。我用过的任何数据库都能做到这一点
也许巴勃罗给出的答案很简单:使用任何关系数据库。选择一个像MySQL或Postgres这样的免费软件,玩它,了解它们的功能