hashmapandroid
❶ android怎麼把json轉換為hashmap
在android中把json轉換為hashmap,代碼如下:
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import net.sf.json.JSONArray;
import net.sf.json.JSONException;
import net.sf.json.JSONObject;
import com.wideyou.model.ExpressOrder;
import com.wideyou.warehouse.model.Storage;
public class HelperFunction {
public ExpressOrder ExpressOrderClassCast(JSONObject reserJson){
ExpressOrder expressOrder=new ExpressOrder();
expressOrder.setCid(Integer.parseInt(reserJson.getString("userId")));
expressOrder.setSendPerson(reserJson.getString("sendPerson"));
expressOrder.setSendPhone(reserJson.getString("sendPhone"));
expressOrder.setSendAddress(reserJson.getString("sendAddress"));
expressOrder.setBeginAddress(reserJson.getString("beginAddress"));
expressOrder.setOtherDes(reserJson.getString("otherDes"));
expressOrder.setEndAddress(reserJson.getString("endAddress"));
expressOrder.setReservPerson(reserJson.getString("reservPerson"));
expressOrder.setReservPhone(reserJson.getString("reservPhone"));
expressOrder.setReservAddress(reserJson.getString("reservAddress"));
expressOrder.setPostCode(reserJson.getString("reservAddress"));
expressOrder.setPayId(Integer.parseInt(reserJson.getString("payId")));
return expressOrder;
}
public Storage StorageClassCast(JSONObject reserJson){
Storage storage=new Storage();
storage.setSname(reserJson.getString("sname"));
storage.setCount(Integer.parseInt(reserJson.getString("count")));
return storage;
}
public static int getCid(JSONObject reserJson, boolean isConsumer){
if(isConsumer){
return Integer.parseInt(reserJson.getString("userId"));
}else{
return Integer.parseInt(reserJson.getString("memberId"));
}
}
//map轉換為json字元串
public static String hashMapToJson(HashMap map) {
String string = "{";
for (Iterator it = map.entrySet().iterator(); it.hasNext();) {
Entry e = (Entry) it.next();
string += "'" + e.getKey() + "':";
string += "'" + e.getValue() + "',";
}
string = string.substring(0, string.lastIndexOf(","));
string += "}";
return string;
}
public static void JsonObject2HashMap(JSONObject jo, List> rstList) {
for (Iterator keys = jo.keys(); keys.hasNext();) {
try {
String key1 = keys.next();
System.out.println("key1---" + key1 + "------" + jo.get(key1)
+ (jo.get(key1) instanceof JSONObject) + jo.get(key1)
+ (jo.get(key1) instanceof JSONArray));
if (jo.get(key1) instanceof JSONObject) {
JsonObject2HashMap((JSONObject) jo.get(key1), rstList);
continue;
}
if (jo.get(key1) instanceof JSONArray) {
JsonArray2HashMap((JSONArray) jo.get(key1), rstList);
continue;
}
System.out.println("key1:" + key1 + "----------jo.get(key1):"
+ jo.get(key1));
json2HashMap(key1, jo.get(key1), rstList);
} catch (JSONException e) {
e.printStackTrace();
}
}
}
public static void JsonArray2HashMap(JSONArray joArr,
List> rstList) {
for (int i = 0; i < joArr.size(); i++) {
try {
if (joArr.get(i) instanceof JSONObject) {
JsonObject2HashMap((JSONObject) joArr.get(i), rstList);
continue;
}
if (joArr.get(i) instanceof JSONArray) {
JsonArray2HashMap((JSONArray) joArr.get(i), rstList);
continue;
}
System.out.println("Excepton~~~~~");
} catch (JSONException e) {
e.printStackTrace();
}
}
}
public static void json2HashMap(String key, Object value,
List> rstList) {
HashMap map = new HashMap();
map.put(key, value);
rstList.add(map);
}
}
❷ Android面試 HashMap演算法
基於hashing的原理,jdk8後採用數組+鏈表+紅黑樹的數據結構。我們通過put和get存儲和獲取對象。當我們給put()方法傳遞鍵和值時,先對鍵做一個hashCode()的計算來得到它在bucket數組中的位置來存儲Entry對象。當獲取對象時,通過get獲取到bucket的位置,再通過鍵對象的equals()方法找到正確的鍵值對,然後在返回值對象。
當數組table的size達到闕值時即++size > load factor * capacity 時,也是在putVal函數中。
擴容需要重新分配一個新數組,新數組是老數組的2倍長,然後遍歷整個老結構,把所有的元素挨個重新hash分配到新結構中去。
對key的hashCode進行hashing,與運算計算下標獲取bucket位置,如果在桶的首位上就可以找到就直接返回,否則在樹中找或者鏈表中遍歷找,如果有hash沖突,則利用equals方法去遍歷鏈表查找節點。
對key的hashCode做hash操作,與高16位做異或運算。
還有平方取中法,除留余數法,偽隨機數法。
因為數組位置的確定用的是與運算,僅僅最後四位有效,設計者將key的哈希值與高16為做異或運算使得在做&運算確定數組的插入位置時,此時的低位實際是高位與低位的結合,增加了隨機性,減少了哈希碰撞的次數。
會產生哈希碰撞,若key值相同則替換舊值,不然鏈接到鏈表後面,鏈表長度超過闕值8就轉為紅黑樹存儲。
HashCode相同,通過equals比較內容獲取值對象。
超過闕值會進行擴容操作,概括的講就是擴容後的數組大小是原數組的2倍,將原來的元素重新hashing放入到新的散列表中去。
相同點:都是存儲key-value鍵值對的
不同點:
loadFactor表示HashMap的擁擠程度,影響hash操作到同一個數組位置的概率。默認loadFactor等於0.75,當HashMap裡面容納的元素已經達到HashMap數組長度的75%時,表示HashMap太擠了,需要擴容,在HashMap的構造器中可以定製loadFactor。
JDK 1.8 以前 HashMap 的實現是 數組+鏈表,即使哈希函數取得再好,也很難達到元素百分百均勻分布。當 HashMap 中有大量的元素都存放到同一個桶中時,這個桶下有一條長長的鏈表,這個時候 HashMap 就相當於一個單鏈表,假如單鏈表有 n 個元素,遍歷的時間復雜度就是 O(n),完全失去了它的優勢。針對這種情況,JDK 1.8 中引入了 紅黑樹(查找時間復雜度為 O(logn))來優化這個問題。但是鏈表大於8的概率是非常非常低的。
選擇Integer,String這種不可變的類型,像對String的一切操作都是新建一個String對象,對新的對象進行拼接分割等,這些類已經很規范的覆寫了hashCode()以及equals()方法。作為不可變類天生是線程安全的。如果要使用自定義類做為Key,就需要重寫hashCode()以及equals()方法。紅黑樹在做比較的時候使用的是System.identityHashCode()方法,是不需要做特殊處理的。
更多內容戳這里(整理好的各種文集)
❸ HashMap在Android和Java中的不同實現
1.具體代碼比較如下:
<!-- Android -->
@Override public int hashCode() {
int hash = hashCode;
if (hash == 0) {
if (count == 0) {
return 0;
}
final int end = count + offset;
final char[] chars = value;
for (int i = offset; i < end; ++i) {
hash = 31*hash + chars[i];
}
hashCode = hash;
}
return hash;
}
<!-- Java-->
public int hashCode() {
int h = hash;
int len = count;
if (h == 0 && len > 0) {
int off = offset;
char val[] = value;
for (int i = 0; i < len; i++) {
h = 31*h + val[off++];
}
hash = h;
}
return h;
}
2.兩者的默認構造函數不一樣,本質上就是兩者的table大小不一樣,Java中的table默認
大小是16×0.75=12(容量×負載因子),而Android中table的默認大小是2,所以即使是同樣的字元串按同樣的順序放入HashMap中
它們的key值存放順序也會不一樣。
<!-- Android -->
private static final Entry[] EMPTY_TABLE
= new HashMapEntry[MINIMUM_CAPACITY >>> 1];
//默認構造函數
public HashMap() {
table = (HashMapEntry<K, V>[]) EMPTY_TABLE;
threshold = -1; // Forces first put invocation to replace EMPTY_TABLE
}
<!-- Java -->
static final int DEFAULT_INITIAL_CAPACITY = 16;
static final float DEFAULT_LOAD_FACTOR = 0.75f;
//默認構造函數
public HashMap() {
this(DEFAULT_INITIAL_CAPACITY,DEFAULT_LOAD_FACTOR);
}
3.其實仔細讀源碼會發現,在Android中所實現的HashMap類關於"閾值(threshold )"的設定也已經和Java不同了,具體請看截取的源碼:
<!-- Android -->
//閾值固定取其table大小的3/4
threshold = (newCapacity >> 1) + (newCapacity >> 2);
<!-- Java -->
//閾值取容量*負載因子或最大容量+1間的小值
threshold = (int)Math.min(capacity * loadFactor, MAXIMUM_CAPACITY + 1);
❹ android中hashmap是什麼意思有什麼作用
在認識hashmap中要先認識Map。在數組中我們是通過數組下標來對其內容索引的,而在Map中我們通過對象來對對象進行索引,用來索引的對象叫做key,其對應的對象叫做value。
HashMap的初始過程 :在並發環境下使用HashMap
而沒有做同步,可能會引起死循環,關於這一點,sun的官方網站上已有闡述,這並非是bug。
HashMap的數據結構 :HashMap主要是用數組來存儲數據的,我們都知道它會對key進行哈希運算,哈系運算會有重復的哈希值,對於哈希值的沖突,HashMap採用鏈表來解決的。在HashMap里有這樣的一句屬性聲明:
transient Entry[]
table;
因此hashmap可以在andriod中用來存儲數據。
❺ Android開發 HashMap如何排序
HashMap排序是數據結構與演算法中常見的一種排序演算法。本文即以Android平台為例來實現該演算法。
具體代碼如下: public static void main(String[] args) { Map<String, Integer> map = new HashMap<String, Integer>(); map.put("lisi", 5); map.put("lisi1", 1); map.put("lisi2", 3); map.put("lisi3", 9); List<Map.Entry<String, Integer>> infoIds = new ArrayList<Map.Entry<String, Integer>>( map.entrySet()); System.out.println("--------------排序前--------------"); for (int i = 0; i < infoIds.size(); i++) { String id = infoIds.get(i).toString(); System.out.println(id); } // 排序 Collections.sort(infoIds, new Comparator<Map.Entry<String, Integer>>() { public int compare(Map.Entry<String, Integer> o1, Map.Entry<String, Integer> o2) { return ( o1.getValue()-o2.getValue()); } }); System.out.println("--------------排序後--------------"); for (int i = 0; i < infoIds.size(); i++) { Entry<String,Integer> ent=infoIds.get(i); System.out.println(ent.getKey()+"="+ent.getValue()); }}
❻ 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;
}