list,map,set的区别(首先假定小猪都是同一个细胞克隆出来的)
List=排成一长队的小猪
Map=放在一个个,有房间号的屋子里面的一群小猪
Set=一群小猪贴上号,然后赶到一个猪圈里
Hashset 它不保证集合的迭代顺序;特别是它不保证该顺序恒久不变。
LinkedHashSet定义了迭代顺序,即按照将元素插入到集合中的顺序(插入顺序)进行迭代。
map遍历 keySet ,EntrySet ,(iterator ,foreach)
-
Map<String,String> map =newHashMap<String,String>(); map.put("1","001"); map.put("2","002"); map.put("3","003"); String key =""; String value =""; // 遍历1 keySet方式 Iterator<String> it = map.keySet().iterator(); while(it.hasNext()){ key = it.next(); value = map.get(key); System.out.println(key +" : "+ value); } // 遍历2 增强for循环 for(String string : map.keySet()){ value = map.get(string); System.out.println(string +" : "+ value); } // 遍历3 entrySet Iterator<Entry<String,String>> iter = map.entrySet().iterator(); Entry<String,String> entry; while(iter.hasNext()){ entry = iter.next(); key = entry.getKey(); value = entry.getValue(); System.out.println(key +" : "+ value); } // 遍历4 entrySet foreach for(Entry<String,String> entry2 : map.entrySet()){ key = entry2.getKey(); value = entry2.getValue(); System.out.println(key +" : "+ value); }
map最大 容量 1<< 30 =1073741824
<< 左移位 相当于乘以多少个2, 最大30,以为32位,so,超过32位就是1,31位时候是-2147483648
>> 右移位 除以多少个2
>>> 无符号移位
2<<2 = 8
基于哈希表的 Map 接口的实现。此实现提供所有可选的映射操作,并允许使用 null 值和 null 键。(除了非同步和允许使用 null 之外,HashMap 类与 Hashtable 大致相同。)此类不保证映射的顺序,特别是它不保证该顺序恒久不变。
构造方法
static final int DEFAULT_INITIAL_CAPACITY = 16;
static final int MAXIMUM_CAPACITY = 1 << 30;
static final float DEFAULT_LOAD_FACTOR = 0.75f;
有参数,初始化大小等
public HashMap(int initialCapacity, float loadFactor)
public HashMap(int initialCapacity)
无参构造
public HashMap() {
this.loadFactor = DEFAULT_LOAD_FACTOR;
threshold = (int)(DEFAULT_INITIAL_CAPACITY * DEFAULT_LOAD_FACTOR);
table = new Entry[DEFAULT_INITIAL_CAPACITY];
init();
} 可接收map类型的构造
public HashMap(Map<? extends K, ? extends V> m) {
this(Math.max((int) (m.size() / DEFAULT_LOAD_FACTOR) + 1,
DEFAULT_INITIAL_CAPACITY), DEFAULT_LOAD_FACTOR);
putAllForCreate(m);
} 方法
是否包含 key
1 publicboolean containsKey(Object key){ 2 Object k = maskNull(key); 3 int hash = hash(k); 4 int i = indexFor(hash, table.length); 5 Entry e = table[i]; 6 while(e !=null){ 7 if(e.hash == hash && eq(k, e.key)) 8 returntrue; 9 e = e.next; 10 } 11 returnfalse; 12 }
包含value
-
1 publicboolean containsValue(Object value){ 2 if(value ==null) 3 return containsNullValue(); 4 Entry[] tab = table; 5 for(int i =0; i < tab.length ; i++) 6 for(Entry e = tab[i]; e !=null; e = e.next) 7 if(value.equals(e.value)) 8 returntrue; 9 returnfalse; 10 }
加入元素(如果key存在,则返回原value,不存在则加入)
-
1 public V put(K key, V value){ 2 K k = maskNull(key); 3 int hash = hash(k); 4 int i = indexFor(hash, table.length); 5 for(Entry<K,V> e = table[i]; e !=null; e = e.next){ 6 if(e.hash == hash && eq(k, e.key)){ 7 V oldValue = e.value; 8 e.value = value; 9 e.recordAccess(this); 10 return oldValue; 11 } 12 } 13 modCount++; 14 addEntry(hash, k, value, i); 15 returnnull; 16 }
public void putAll(Map<? extends K, ? extends V> m)
可以放入map 类型
根据key删除
-
1 public V remove(Object key){ 2 Entry<K,V> e = removeEntryForKey(key); 3 return(e ==null?null: e.value); 4 }
清空
-
1 /** 2 * Removes all mappings from this map. 3 */ 4 publicvoid clear(){ 5 modCount++; 6 Entry[] tab = table; 7 for(int i =0; i < tab.length; i++) 8 tab[i]=null; 9 size =0; 10 }
重写了 hashCode toString
-
1 publicboolean equals(Object o){ 2 if(!(o instanceofMap.Entry)) 3 returnfalse; 4 Map.Entry e =(Map.Entry)o; 5 Object k1 = getKey(); 6 Object k2 = e.getKey(); 7 if(k1 == k2 ||(k1 !=null&& k1.equals(k2))){ 8 Object v1 = getValue(); 9 Object v2 = e.getValue(); 10 if(v1 == v2 ||(v1 !=null&& v1.equals(v2))) 11 returntrue; 12 } 13 returnfalse; 14 } 15 publicint hashCode(){ 16 return(key==NULL_KEY ?0: key.hashCode())^ 17 (value==null?0: value.hashCode()); 18 } 19 publicString toString(){ 20 return getKey()+"="+ getValue(); 21 }
遍历方法keySet 和entrySet 选择上,由此可知,key简单情况下,选keySet, 需要同时取值时候选entrySet
entrySet消耗更大
keySet
-
1 publicSet<K> keySet(){ 2 Set<K> ks = keySet; 3 return(ks !=null? ks :(keySet =newKeySet())); 4 }
entrySet
-
1 publicSet<Map.Entry<K,V>> entrySet(){ 2 Set<Map.Entry<K,V>> es = entrySet; 3 return(es !=null? es :(entrySet =(Set<Map.Entry<K,V>>)(Set)newEntrySet())); 4 }
Values
-
1 publicCollection<V> values(){ 2 Collection<V> vs = values; 3 return(vs !=null? vs :(values =newValues())); 4 }