Map集合及其子类:
一:Map
1.概述将键映射到值得对象。一个映射不能包含重复的键,每个键最多只能映射到一个值。
2.Map和Collection的区别?
A:Map集合是一种键值对的关系,存储的是键值对的形式的元素,键是唯一的,值可以重复
子实现类:HashMap,TreeMap
B:Collection集合是集合框架的顶层接口,存储的是单个元素,子接口List元素可以重复,子接口Set元素唯一。
子实现类:ArrayList,Vector,LinkedList
3.Map集合有自己的功能:
A:put(k,V):给Map集合中添加元素
特点:如果键是第一次存储,那么返回值就是null
如果键不是第一次存储,那么后面存储的键对应的值会把第一次存储的键对应的值覆盖掉,返回值返回的是第一次存储的时候键对应的值;
B:clear():删除所有映射关系
remove(Key k):删除键,返回的值
C:长度:获取键值对对数:size()
D:isEmpty():判断集合是否为空
E:判断功能
containsKey(K)
containsValue(K)
F: Map集合的获取功能
V get(Object key):通过指定的键获取该键对应的值
Set<K> keySet():获取所有的键的集合
Collection<V> values():获取所有的值的集合
4:Map集合的遍历
* Map集合的遍历:
*
* 1)map---->夫妻对
* 思路:1)把所有的丈夫集中起来
* 2)拿到每一个丈夫,让丈夫找对应的妻子
* 3)输出夫妻对
*
* 转换
* 1)获取该集合中的所有的键的集合
* 2)遍历所有的键,获取每一个键,然后通过键获取值
* 3)输出键值对
代码:
public class MapDemo2 {
public static void main(String[] args) {
//创建Map集合对象
Map<String, String> map = new HashMap<String, String>() ;
//给集合中添加键值对
map.put("杨过", "小龙女") ;
map.put("郭靖", "黄蓉") ;
map.put("杨康", "穆念慈") ;
map.put("陈玄风", "梅超风") ;
//获取所有的键的集合
Set<String> set = map.keySet() ;
for(String key : set){
//通过键,在获取值
String value = map.get(key) ;
System.out.println(key+"----"+value);
}
}
}
2) map--->结婚证
* 思路:
* 1)将结婚证集中起来
* 2)通过结婚证获取每一个丈夫和妻子
* 3)输出丈夫和妻子
* 转换:
* 1)获取键值对对象
* 2)通过键值对对象获取键和值
* 3)输出键和值
*
* 问题:
* 如何获取键值对对象?
* Set<Map.Entry<K,V>> entrySet():获取键值对对象
代码:
public class MapDemo3 {
public static void main(String[] args) {
//创建Map集合对象
Map<String, String> map = new HashMap<String, String>();
给集合中添加键值对
map.put("杨过", "小龙女") ;
map.put("郭靖", "黄蓉") ;
map.put("杨康", "穆念慈") ;
map.put("陈玄风", "梅超风") ;
//获取键值对对象
Set<Map.Entry<String, String>> entrySet = map.entrySet() ;
//遍历键值对对象,通过键值对对象获取键和值
for(Map.Entry<String, String> me :entrySet){
//遍历里面的所有的键值对对象了,问题是如何获取键和值呢?
// K getKey()
String key = me.getKey() ;
// V getValue()
String value = me.getValue() ;
System.out.println(key+"----"+value);
}
}
}
二:HashMap
HashMap<K,V>:底层数据结果给是通过哈希表实现的,哈希表保证K的唯一性(双列集合只针对键有效)HashMap<String,String>
三:LinkedMap
LinkedHashMap集合:底层数据结构有哈希表和链表是实现哈希表:保证键的唯一性
链表:保证元素的存储和取出一致
四:TreeMap
TreeMap集合的概述:红黑树(Red-Black tree两种排序:自然排序
比较器排序
代码:
package org.westos_04;
public class Student {
private String name;
private int age ;
public Student() {
super();
// TODO Auto-generated constructor stub
}
public Student(String name, int age) {
super();
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
//测试类
import java.util.Comparator;
import java.util.Set;
import java.util.TreeMap;
import org.westos_02.Student;
/**
* 给学生对象按照年龄从小到大进行排序
* */
public class TreeMapDemo2 {
public static void main(String[] args) {
//开发中是用的匿名内部类:比较器排序
TreeMap<Student, String> tm = new TreeMap<Student, String>(new Comparator<Student>() {
@Override
public int compare(Student s1, Student s2) {
//主要条件:是按照年龄从小到大
int num = s1.getAge() - s2.getAge() ;
//次要条件:年龄一样,不一定姓名相同
int num2 = num==0? s1.getName().compareTo(s2.getName()) : num;
return num2;
}
});
//创建学生对象:
Student s1 = new Student("潘安", 27) ;
Student s2 = new Student("唐伯虎", 27) ;
Student s3 = new Student("柳下惠", 25) ;
Student s4 = new Student("李清照", 22) ;
Student s5 = new Student("杜甫", 20) ;
Student s6 = new Student("唐伯虎", 27) ;
tm.put(s1, "明西晋" ) ;
tm.put(s2, "汉朝" ) ;
tm.put(s3, "明朝" ) ;
tm.put(s4, "宋朝" ) ;
tm.put(s5, "唐朝" ) ;
tm.put(s6, "明朝" ) ;
//获取所有的键的集合
Set<Student> keySet = tm.keySet() ;
for(Student key : keySet){
String value = tm.get(key) ;
System.out.println(key.getName()+"---"+key.getAge()+"---"+value);
}
}
}
五: Hasbtable和HashMap的区别?
HashMap:哈希表将键映射到对应的值,此集合是允许有null值null键的,线程角度考虑:HashMap集合线程不安全的,不同步,执行效率高
Hastable:哈希表将键映射到对应到值,此集合是不允许有null值null键的,线程角度考虑:Hashtable集合
线程安全的,同步,执行效率低!
面试题:
List集合和Set集合是继承自Map集合吗?
List和Set集合属于单列集合,继承自Collection顶层次的根接口,跟Map接口没有关系
HashMap和TreeMap才是Map的子实现类
public class HashtableDemo {
public static void main(String[] args) {
//HashMap集合对象
// HashMap<String, String> hm = new HashMap<String, String>();
Hashtable<String, String> hm = new Hashtable<String,String>() ;
//添加元素
// hm.put(null, "hello") ;//NullPointerException
hm.put("world", null);//NullPointerException
Set<String> keySet = hm.keySet() ;
for(String key :keySet){
String value = hm.get(key) ;
System.out.println(key+"---"+value);
}
}
}
六:Collections
针对集合进行操作的工具类:CollectionsAPI没有构造方法,所有里面的方法静态修饰
常用的几个方法:
public static void sort(List<T> list)根据元素的自然顺序 对指定列表按升序进行排序
public static T max(Collection<? extends T> coll):求最大值
public static <T> int binarySearch(List<> list, T key):参数1:表示list集合,参数2:表示要查找的集合中的元素
public static void shuffle(List<?> list):随机置换
代码:
public class CollectionsDemo {
public static void main(String[] args) {
//创建集合对象
List<Integer> list = new ArrayList<Integer>();
//给集合中添加元素
list.add(50);
list.add(20);
list.add(30);
list.add(40);
list.add(10);
//public static void sort(List<T> list)根据元素的自然顺序 对指定列表按升序进行排序
Collections.sort(list) ;
System.out.println("max:"+Collections.max(list));
//[10,20,30,40,50]
// public static <T> int binarySearch(List<> list, T key):参数1:表示list集合,参数2:表示要查找的集合中的元素
System.out.println("index:"+Collections.binarySearch(list, 30));
// System.out.println("index:"+Collections.binarySearch(list, 300));
//public static void shuffle(List<?> list)
Collections.shuffle(list);
System.out.println("List:"+list);
}
}