一般来讲是地图吧,但放在集合里也是可以找到些相关性,按图索骥的类似吧,当然既然要有规律,Map的特点就具备了其它集合所未有的样式。
- A:Map接口概述
- 查看API可以知道:
- 将键映射到值的对象
- 一个映射不能包含重复的键
- 每个键最多只能映射到一个值
- B:Map接口和Collection接口的不同
- Map是双列的(是双列集合的根接口),Collection是单列的(是单列集合的根接口)
- Map的键唯一,Collection的子体系Set是唯一的
- Map集合的数据结构值针对键有效,跟值无关;如:TreeMap:键是用二叉树算法,HashMap:键是哈希算法
*Collection集合的数据结构是针对元素有效
其实对于方法,Map做出的改变更友好一点。
- A:Map集合的功能概述
- a:添加功能
- V put(K key,V value):添加元素。
- 如果键是第一次存储,就直接存储元素,返回null
- 如果键不是第一次存在,就用值把以前的值替换掉,返回以前的值
- b:删除功能
- void clear():移除所有的键值对元素
- V remove(Object key):根据键删除键值对元素,并把值返回
- c:判断功能
- boolean containsKey(Object key):判断集合是否包含指定的键
- boolean containsValue(Object value):判断集合是否包含指定的值
- boolean isEmpty():判断集合是否为空
- d:获取功能
- Set<Map.Entry<K,V>> entrySet():
- V get(Object key):根据键获取值
- Set keySet():获取集合中所有键的集合
- Collection values():获取集合中所有值的集合
- e:长度功能
- int size():返回集合中的键值对的个数
- a:添加功能
多了些值,约束规范就更完善了点。
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
public class Demo1_Iterator {
/**
* 通过查看Map集合的api发现没有iterator方法,那么双列集合如何迭代呢?
* 根据键获取值
*/
public static void main(String[] args) {
//demo1();//使用keySet方法,通过获取所有的键的集合,在遍历此集合,据键再获取其对应的值
demo2();
}
private static void demo1() {
Map<String, Integer> map = new HashMap<>();
map.put("张三", 23);
map.put("李四", 24);
map.put("王五", 25);
map.put("赵六", 26);
// Integer i = map.get("张三"); //根据键获取值
// System.out.println(i);
//获取所有的键
Set<String> keySet = map.keySet(); //获取所有键的集合
Iterator<String> it = keySet.iterator(); //获取迭代器
while(it.hasNext()) { //判断集合中是否有元素
String key = it.next(); //获取每一个键
Integer value = map.get(key); //根据键获取值
System.out.println(key + "=" + value);
}
}
//使用增强for循环
private static void demo2() {
Map<String, Integer> map = new HashMap<>();
map.put("张三", 23);
map.put("李四", 24);
map.put("王五", 25);
map.put("赵六", 26);
//使用增强for循环遍历
for(String key : map.keySet()) { //map.keySet()是所有键的集合
System.out.println(key + "=" + map.get(key));
}
}
}
以上就是Map集合的遍历之键找值而键值对对象找键和值的思路如下:
- 获取所有键值对对象的集合
- 遍历键值对对象的集合,获取到每一个键值对对象
- 根据键值对对象找键和值
同样的,LinkedHashMap也可以实现为底层是链表,可以保证怎么存就怎么取。
- HashMap和Hashtable的区别
- Hashtable是JDK1.0版本出现的,是线程安全的,效率低,
HashMap是JDK1.2版本出现的,是线程不安全的,效率高 - Hashtable不可以存储null键和null值,HashMap可以存储null键和null值
- Hashtable是JDK1.0版本出现的,是线程安全的,效率低,
总结一下:
Collection
List(存取有序,有索引,可以重复)
ArrayList
底层是数组实现的,线程不安全,查找和修改快,增和删比较慢
LinkedList
底层是链表实现的,线程不安全,增和删比较快,查找和修改比较慢
Vector
底层是数组实现的,线程安全的,无论增删改查都慢
如果查找和修改多,用ArrayList
如果增和删多,用LinkedList
如果都多,用ArrayList
Set(存取无序,无索引,不可以重复)
HashSet
底层是哈希算法实现
LinkedHashSet
底层是链表实现,但是也是可以保证元素唯一,和HashSet原理一样
TreeSet
底层是二叉树算法实现
一般在开发的时候不需要对存储的元素排序,所以在开发的时候大多用HashSet,HashSet的效率比较高
TreeSet在面试的时候比较多,问你有几种排序方式,和几种排序方式的区别
Map
HashMap
底层是哈希算法,针对键
LinkedHashMap
底层是链表,针对键
TreeMap
底层是二叉树算法,针对键
开发中用HashMap比较多
Map就到这了
ps:每日一词
渔家傲·烟柳年初春风早
烟柳年初春风早,江南催使游人老。合抱书牌闲日好,长短调,渔夫唱曲渔家傲。
潭绿人还花厌草,五陵缠头年年少。但劝醉徒随梦笑,上仙岛,春花秋月何时了。