集合(五)Map及其子类

来源:互联网 发布:高性能网络编程1 编辑:程序博客网 时间:2024/06/10 01:08

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

针对集合进行操作的工具类:Collections
 API没有构造方法,所有里面的方法静态修饰
  常用的几个方法:
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);


}
}

原创粉丝点击