重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
举个实例:
我们提供的服务有:网站建设、成都做网站、微信公众号开发、网站优化、网站认证、来凤ssl等。为上千多家企事业单位解决了网站和推广的问题。提供周到的售前咨询和贴心的售后服务,是有科学管理、有技术的来凤网站制作公司
[
["5","\u9760\u7a97",false,true,
[
["2","1h",false,false],
["3","2h",true,true],
["4","3h",false,false],
["5","4h",false,false],
["6","5h",false,false]]],
["4","\u65e7\u91d1\u5c71",false,false,
[
["1","\u65e7\u91d1\u5c71",false,false]
]
]
]
这样的JSON数据不是键值对的格式
解决方法 : public static void downAreaTable(JsonArray jsonData) {PadUtil.areaTables = null;JsonArray array2;JsonArray array3;JsonArray array4;int len = jsonData.getAsJsonArray().size();if (len 0) {areaTables = new HashMapTable, Area();for (int i = 0; i len; i++) {array2 = jsonData.getAsJsonArray().get(i).getAsJsonArray();Area area = new Area(Integer.parseInt(array2.get(0).getAsString()), array2.get(1).getAsString(), array2.get(1).getAsString(), array2.get(2).getAsBoolean()); array3 = array2.get(4).getAsJsonArray(); for (int j = 0; j array3.size(); j++) {array4 = array3.get(j).getAsJsonArray();Table table = new Table(Integer.parseInt(array4.get(0).getAsString()), array4.get(1).getAsString(),array4.get(1).getAsString(), area, array4.get(2).getAsBoolean());areaTables.put(table, area);}}}}
不可直接使用JSON解析,你可以通过字符串处理先将数据转成JSON格式,然后再解析,需要转换成JSON格式如下:
network:{ ssid:"nn6yywifi1" , psk:"88888888" , key_mgmt:"WPA-PSK" , priority:"218"}
假设准备好的xml是
string-array name="names"
item shanghai/item
item beijing/item
item hongkong/item
/string-array
string-array name="values"
item 021/item
item 010/item
item 00852/item
/string-array
假设要获得 "shanghai"对应的值,可以参考以下函数:
public String getAreaCode(String cityName) {
String[] names = getResources().getStringArray(R.array.names);
String[] values = getResources().getStringArray(R.array.values);
for (int i = 0; i names.length; i++) {
if (names[i].equals(cityName)) {
return values[i];
}
}
return null;
}
1、存储方式不同
HashMap内部有一个HashMapEntryK, V[]对象,每一个键值对都存储在这个对象里,当使用put方法添加键值对时,就会new一个HashMapEntry对象,具体实现如下:
[java] view plaincopy
@Override public V put(K key, V value) {
if (key == null) {
return putValueForNullKey(value);
}
int hash = secondaryHash(key);
HashMapEntryK, V[] tab = table;
int index = hash (tab.length - 1);
//先查找有没有对应的key值,如果有,就改写value,并返回改写前的value值:oldValue
for (HashMapEntryK, V e = tab[index]; e != null; e = e.next) {
if (e.hash == hash key.equals(e.key)) {
preModify(e);
V oldValue = e.value;
e.value = value;
return oldValue;
}
}
// No entry for (non-null) key is present; create one
modCount++;
if (size++ threshold) {
//扩容,双倍
tab = doubleCapacity();
index = hash (tab.length - 1);
}
addNewEntry(key, value, hash, index);
return null;
}
//创建对象存储键值对
void addNewEntry(K key, V value, int hash, int index) {
table[index] = new HashMapEntryK, V(key, value, hash, table[index]);
}
ArrayMap的存储中没有Entry这个东西,他是由两个数组来维护的
[java] view plaincopy
int[] mHashes;
Object[] mArray;
mHashes数组中保存的是每一项的HashCode值,mArray中就是键值对,每两个元素代表一个键值对,前面保存key,后面的保存value,我们看看下面代码的结果:
[java] view plaincopy
arraymap = new HashMapString, String();
a.put("a", "a_value");
a.put("b", "b_value");
执行上面代码后,arraymap中的存储是这样的
是不是能清楚地看到ArrayMap的存储了,这种存储在put代码中如下:
[java] view plaincopy
mHashes[index] = hash;
mArray[index1] = key;
mArray[(index1)+1] = value;
2、添加数据时扩容时的处理不一样
先来看看HashMap
[java] view plaincopy
if (size++ threshold) {
tab = doubleCapacity();
index = hash (tab.length - 1);
}
doubleCapacity进行双倍扩容,它的代码中有这么一句话
[java] view plaincopy
HashMapEntryK, V[] newTable = makeTable(newCapacity);
最终,这个newTable将作为扩容后的新对象返回,那么makeTable做了什么呢,如下:
[java] view plaincopy
private HashMapEntryK, V[] makeTable(int newCapacity) {
@SuppressWarnings("unchecked") HashMapEntryK, V[] newTable
= (HashMapEntryK, V[]) new HashMapEntry[newCapacity];
table = newTable;
threshold = (newCapacity 1) + (newCapacity 2); // 3/4 capacity
return newTable;
}
我们清楚地看到,这里进行了new操作,重新创建对象,开销很大。
那么ArrayMap呢,看看:
[java] view plaincopy
//如果容量不够
ize = mHashes.length) {
final int n = mSize = (BASE_SIZE*2) ? (mSize+(mSize1))
: (mSize = BASE_SIZE ? (BASE_SIZE*2) : BASE_SIZE);
if (DEBUG) Log.d(TAG, "put: grow from " + mHashes.length + " to " + n);
final int[] ohashes = mHashes;
final Object[] oarray = mArray;
//分配数组
allocArrays(n);
if (mHashes.length 0) {
if (DEBUG) Log.d(TAG, "put: copy 0-" + mSize + " to 0");
//特别注意这,是copy,而不是new,效率提升
System.arraycopy(ohashes, 0, mHashes, 0, ohashes.length);
System.arraycopy(oarray, 0, mArray, 0, oarray.length);
}
//释放无用空间,收缩数组
freeArrays(ohashes, oarray, mSize);
}
ArrayMap用的是copy数据,所以效率相对要高。
3、ArrayMap提供了数组收缩的功能,在clear或remove后,会重新收缩数组,是否空间
4、ArrayMap采用二分法查找;
以上就是android开发中,HashMap与ArrayMap的区别,大家在涉及到内存方面的实现,可根据实际情况选择这两种不同的方式。