在java中使用的正确数据结构是什么?

时间:2011-01-18 13:47:50

标签: java database fifo

我想在数据结构中保存整数,但不知道数字 我可能得到的整数。 我希望数据库是FIFO类型。 什么是最好的目的?

5 个答案:

答案 0 :(得分:7)

除了使用数据库之外,如果您只有一些插入器,则可以将它们写入普通文件。普通文件保留顺序,但删除条目可能很昂贵。

您可以使用普通文件在大约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");
        }

    }
}

打印

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 :(得分:1)

您可以使用JDBC访问的任何关系数据库:MySQL,PostgreSQL,Oracle,SQLServer,DB2,Informix,Interbase,Firebird,Ingress,您可以命名。

如果您正在寻找轻量级的东西,可以查看SQLite's API for Java

答案 2 :(得分:1)

我认为没有“FIFO数据库”这样的东西。数据库通常允许您使用某种索引方案以任何所需顺序访问数据。您可以通过将序列号附加到每个记录并按顺序读取它们来在数据库中实现FIFO队列。我曾用过的任何数据库都能胜任。

也许简单的答案是Pablo给出的:使用任何关系数据库。选择一个免费的,如MySQL或Postgres,玩它,并了解他们做了什么。

答案 3 :(得分:1)

你真的是指数据库吗?因为您可以使用ArrayList

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

如果您确实需要数据库,是否可以向我们提供您想要做的更多详细信息?

[编辑] 我建议你阅读:Java Best Practices – Vector vs ArrayList vs HashSet谢谢!

答案 4 :(得分:0)

听起来你在谈论一个队列。查看JMS,看看这是否是您正在寻找的概念。虽然对于这么简单的任务来说它似乎是一个很好的工具,但它会为你提供一个持久的(你想要的任何数据库)功能的FIFO。