Ⅰ java中HashMap初始容量問題
這個問題可以跟蹤一下HashMap的源碼就知道了,根據輸入的初始化容量(門檻?)的值(先了解HashMap中容量和負載因子的概念,其實這個和HashMap確定存儲地址的演算法有關),先判斷是否大於最大容量,最大容量2的30次方,1<<30 =(1073741824),如果大於此數,初始化容量賦值為1<<30,如果小於此數,調用tableSizeFor方法 使用位運算將初始化容量修改為2的次方數,都是向大的方向運算,比如輸入13,小於2的4次方,那面計算出來桶的初始容量就是16.
publicHashMap(intinitialCapacity){
this(initialCapacity,DEFAULT_LOAD_FACTOR);
}
/**
*Constructsanempty<tt>HashMap</tt>withthespecifiedinitial
*capacityandloadfactor.
*
*@
*@paramloadFactortheloadfactor
*@
*ortheloadfactorisnonpositive
*/
publicHashMap(intinitialCapacity,floatloadFactor){
if(initialCapacity<0)
("Illegalinitialcapacity:"+
initialCapacity);
if(initialCapacity>MAXIMUM_CAPACITY)
initialCapacity=MAXIMUM_CAPACITY;
if(loadFactor<=0||Float.isNaN(loadFactor))
("Illegalloadfactor:"+
loadFactor);
this.loadFactor=loadFactor;
this.threshold=tableSizeFor(initialCapacity);
}
/**
* Returns a power of two size for the given target capacity.
*/
static final int tableSizeFor(int cap) {
int n = cap - 1;
n |= n >>> 1;
n |= n >>> 2;
n |= n >>> 4;
n |= n >>> 8;
n |= n >>> 16;
return (n < 0) ? 1 : (n >= MAXIMUM_CAPACITY) ? MAXIMUM_CAPACITY : n + 1;
}
Ⅱ java遍歷Map的幾種方法分析
1.先初始化一個map
public class TestMap {
public static Map<Integer, Integer> map = new HashMap<Integer, Integer>();
}
2.keySet values
如果只需要map的key或者value,用map的keySet或values方法無疑是最方便的
// KeySet 獲取key
public void testKeySet() {
for (Integer key : map.keySet()) {
System.out.println(key);
}
}
// values 獲取value
public void testValues() {
for (Integer value : map.values()) {
System.out.println(value);
}
}
3.keySet get(key)
如果需要同時獲取key和value,可以先獲取key,然後再通過map的get(key)獲取value
需要說明的是,該方法不是最優選擇,一般不推薦使用
// keySet get(key) 獲取key and value
public void testKeySetAndGetKey() {
for (Integer key : map.keySet()) {
System.out.println(key + ":" + map.get(key));
}
}
4.entrySet
通過對map entrySet的遍歷,也可以同時拿到key和value,一般情況下,性能上要優於上一種,這一種也是最常用的遍歷方法
// entrySet 獲取key and value
public void testEntry() {
for (Map.Entry<Integer, Integer> entry : map.entrySet()) {
System.out.println(entry.getKey() + ":" + entry.getValue());
}
}
5.Iterator
對於上面的幾種foreach都可以用Iterator代替,其實foreach在java5中才被支持,foreach的寫法看起來更簡潔
但Iterator也有其優勢:在用foreach遍歷map時,如果改變其大小,會報錯,但如果只是刪除元素,可以使用Iterator的remove方法刪除元素
// Iterator entrySet 獲取key and value
public void testIterator() {
Iterator<Map.Entry<Integer, Integer>> it = map.entrySet().iterator();
while (it.hasNext()) {
Map.Entry<Integer, Integer> entry = it.next();
System.out.println(entry.getKey() + ":" + entry.getValue());
// it.remove(); 刪除元素
}
}
Ⅲ map string string 怎麼初始化
我也給你一個例子
import java.util.Map;
public class EnvMap {
public static void main (String[] args) {
Map<String, String> env = System.getenv();
for (String envName : env.keySet()) {
System.out.format("%s=%s%n", envName, env.get(envName));
}
Ⅳ java hashmap怎麼初始化
HashMap 是一種常用的復數據結構制,一般用來做數據字典或者 Hash 查找的容器。普通青年一般會這么初始化:
HashMap<String, String> map = new HashMap<String, String>();
map.put("name", "test");
map.put("age", "20");
看完這段代碼,很多人都會覺得這么寫太啰嗦了,文藝青年一般這么來了:
HashMap<String, String> map = new HashMap<String, String>() {
{
map.put("name", "test");
map.put("age", "20");
}
};
Ⅳ 我在JAVA裡面寫了一個list合集,我想要用map類型初始化list裡面的東西
HashMap<String, Integer> hm = new HashMap<String, Integer>();
hm.put("", 0);
沒怎麼看懂問題, 你的TestLzp 是自定義類專,構造器屬是(String,Integer)吧,
Ⅵ 關於JAVA MAP怎麼初始化生成
首先你要理解 Map的基本結構,key-value
這里最外層的Map,key是類型,value是ArrayList。ArrayList裡面放得又是Map,這個Map的key是String,value也是String。
importjava.util.ArrayList;
importjava.util.HashMap;
importjava.util.Map;
publicclassTest{
publicstaticvoidmain(String[]args){
Map<String,ArrayList<Map<String,String>>>topMap=newHashMap<>();
Stringkey1="map_key1";//topMap的第一個key
ArrayList<Map<String,String>>value1=newArrayList<>();//topMap的第一個value
//start
Map<String,String>strMap=newHashMap<>();
strMap.put("hello","你好");
strMap.put("thanks","謝謝");
value1.add(strMap);
value1.add(newHashMap<>());//添加一個空的Map
//end
topMap.put(key1,value1);//放入topMap
//以上start到end段的代碼是在往value1的ArrayList中填充數據
//不填充也可以放入到topMap中,就像下面這樣
topMap.put("emptyList",newArrayList<Map<String,String>>());
topMap.put("emptyList2",newArrayList<>());//jdk1.7及之後推薦這樣寫,省掉泛型描述。前面的newHashMap<>()、newArrayList<>()也是省掉了
}
}
Ⅶ java中private Map<String,List<實體>> names=null; 這樣調用的時候會出現空指針異常,求如何初始化
1.因為你只是 聲明了一個對象啊,可以理解為一個虛擬的東東,也可以理解為一個遙控器,此時未給他匹配一個電視機,那麼你操作遙控器有作用么?
2.只有創建(new)了以後,才給這個對象分配內存, 這時候就是一個具體的東東,你才能使用他. 此時給他指定了一個電視機,那麼你就可以操作遙控器了,而且效果很好.
3.java里創建對象很簡單, 就是用new
4.你的這個可以寫成
names = new HashMap<String,List<實體>>();
5.誰說private 不能new了?
Ⅷ map<string,string>在c99中怎麼初始化,或者說怎麼賦值
map<string,string>mymap;
//添加元素
mymap.insert(pair<string,string>("haha","hehe"));
mymap.insert(map<string,string>::value_type("haha","hehe"));
mymap["haha"]="hehe";
參考代碼如下:
#include<iostream>
#include<map>
usingnamespacestd;
intmain()
{
typedefmap<string,string>::iteratorm_itor;
map<string,string>mymap;
mymap["223"]="adflijd";
mymap.insert(pair<string,string>("235dadf","sdflisha"));
mymap.insert(map<string,string>::value_type("dlfkja","ajefoi"));
for(m_itorit=mymap.begin();it!=mymap.end();it++)
cout<<it->first<<""<<it->second<<endl;
return0;
}
運行結果如下:
Ⅸ 關於java map 初始化,遍歷,排序的幾個解答
Map介面同Set介面和List介面有所不同,Map介面是通過鍵值對來存儲元素的,存儲元素時需要提供一個鍵值(Key),鍵值不能重復,查詢元素時也需要提供鍵值(Key),類似於地址中的街道門牌號,通過門牌號確定唯一的地址。Map介面有多個實現類,分別是HashMap、LinkedHashMap、TreeMap、Propeties。
因為Map存儲的是鍵值對,因此不能用迭代器、foreach等方法遍歷Map。如果需要遍歷Map時,可以通過Map的keySet方法返回HashMap中key值的集合,通過遍歷Key值集合讀取HashMap中的元素。
摘自Map介面及其實現類