Java 在ArrayMap中存储数据库条目

Java 在ArrayMap中存储数据库条目,java,database,string,dictionary,Java,Database,String,Dictionary,这有点像一个二合一的问题。这是一款视频游戏,我用的是libgdx,所以速度一定比较快 我有一个将被读写到derby数据库的对象。其中一些对象数据结构将在运行时定义,因此我无法使用getter和setter并使用persistenceapi来创建POJO 相反,数据对象将如下所示 import java.sql.Types; import com.badlogic.gdx.utils.Array; public class Creature extends PBDBsystem_table {

这有点像一个二合一的问题。这是一款视频游戏,我用的是libgdx,所以速度一定比较快

我有一个将被读写到derby数据库的对象。其中一些对象数据结构将在运行时定义,因此我无法使用getter和setter并使用persistenceapi来创建POJO

相反,数据对象将如下所示

import java.sql.Types;

import com.badlogic.gdx.utils.Array;

public class Creature extends PBDBsystem_table
{
    protected static Array<PBDBsystem_field> s_field_list = new Array<PBDBsystem_field>();
    protected static String s_table_name = new String ("creature");

    Creature ()
    {
        create ( s_table_name, s_field_list );
    }

    public static boolean init()
    {
        s_field_list.add ( new PBDBsystem_field ("pk", Types.INTEGER, 0, "", true, true ));
        s_field_list.add( new PBDBsystem_field ("name", Types.VARCHAR, 30 ));
        s_field_list.add( new PBDBsystem_field ("cost", Types.INTEGER, 0, "1" ));
        s_field_list.add( new PBDBsystem_field ("strength", Types.INTEGER ));

        create_table ( s_table_name, s_field_list);

        return true;
    }
}
这基本上是这样做的,init将在数组中创建一个字段列表,该列表将静态地保留在类中,并且通过create将对表名和字段列表的引用传递给父类。这样每个对象在其数据结构上都有一个只分配一次的引用。然后父类为每个对象定义数据容器,如下所示:

private ArrayMap<String, String> p_data_list; /** structure to contain database data */
问题1:是否建议将所有内容存储为字符串,因为它有时需要转换为int,这可能会降低速度。例如,我正在考虑使用integer类而不是原语,并制作对象的数组映射而不是字符串。但是我仍然会遇到转换和强制转换问题,但是如果我正确地执行了所有泛型getter/setter,那么它们应该保留在父类中

好的,在创建对象的过程中,我通过反射为表中的每个字段创建了一个新的字符串实例,如下所示

protected void create ( String table_name, Array<PBDBsystem_field> field_list )
    {
        p_table_name = table_name;
        p_field_list = field_list;

        p_data_list = new ArrayMap <String, String> ();

        p_data_list.ordered = false;

        for ( PBDBsystem_field field: p_field_list)
        {
            p_data_list.put ( field.name, new String() );
        }
    }
此方法将表名和字段列表引用到父类,然后为每个字段创建一个新字符串以包含数据。但是,如果我使用上面的set方法修改字段的内容,它将使用另一个字符串将其插入数组映射中。这让我想到

问题2:它将深入复制到数组映射的字符串中,还是仅仅引用在set方法中传递的字符串?这意味着没有理由为每个字段实际实例化字符串。我宁愿把一切都归零


考虑到它是用于视频游戏,我想通过创建可重用对象或减少无意义的对象破坏来最小化垃圾收集器的使用。

为什么最初要填写p_数据_列表?若未设置键的值,则尝试获取该值将返回null。这通常已经足够好了。如果确实希望使用空字符串对其进行预填充(例如,为了避免NullPointerException),请通过String dummy=创建一个空字符串,并将其用作所有键的值。我猜你来自C语言,不习惯字符串是不可变的?我确实对Java不太熟悉。在用C编写代码时,我不惜一切代价试图避免动态分配。但Java不允许这样做,因此需要进行一些调整。我试着不预先填充这个字段,它可以工作,我只需要在查看列表时检查空指针。在能够测量它之前,我不会太担心性能。有了即时编译器和隐藏的垃圾收集器,不管是正面的还是负面的,您都会遇到一些惊喜。为编写好的基准代码保留您的想法,例如:
public void set ( String key, String value)
    {
        p_data_list.put( key, value);

    }

    public String get ( String key )
    {
        return p_data_list.get(key);
    }
protected void create ( String table_name, Array<PBDBsystem_field> field_list )
    {
        p_table_name = table_name;
        p_field_list = field_list;

        p_data_list = new ArrayMap <String, String> ();

        p_data_list.ordered = false;

        for ( PBDBsystem_field field: p_field_list)
        {
            p_data_list.put ( field.name, new String() );
        }
    }