3

当我第一次开始了解HashMap's 时,我为我的公司编写了内部 Android 应用程序,其中包含每个订单项属性的单独地图。订单项是动态的,并且具有多个具有相应值的属性。

示例(并非所有地图都包括在内):

// Preceding onCreate()
HashMap<Integer, Double> latMap;
HashMap<Integer, Double> lngMap;
HashMap<Integer, String> descMap;
// In onCreate()
latMap = new HashMap<Integer, Double>();
lngMap = new HashMap<Integer, Double>();
descMap = new HashMap<Integer, String>();

LogCat(结构:){ItemNumber=Value, ItemNumber=Value}

-- latMap output --
{1=0.0, 2=0.0}
-- lngMap output --
{1=0.0, 2=0.0}
-- descMap output --
{1=NULL, 2=NULL}

现在我正在测试只有 2 个地图,主要HashMap包含项目编号和包含各个属性和值的包含地图

例子:

// Preceding onCreate()
HashMap<Integer, HashMap<String, String>> testMapFull;
HashMap<String, String> testMapContent;
// In onCreate()
testMapFull = new HashMap<Integer, HashMap<String, String>>();
testMapContent = new HashMap<String, String>();

LogCat(结构:){ItemNumber{Property=Value, Property=Value}}

{
    1={
        object_lat=0.0,
        object_lng=0.0,
        desc=NULL,
    },
    2={
        object_lat=0.0,
        object_lng=0.0,
        desc=NULL,
    }
}

我的问题:内存效率等方面是否存在显着差异?目前一切正常。是的,我知道这两张地图必须比几张更好,但它们将包含相同数量的信息,而要实例化的信息更少。

4

2 回答 2

2

为什么不能声明一个自定义类来保存有关特定项目的全部信息?它将允许您将HashMap的数字减少到 1。

public class Item {
    public double lat;
    public double lng;

    public String desc;
}

HashMap<Integer, Item> itemMap;

它需要更少的内存,因为只使用一个HashMap并且允许避免Boxing/Unboxing创建不必要的临时对象的操作。

您还可以通过使用而不是Boxing/Unboxing更多地减少操作次数SparseArrayHashMap<Integer, ?>

于 2013-03-06T17:25:17.797 回答
1

基于@vmironov 提供的答案的可能解决方案,看起来我要切换HashMapSparseArray一个包含Item所有变量的类。

以下是我如何为未来的访问者进行设置的快速示例:

SparseArray<Item> sparseTest;

// Create an instance of this class for each item
public class Item {
    public String desc;
}
int itemNumber = 1;

// Set item variables
Item item = new Item();
item.desc = "Test Description";

// Once all variables are set, put into SparseArray
sparseTest = new SparseArray<Item>();
sparseTest.put(itemNumber, item);

// My application requires this data to be stored in a JSONArray
JSONArray ja = new JSONArray();
JSONObject innerJo = new JSONObject();
JSONObject wrapperJo = new JSONObject();
try {
    innerJo.put("desc", sparseTest.get(itemNumber).desc);
    wrapperJo.put("" + itemNumber, innerJo);
    ja.put(wrapperJo);
} catch (JSONException e1) {
    e1.printStackTrace();
}

最后是输出:

[{"1":{"desc":"Test Description"}}]

由于我的订单项值可以更改或修改,因此可以简单地通过以下方式完成:

sparseTest.get(itemNumber).desc = "Description Test";
于 2013-03-06T18:50:03.907 回答