Map接口概述
查看API可以知道:
* 将键映射到值的对象
* 一个映射不能包含重复的键
* 每个键最多只能映射到一个值
Map接口和Collection接口的不同
* Map是双列的,Collection是单列的
* Map的键唯一,Collection的子体系Set是唯一的
* Map集合的数据结构值针对键有效,跟值无关;Collection集合的数据结构是针对元素有效
功能:
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<K> keySet():获取集合中所有键的集合
* Collection<V> values():获取集合中所有值的集合
* e:长度功能
* int size():返回集合中的键值对的个数
注意:hashmap的输出顺序与输入顺序不一致,即无法实现怎么存怎么取。
遍历hashMap的方法:
public static void main(String[] args) {
HashMap<cooker, String> hMap = new HashMap<>();
hMap.put(new cooker("张三",25), "北京");
hMap.put(new cooker("李四",26), "深圳");
hMap.put(new cooker("王五",65), "上海");
hMap.put(new cooker("赵六",25), "广州");
System.out.println(hMap);
//遍历方法一,通过Map.keySet遍历key和value:
System.out.println("...............方法一..............");
for (cooker key : hMap.keySet()) {
System.out.println("key=" + key+" and value="+hMap.get(key));
}
/*遍历方法二,通过Map集合的遍历之键值对对象找键和值,即通过Map.entrySet使用iterator遍历key和value:
*1、 获取所有键值对对象的集合
*2、遍历键值对对象的集合,获取到每一个键值对对象
*3、根据键值对对象找键和值
*/
System.out.println("...............方法二..............");
//Map.Entry说明Entry是Map的内部接口,将键和值封装成Entry对象,并储存在set集合中
Set<Map.Entry<cooker, String>> entrySet = hMap.entrySet();
//获取每一个对象
Iterator<Map.Entry<cooker, String>> iterator = entrySet.iterator();
while(iterator.hasNext()) {
//遍历键值对对象的集合,获取到每一个键值对对象
Map.Entry<cooker, String> entry = iterator.next();//父类引用指向子类对象
/*因为hashmap的entry继承了Map.Entry,
* 而iterator.next()获取的是hashmap的entry对象,它是继承了Map.Entry。
*/
//Entry<cooker, String> entry = iterator.next()直接获取子类对象
//通过对象的get方法获得对象的属性值
cooker key = entry.getKey();
String value = entry.getValue();
System.out.println("key="+key+" and value="+value);
}
//通过Map.entrySet遍历key和value
System.out.println("...............方法三..............");
for (Map.Entry<cooker, String> entry : hMap.entrySet()) {
System.out.println("key="+entry.getKey()+" and value="+entry.getValue());
}
//通过Map.values()遍历所有的value,但不能遍历key
System.out.println("...............方法四..............");
for (String values : hMap.values()) {
System.out.println("values="+values);
}
}
HashMap的两个子类LinkedHashMap和TreeMap
LinkedHashMap:保证怎麽存怎么取
public static void main(String[] args) {
LinkedHashMap<cooker, String> linkedHashMap = new LinkedHashMap<>();
linkedHashMap.put(new cooker("张三", 24), "北京");
linkedHashMap.put(new cooker("李四", 25), "广州");
linkedHashMap.put(new cooker("王五", 26), "上海");
linkedHashMap.put(new cooker("赵六", 27), "深圳");
System.out.println(linkedHashMap);
}
TreeMap:凡tree中的自定义对象都要实现Comparable接口。因为要进行比较。主要是进行集合内元素排序。按对象的hashcode值比较。而重写hashcode方法则是因为要剔除重复的元素。
Exception in thread "main" java.lang.ClassCastException: com.jiuzhou.bean.cooker cannot be cast to java.lang.Comparable
at java.util.TreeMap.compare(Unknown Source)
at java.util.TreeMap.put(Unknown Source)
at com.jiuhzou.Map.Test1.main(Test1.java:18)
public class cooker implements Comparable<cooker>
public static void main(String[] args) {
TreeMap<cooker, String> tMap = new TreeMap<>();
tMap.put(new cooker("张三", 24), "北京");
tMap.put(new cooker("李四", 25), "广州");
tMap.put(new cooker("王五", 26), "上海");
tMap.put(new cooker("赵六", 27), "深圳");
System.out.println(tMap);
}
往treemap中加入比较器,从而根据自定义对象的属性值进行排序或者根据其它的属性值进行排序。
public static void main(String[] args) {
TreeMap<cooker, String> tMap = new TreeMap<>(new Comparator<cooker>() {
@Override
public int compare(cooker o1, cooker o2) {
int num=o1.getName().compareTo(o2.getName());
return num==0?1:num;
}
});
tMap.put(new cooker("张三", 24), "北京");
tMap.put(new cooker("李四", 25), "广州");
tMap.put(new cooker("王五", 26), "上海");
tMap.put(new cooker("赵六", 27), "深圳");
System.out.println(tMap);
}
注意:在hashmap、TreeMap和LinkedHashMap中,效率最高的是hashmap。因为LinkedHashMap底层是链表,TreeMap需要排序比较。
用键值对统计字符串中每个字符出现的次数
public static void main(String[] args) {
// 统计字符串中每个字符出现的次数
Scanner scanner = new Scanner(System.in);
String string = scanner.nextLine();
char[] arr = string.toCharArray();
HashMap< Character, Integer> hashMap= new HashMap<>();
for(char c : arr) {
/* if(!hashMap.containsKey(c)) {
hashMap.put(c, 1);
}else {
hashMap.put(c, hashMap.get(c)+1);
}*/
hashMap.put(c, !hashMap.containsKey(c)?1:hashMap.get(c)+1);
}
for(char ch : hashMap.keySet()) {
System.out.println("key="+ch+"and value=" +hashMap.get(ch));
}
}
集合嵌套之HashMap嵌套HashMap
public static void main(String[] args) {
HashMap<cooker, String> ynj = new HashMap<>();
ynj.put(new cooker("张三", 24), "北京");
ynj.put(new cooker("李四", 25), "广州");
ynj.put(new cooker("王五", 26), "上海");
ynj.put(new cooker("赵六", 27), "深圳");
HashMap<cooker, String> enj = new HashMap<>();
enj.put(new cooker("谢晓峰", 24), "北京");
enj.put(new cooker("胡一刀", 25), "广州");
enj.put(new cooker("段誉", 26), "上海");
enj.put(new cooker("乔峰", 27), "深圳");
HashMap<HashMap<cooker, String>, String> nj = new HashMap<>();
nj.put(ynj, "一年级");
nj.put(enj, "二年级");
//遍历
for (HashMap<cooker, String> p: nj.keySet()) {
String value2 = nj.get(p);
for (cooker c : p.keySet()) {
String value = p.get(c);
System.out.println(c+"="+value+value2);
}
}
}
HashMap和Hashtable的区别:
共同点:底层都是hash算法,都是双列集合
区别:
hashMap是线程不安全的,效率高,jdk1.2版本,可以存储null值和null键。
hashtable是线程安全的,效率低,jdk1.0版本,不可以存储null值和null键。
Collections类概述
针对集合操作 的工具类
Collections成员方法
public static <T> void sort(List<T> list)
public static <T> int binarySearch(List<?> list,T key)
public static <T> T max(Collection<?> coll)
public static void reverse(List<?> list)
public static void shuffle(List<?> list) //随机排序
皆为静态方法,直接调用即可。