androidmap
1. android map.keyset 按照什麼順序
有一個Map對象,這時候使用keySet()方法獲取所有的key值,比如: Map map = new HashMap(); map.put(1, "a"); map.put(2, "b"); map.put(3, "c"); map.put(4, "d"); Set keys1 = map.keySet(); Set keys2 = map.keySet(); Set keys3 = map.keySet();上面三個set對象key1,key2,key3引用的是一個對象。這時map的keySet()方法只返回一個set實例,所以當從key1中刪除一個對象時候,key2和key3將會受到影響。 keys1.remove(1); System.out.println(keys1); System.out.println(keys2); System.out.println(keys3);列印結果為:[2, 4, 3][2, 4, 3][2, 4, 3]
下面是摘自API幫助文檔的說明
keySetpublic Set<K> keySet()返回此映射中所包含的鍵的 set 視圖。該集合受映射的支持,所以映射的變化也反映在該集合中,反之亦然。該集合支持元素的移除,通過 Iterator.remove、Set.remove、removeAll、retainAll 和 clear 操作,從該映射中移除相應的映射關系。它不支持 add 或 addAll 操作。
指定者:介面 Map<K,V> 中的 keySet覆蓋:類 AbstractMap<K,V> 中的 keySet返回:此映射所包含的鍵的 set 視圖。
2. android map是怎麼排序
java中的Map是個key-valus形式存儲的健值對介面。Map是個介面,因此不能實例化,不同的子類有不同的實現方式。
HashMap 無序的,通過hash演算法來(散列存儲)。
Hashtable 無序的,通過hash演算法來(散列存儲),與HashMap不同的是Hashtable 是同步的(線程安全的)。
LinkedHashMap 有序的,通過雙向鏈表來存儲數據。
TreeMap 排序的,通過Key來排序,排序規則會調用key的compareTo方法來計算。
3. android hashmap 怎麼用
HashMap 和 HashSet 是 Java Collection Framework 的兩個重要成員,其中 HashMap 是 Map 介面的常用實現類,HashSet 是 Set 介面的常用實現類。雖然 HashMap 和 HashSet 實現的介面規范不同,但它們底層的 Hash 存儲機制完全一樣,甚至 HashSet 本身就採用 HashMap 來實現的。
1. 程序試圖將多個 key-value 放入 HashMap 中時,以如下代碼片段為例:
Java代碼
HashMap<String , Double> map = new HashMap<String , Double>();
map.put("語文" , 80.0);
map.put("數學" , 89.0);
map.put("英語" , 78.2);
2.HashMap 採用一種所謂的「Hash 演算法」來決定每個元素的存儲位置。
當程序執行 map.put("語文" , 80.0); 時,系統將調用"語文"的 hashCode() 方法得到其 hashCode 值——每個 Java 對象都有 hashCode() 方法,都可通過該方法獲得它的 hashCode 值。得到這個對象的 hashCode 值之後,系統會根據該 hashCode 值來決定該元素的存儲位置。
3. HashMap 類的 put(K key , V value) 方法的源代碼:
public V put(K key, V value)
{
// 如果 key 為 null,調用 putForNullKey 方法進行處理
if (key == null)
return putForNullKey(value);
// 根據 key 的 keyCode 計算 Hash 值
int hash = hash(key.hashCode());
// 搜索指定 hash 值在對應 table 中的索引
int i = indexFor(hash, table.length);
// 如果 i 索引處的 Entry 不為 null,通過循環不斷遍歷 e 元素的下一個元素
for (Entry<K,V> e = table[i]; e != null; e = e.next)
{
Object k;
// 找到指定 key 與需要放入的 key 相等(hash 值相同
// 通過 equals 比較放回 true)
if (e.hash == hash && ((k = e.key) == key
|| key.equals(k)))
{
V oldValue = e.value;
e.value = value;
e.recordAccess(this);
return oldValue;
}
}
// 如果 i 索引處的 Entry 為 null,表明此處還沒有 Entry
modCount++;
// 將 key、value 添加到 i 索引處
addEntry(hash, key, value, i);
return null;
}
4. Android初學 Map<String,String>是什麼
Map是一個介面 代表一個key-value 鍵值對 <string,string>表示 key和value都是String類型的
既可以通過key查找對應的value也可以反過來查找,Map中都提供了對應的方法。
Map是java中的一種數據結構,所以可能比較陌生。可以通過深入了解java語言特性掌握
5. android 怎麼給map賦值
Hashmap map = new Hashmap();//實例化
map.put("KEY",VALUE);//加入鍵值對
6. android中怎麼用sqlite存儲一個map
在進行Android開發過程中,我們經常會接觸到Drawable對象(官方開發文檔:A Drawable is a general abstraction for "something that can be drawn."),那麼,若要使用資料庫來進行存儲及讀取,該如何實現?
一、存儲
//第一步,將Drawable對象轉化為Bitmap對象
Bitmap bmp = (((BitmapDrawable)tmp.image).getBitmap());
//第二步,聲明並創建一個輸出位元組流對象
ByteArrayOutputStream os = new ByteArrayOutputStream();
//第三步,調用compress將Bitmap對象壓縮為PNG格式,第二個參數為PNG圖片質量,第三個參數為接收容器,即輸出位元組流os
bmp.compress(Bitmap.CompressFormat.PNG, 100, os);
//第四步,將輸出位元組流轉換為位元組數組,並直接進行存儲資料庫操作,注意,所對應的列的數據類型應該是BLOB類型
ContentValues values = new ContentValues();
values.put("image", os.toByteArray());
db.insert("apps", null, values);
db.close();
7. android Map會不會覆蓋鍵和值
不會的,例如你在介面中或得到一堆數據然後放在map 中,有多少就會顯示多少,不會說是相同數據進行覆蓋的
8. Android開發中ArrayMap與HashMap有哪些不同
1、存儲方式不同
HashMap內部有一個HashMapEntry<K, V>[]對象,每一個鍵值對都存儲在這個對象里,當使用put方法添加鍵值對時,就會new一個HashMapEntry對象,具體實現如下:
[java] view plain
@Override public V put(K key, V value) {
if (key == null) {
return putValueForNullKey(value);
}
int hash = secondaryHash(key);
HashMapEntry<K, V>[] tab = table;
int index = hash & (tab.length - 1);
//先查找有沒有對應的key值,如果有,就改寫value,並返回改寫前的value值:oldValue
for (HashMapEntry<K, 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 HashMapEntry<K, V>(key, value, hash, table[index]);
}
ArrayMap的存儲中沒有Entry這個東西,他是由兩個數組來維護的
[java] view plain
int[] mHashes;
Object[] mArray;
mHashes數組中保存的是每一項的HashCode值,mArray中就是鍵值對,每兩個元素代表一個鍵值對,前面保存key,後面的保存value,我們看看下面代碼的結果:
[java] view plain
arraymap = new HashMap<String, String>();
a.put("a", "a_value");
a.put("b", "b_value");
執行上面代碼後,arraymap中的存儲是這樣的
是不是能清楚地看到ArrayMap的存儲了,這種存儲在put代碼中如下:
[java] view plain
mHashes[index] = hash;
mArray[index<<1] = key;
mArray[(index<<1)+1] = value;
2、添加數據時擴容時的處理不一樣
先來看看HashMap
[java] view plain
if (size++ > threshold) {
tab = doubleCapacity();
index = hash & (tab.length - 1);
}
doubleCapacity進行雙倍擴容,它的代碼中有這么一句話
[java] view plain
HashMapEntry<K, V>[] newTable = makeTable(newCapacity);
最終,這個newTable將作為擴容後的新對象返回,那麼makeTable做了什麼呢,如下:
[java] view plain
private HashMapEntry<K, V>[] makeTable(int newCapacity) {
@SuppressWarnings("unchecked") HashMapEntry<K, V>[] newTable
= (HashMapEntry<K, V>[]) new HashMapEntry[newCapacity];
table = newTable;
threshold = (newCapacity >> 1) + (newCapacity >> 2); // 3/4 capacity
return newTable;
}
我們清楚地看到,這里進行了new操作,重新創建對象,開銷很大。
那麼ArrayMap呢,看看:
[java] view plain
//如果容量不夠
ize >= mHashes.length) {
final int n = mSize >= (BASE_SIZE*2) ? (mSize+(mSize>>1))
: (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: 0-" + mSize + " to 0");
//特別注意這,是,而不是new,效率提升
System.array(ohashes, 0, mHashes, 0, ohashes.length);
System.array(oarray, 0, mArray, 0, oarray.length);
}
//釋放無用空間,收縮數組
freeArrays(ohashes, oarray, mSize);
}
ArrayMap用的是數據,所以效率相對要高。
3、ArrayMap提供了數組收縮的功能,在clear或remove後,會重新收縮數組,是否空間
4、ArrayMap採用二分法查找;
以上就是android開發中,HashMap與ArrayMap的區別,大家在涉及到內存方面的實現,可根據實際情況選擇這兩種不同的方式。