JAVA_JCF(Java Collection Framework)学习笔记(四)

Map集合: 该集合存储键值对。一对一对往里存。而且要保证键的唯一性

 1 添加:

put(K key, V value)

putAll(Map<? extends K, ? extends V> m)

2 删除:

clear()

remove(Object key)

3 判断:

containsValue(Object value)

containsKey(Object key)

isEmpty()

4 获取

get(Object key)

size()

values()


entrySet();

keySet()


Map

|-----HashTable:底层是哈希表数据结构,不可以存入null键null值。该集合是线程同步的。jdk1.0 效率低

|-----HashMap:底层是哈希表数据结构,允许存入null键null值。该集合是线程不同步的。 jdk1.2。 效率高

|-----TreeMap:底层是二叉树数据结构。线程不同步的。可以用于给map集合中的键进行排序

基本共性方法测试:

@Test
	public void testMap(){
		
		Map<String, String> map = new HashMap<String, String>();
		
		//添加元素(添加元素时,如果出现相同的key值,则后者会覆盖欠着的value值,并put方法会返回被覆盖的值)
		System.out.println("put:" + map.put("01", "zhangsan1"));
		System.out.println("put:" + map.put("01", "wangwu1"));//返回zhangsan1
		map.put("02", "zhangsan2");
		map.put("03", "zhangsan3");
		
		System.out.println("containsKey:" + map.containsKey("02"));
//		System.out.println("remove:" + map.remove("02"));
		System.out.println("get:" + map.get("002"));
		
		map.put("04", null);
		System.out.println("get:" + map.get("04"));
		//可以通过get方法的返回值来判断一个键是否存在,通过返回null来判断
		
		//获取map集合中所有的值
		
		
		System.out.println(map);//由于key"01"重复存入,后者会覆盖前者的value
	}


map集合的两种取出方式:

map集合的取出原理: 将map集合转成set集合,然后通过迭代器取出。


Set <K> keySet()

将map中所有的键存入到set集合。因为set具备迭代器,所以可以用迭代方式取出所有的键,然后根据get方法,获取每一个键对应的值。

代码测试:

@Test
	public void testMapKeySet(){
		
		Map<String, String> map = new HashMap<String, String>();

		//添加元素
		map.put("01", "zhangsan1");
		map.put("02", "zhangsan2");
		map.put("03", "zhangsan3");
		map.put("04", "zhangsan4");
		
		//先获取map集合的所有键的Set集合,keySet()
		Set<String> keySet = map.keySet();
		
		//有了Set集合可以获取迭代器
		Iterator<String> iterator = keySet.iterator();
		while(iterator.hasNext()){
			
			String key = iterator.next();
			String value = map.get(key);
			
			System.out.println("key:" + key + "=" + value );
		}
	}

Set<Map.Entry<K, V>> entrySet()

将map集合中的映射关系存入到set集合中,而这个关系类型就是:Map.Entry

代码测试:

@Test
	public void testMapEntrySet(){
		
		Map<String, String> map = new HashMap<String, String>();

		//添加元素
		map.put("01", "zhangsan1");
		map.put("02", "zhangsan2");
		map.put("03", "zhangsan3");
		map.put("04", "zhangsan4");
		
		//将集合中的映射关系取出,存入到Set集合中
		Set<Entry<String, String>> entrySet = map.entrySet();
		
		Iterator<Entry<String, String>> iterator = entrySet.iterator();
		
		while(iterator.hasNext()){
			
			Entry<String, String> entry = iterator.next();
			String key = entry.getKey();
			String value = entry.getValue();
			
			System.out.println("key:" + key + "=" + value );
			
		}
		
	}

Map.Entry 其实Entry也是一个接口,它是Map接口的一个内部接口。

--------------------------------------------------------------------------------------------------------------------

分别使用HashMap和TreeMap存储进行测试。

Studfent:

package cn.wangyu.map;

/**
 * @author JiangMinyan
 * 
 * @version 2016/02/17 14:34:34
 */
public class Student implements Comparable<Student>{

	private String name;

	private int 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;
	}

	public Student(String name, int age) {
		this.name = name;
		this.age = age;
	}

	@Override
	public int hashCode() {<span style="color:#ff0000;">//hash表用到</span>
		return this.name.hashCode() + this.age * 34;
	}

	@Override
	public boolean equals(Object obj) {<span style="color:#ff0000;">//hash表用到</span>

		if (!(obj instanceof Student))
			throw new ClassCastException("类型不匹配");
		Student student = (Student) obj;
		return this.name.equals(student.name) && (this.age == student.age);
	}

	@Override
	public int compareTo(Student o) {<span style="color:#ff0000;">//TreeMap用到</span>
		
		int sum = this.name.compareTo(o.name);
		if (sum == 0) {
			sum = new Integer(this.age).compareTo(new Integer(o.age));
		}
		return sum;
	}
	
//	@Override
//	public int compareTo(Student o) {
//		
//		int sum = new Integer(this.age).compareTo(new Integer(o.age));
//		if (sum == 0) {
//			sum = this.name.compareTo(o.name);
//		}
//		return sum;
//	}

}

HashMap:

@Test
	public void testStudentMap(){
		
		Map<Student, String> map = new HashMap<Student, String>();
		
		map.put(new Student("zhangsan1", 21), "shanghai");
		map.put(new Student("zhangsan1", 21), "dalian");
		map.put(new Student("zhangsan2", 22), "tianjin");
		map.put(new Student("zhangsan3", 23), "wuhan");
		map.put(new Student("zhangsan4", 24), "changchun");
		
		Iterator<Entry<Student, String>> iterator = map.entrySet().iterator();
		
		while(iterator.hasNext()){
			
			Entry<Student, String> entry = iterator.next();
			Student student = entry.getKey();
			String address = entry.getValue();
			
			System.out.println("name:" + student.getName() + "," + address);
		}
		
	}
TreeMap:

@Test
	public void testTreeMap(){
		
		Map<Student, String> map = new TreeMap<Student, String>(new StuAgeComparator());
		
		map.put(new Student("zhangsan20", 21), "shanghai");
		map.put(new Student("zhangsan8", 50), "wuhan");
		map.put(new Student("zhangsan5", 24), "changchun");
		map.put(new Student("zhangsan2", 22), "tianjin");
		
		Iterator<Entry<Student, String>> iterator = map.entrySet().iterator();
		
		while(iterator.hasNext()){
			
			Entry<Student, String> entry = iterator.next();
			Student student = entry.getKey();
			String address = entry.getValue();
			
			System.out.println("name:" + student.getName() + "," + address);
		}
		
	}

-----------------------------------------------------------------------------------------------------------------------------------------------------------

练习:统计“ab123;dcbdbdsbc”字母出现的次数。

@Test
	public void testCharCount(){
		
		System.out.println(charCount("ab123;dcbdbdsbc"));
	}
	
	public String charCount(String str){
		
		char[] charArray = str.toCharArray();
		TreeMap<Character, Integer> treeMap = new TreeMap<Character, Integer>();
		for (int i = 0; i < charArray.length; i++) {
			
			char ch = charArray[i];
			if (!((ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z')))
				continue;
			
			Integer value = treeMap.get(ch);
			if (value != null) {
				value = value + 1;
			}else{
				value = 1;
			}
			
			treeMap.put(ch, value);
			
		}
		
		System.out.println(treeMap);
		
		StringBuilder sb = new StringBuilder();
		Iterator<Entry<Character, Integer>> iterator = treeMap.entrySet().iterator();
		while (iterator.hasNext()) {
			
			Entry<Character, Integer> next = iterator.next();
			Character ch = next.getKey();
			Integer count = next.getValue();
			
			sb.append(ch + "(" + count + ")");
		}
		
		return sb.toString();
	}





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值