JAVA中的容器 3

626 阅读3分钟

1.Map接口

Map接口存储一组键值对象类型的数据 k-v,提供key(键)和value(值)的映射.

k的特点:无序的,不可重复的 ---->所有的key的值就是一个set集合.

v的特点:无序的,可重复 ----->Collection的特点

一个key对象一个value值,如果想要对应多个,多个value值可以存在在一个数组|容器中,但当key相同时候,value会覆盖.

接下来我们看一下map容器的使用

public class MapDemo01 {
	public static void main(String[] args) {
		Map<String,Integer> map=new HashMap();
		//put(key,value) 添加
		map.put("java33期", 23);
		map.put("java32期", 20);
		map.put("java32期", 21);
		map.put("java31期", 40);
		map.put("java30期", 35);
		map.put("java29期", 20);
		System.out.println(map);
		
		//remove(key)  返回被移出的value值
		map.remove("java32期");
		System.out.println(map);
		
		//包含  
		System.out.println(map.containsKey("java33期"));
		System.out.println(map.containsValue(19));
		
		//get(key)
		System.out.println(map.get("java33期"));
		
		System.out.println(map);
	}
}	
  • map中添加数据使用put(key,value)的方式
  • remove(key) 移除相应的(key,value)数据
  • map.containsKey|map.containsValue 判断其key或者value是否存在于容器中.返回对应的true|false
  • get(key) 根据key值返回对应的value值

下面我们来看看map容器下的遍历问题

  • 方法一:keySet() 返回所有的key,组成一个set集合
Set<String> set=map.keySet();
for(String cl:set){
	System.out.println(cl);
  • 方法二:迭代器
Iterator<String> it=set.iterator();
	while(it.hasNext()){
		String key=it.next();
		System.out.println(key+","+map.get(key)); 
  • 方法三:获取所有的value值 values() 只能拿到value的值,无法获取key
Collection<Integer> col=map.values();
	for(Integer in:col){
		System.out.println(in);
	}
  • 方法四:直接获取键值对的形式,在通过其他方式进行遍历
Set<Map.Entry<String,Integer>> sets=map.entrySet();
	for(Map.Entry<String,Integer> entry:sets){
		System.out.println(entry.getKey()+"-->"+entry.getValue());
	}

2.HashMap与TreeMap

HashMap 推荐使用 ,线程不安全增删,查询效率高 底层: 哈希表的结构

初始容量:16

加载因子: 0.75

扩容:原容量的2倍

  • 如果HashMap的key是自定义的引用数据类型,需要对key的数据的类型重写hashCode()和equals()方法,实现去重,value会覆盖
  • 如果key相同,value不覆盖-->先判断,如果key相同就不存储,key不相同,才存储
  • 如果需求个根据value去重,需要自己手动定义判断 containsKey() containsValue()
public class HashMapDemo02 {
   public static void main(String[] args) {
   	HashMap<Person,String> map=new HashMap();
   	map.put(new Person("胡歌",30,180), "上海");
   	map.put(new Person("杨洋",18,160), "北京");
   	map.put(new Person("霍比特人",60,100), "新西兰");
   	map.put(new Person("霍比特人",60,100), "荷兰");
   	
   	System.out.println(map);
   }
}

TreeMap 中的数据有按照指定规则进行排序,推荐使用TreeMap

定义容器TreeMap

  •  1)存储key是基本数据类型|String ,value引用数据类型的数据-->去重,排序
    
  •  2)存储key是自定义的应用数据类型,value是任意类型  -->去重,排序
    
  •  去重和排序都按照比较规则进行操作  内部和外部比较器
    
public class TreeMap03 {
   public static void main(String[] args) {
   	/*TreeMap<Person,Person> map=new TreeMap((p1,p2)->{
   		return ((Person)p1).getAge()-((Person)p2).getAge();
   	});*/
   	
   	//匿名内部类  接口多态指向一个不知名的实现类对象
   	Comparator com=new Comparator(){

   		@Override
   		public int compare(Object o1, Object o2) {
   			return ((Person)o2).getAge()-((Person)o1).getAge();
   		}
   		
   	};
   	
   	TreeMap<Person,Person> map=new TreeMap(com);
   	map.put(new Person("胡歌",30,180),new Person("哈哈",100,100));
   	map.put(new Person("杨洋",18,160),new Person("哈哈",100,100));
   	map.put(new Person("霍比特人",60,100),new Person("哈哈",100,100));
   	map.put(new Person("霍比特人",60,100), new Person("哈哈",100,100));
   	
   	System.out.println(map);
   }
}

//Comparator 接口  抽象方法compare() 中可以定义比较规则
class Demo implements Comparator{

   @Override
   public int compare(Object o1, Object o2) {
   	return ((Person)o2).getAge()-((Person)o1).getAge();
   }
   
}

Hashtable 相当于线程安全的HashMap