黑马程序员-Java API-day16
2013-08-24 18:34
316 查看
----------------------
ASP.Net+Android+IOS开发、.Net培训、期待与您交流! ----------------------
1、Map集合概述
接口Map<K,V>
类型参数:
K:此映射所维护的键的类型
V:映射值的类型
将键映射到值的对象。一个映射不能包含重复的键;每个键最多只能映射到一个值。
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()
value()
2、Map子类对象特点
Map
|--Hashtable:底层是哈希表数据结构,不可以存入null键null值。该集合是线程同步的,jdk1.0效率低
|--HashMap:底层是哈希表数据结构,允许存入null键null值。该集合线程不同步的,jdk1.2效率高。
|--TreeMap:底层是二叉树数据结构,线程不同步,可以用于各map集合中的键进行排序。
map和Set很像,其实Set底层就是使用了Map集合。
Hashtable用作键的对象必须实现hashCode方法和equals方法。
3、Map-keySet
map集合的两种取出方式:
Set<k> keySet:将map中所有的键存入到Set集合,因为set具备迭代器,所以可以用迭代的方式取出所有的键,再根据get方法,获取每一个键所对应的值。
Map集合的取出原理:将map集合转成set集合,再通过迭代器取出。
4、Map-Entry
Set<Map.Entry<k,v>> entrySet:将map集合中的映射关系存入到set集合中,而这个关系的数据类型就是:Map.Entry
5、Map练习
每一个学生都有对应的归属地,学生Student,地址String,
学生属性:姓名,年龄注意:姓名和年龄相同的视为同一个学生。保证学生的唯一性。
1.描述学生;
2.定义map容器,将学生作为键,地址作为值,存入。
3.获取map集合中的元素。
实现(implements)覆盖(hashcode,equals)两方法
需求:对学生对象的年龄进行升序排序
因为数据是以键值对形式存在的,所以要使用可以排序的Map集合:TreeMap。
练习:
"sdfgzxcvasdfxcvdf"获取该字符串中的字母出现的次数。
希望打印结果:a(1)b(2)...
通过结果发现,么一个字母都有对应的次数,说明字母和次数之间都有映射关系。
注意了,当发现有映射关系时,可以选择map集合,因为map集合中存放的就是映射关系。
什么时候时候map集合呢?
当数据之间存在着映射关系时,就要想到map集合。
思路:
1.将字符串转换成字符数组,因为要对每一个字母进行操作。
2.定义一个map集合,因为打印结果的字母有顺序,所以使用TreeMap集合。
3.遍历字符数组
将么一个字母作为键去查map集合。
如果返回null,将该字母和1存入到map集合中。
如果返回不是null,说明该字母在map集合中已经存在并有对应次数,
那么就获取该次数并进行自增,然后将该字母和自增后的次数存入到map集合中,覆盖调用原来键所对应的值。
4.将map集合中的数据变成制定的字符串形式返回。
小结:通过查阅API发现,Character自身就实现了Comparable接口,因此输出的语句就是按自然顺序排序的。
6、Map扩展
map扩展知识,map集合被使用是因为具备映射关系
一个学校有多个教室,每个教室都有名称
----------------------
ASP.Net+Android+IOS开发、.Net培训、期待与您交流! ----------------------
详细请查看:http://edu.csdn.net
ASP.Net+Android+IOS开发、.Net培训、期待与您交流! ----------------------
1、Map集合概述
接口Map<K,V>
类型参数:
K:此映射所维护的键的类型
V:映射值的类型
将键映射到值的对象。一个映射不能包含重复的键;每个键最多只能映射到一个值。
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()
value()
2、Map子类对象特点
Map
|--Hashtable:底层是哈希表数据结构,不可以存入null键null值。该集合是线程同步的,jdk1.0效率低
|--HashMap:底层是哈希表数据结构,允许存入null键null值。该集合线程不同步的,jdk1.2效率高。
|--TreeMap:底层是二叉树数据结构,线程不同步,可以用于各map集合中的键进行排序。
map和Set很像,其实Set底层就是使用了Map集合。
Hashtable用作键的对象必须实现hashCode方法和equals方法。
import java.util.*; class MapDemo { public static void main(String[] args) { Map<String,String> map = new HashMap<String,String>(); //添加元素,如果出现相同的键,那么后添加的值会覆盖原有键对应值,并put方法会返回被覆盖的值。 System.out.println("put:"+map.put("01","zhangsan01")); System.out.println("put:"+map.put("01","wangwu")); map.put("02","zhangsan02"); map.put("03","zhangsan03"); System.out.println("containsKey:"+map.containsKey("02")); //System.out.println("remove:"+map.remove("02")); map.put("04",null); System.out.println("get:"+map.get("04")); //可以通过get方法的返回值来判断一个键是否存在,通过返回null来判断。 //获取Map集合中所有的值 Collection<String> coll =map.values(); System.out.println(coll); System.out.println(map); } }
3、Map-keySet
map集合的两种取出方式:
Set<k> keySet:将map中所有的键存入到Set集合,因为set具备迭代器,所以可以用迭代的方式取出所有的键,再根据get方法,获取每一个键所对应的值。
Map集合的取出原理:将map集合转成set集合,再通过迭代器取出。
4、Map-Entry
Set<Map.Entry<k,v>> entrySet:将map集合中的映射关系存入到set集合中,而这个关系的数据类型就是:Map.Entry
import java.util.*; class MapDemo2 { public static void main(String[] args) { Map<String,String> map = new HashMap<String,String>(); map.put("01","zhangsan01"); map.put("02","zhangsan02"); map.put("03","zhangsan03"); map.put("04","zhangsan04"); //将Map集合中的映射关系取出,存入到Set集合中。 Set<Map.Entry<String,String>>entrySet = map.entrySet(); Iterator<Map.Entry<String,String>>it = entrySet.iterator(); while(it.hasNext()) { Map.Entry<String,String>me = it.next(); Stringkey = me.getKey(); Stringvalue = me.getValue(); System.out.println(key+":"+value); } /* //先获取map集合的所有键的Set集合,keySet() Set<String> keySet = map.keySet(); //有了Set集合,就可以获取其迭代器 Iterator<String> it =keySet.iterator(); while(it.hasNext()) { Stringkey = it.next(); //有了键就可以通过map集合的get方法获取其对应的值。 Stringvalue = map.get(key); System.out.println("key:"+key+",value:"+value); } */ } }
5、Map练习
每一个学生都有对应的归属地,学生Student,地址String,
学生属性:姓名,年龄注意:姓名和年龄相同的视为同一个学生。保证学生的唯一性。
1.描述学生;
2.定义map容器,将学生作为键,地址作为值,存入。
3.获取map集合中的元素。
实现(implements)覆盖(hashcode,equals)两方法
import java.util.*; class Student implementsComparable<Student> { private String name; private int age; Student(String name,int age) { this.name = name; this.age = age; } public int compareTo(Student s) { int num = new Integer(this.age).compareTo(new Integer(s.age)); if(num==0) { return this.name.compareTo(s.name); } return num; } public int hashCode() { return name.hashCode()+age*23; } public boolean equals(Object obj) { if(!(obj instanceof Student)) throw new ClassCastException("类型不匹配"); Student s = (Student)obj; return this.name.equals(s.name)&& this.age==s.age; } public String getName() { return name; } public int getAge() { return age; } public String toString() { return name+":"+age; } } class MapTest { public static void main(String[] args) { HashMap<Student,String> hm = new HashMap<Student,String>(); hm.put(new Student("lisi1",21),"beijing"); hm.put(new Student("lisi2",22),"shanghai"); hm.put(new Student("lisi3",23),"nanjing"); hm.put(new Student("lisi4",24),"wuhan"); hm.put(new Student("lisi5",25),"xizang"); //第一种取出方式keySet Set<Student> keySet = hm.keySet(); Iterator<Student> it = keySet.iterator(); while(it.hasNext()) { Student stu = it.next(); String addr = hm.get(stu); System.out.println(stu+"..."+addr); } //第二种取出方式entrySet Set<Map.Entry<Student,String>>entrySet = hm.entrySet(); Iterator<Map.Entry<Student,String>>iter = entrySet.iterator(); while(iter.hasNext()) { Map.Entry<Student,String>me = iter.next(); Student stu = me.getKey(); String addr = me.getValue(); System.out.println(stu+"------"+addr); } } }
需求:对学生对象的年龄进行升序排序
因为数据是以键值对形式存在的,所以要使用可以排序的Map集合:TreeMap。
import java.util.*; class StuNameComparator implementsComparator<Student> { public int compare(Student s1,Student s2) { int num =s1.getName().compareTo(s2.getName()); if(num==0) { return new Integer(s1.getAge()).compareTo(new Integer(s2.getAge())); } return num; } } class MapTest2 { public static void main(String[] args) { TreeMap<Student,String> tm = newTreeMap<Student,String>(new StuNameComparator()); tm.put(new Student("alisi3",23),"nanjing"); tm.put(new Student("lisi1",21),"beijing"); tm.put(new Student("lisi1",21),"tianjing"); tm.put(new Student("clisi4",24),"wuhan"); tm.put(new Student("lisi2",22),"shanghai"); Set<Map.Entry<Student,String>>entrySet = tm.entrySet(); Iterator<Map.Entry<Student,String>>it = entrySet.iterator(); while(it.hasNext()) { Map.Entry<Student,String>me = it.next(); Student stu = me.getKey(); String addr = me.getValue(); System.out.println(stu+"....."+addr); } } }
练习:
"sdfgzxcvasdfxcvdf"获取该字符串中的字母出现的次数。
希望打印结果:a(1)b(2)...
通过结果发现,么一个字母都有对应的次数,说明字母和次数之间都有映射关系。
注意了,当发现有映射关系时,可以选择map集合,因为map集合中存放的就是映射关系。
什么时候时候map集合呢?
当数据之间存在着映射关系时,就要想到map集合。
思路:
1.将字符串转换成字符数组,因为要对每一个字母进行操作。
2.定义一个map集合,因为打印结果的字母有顺序,所以使用TreeMap集合。
3.遍历字符数组
将么一个字母作为键去查map集合。
如果返回null,将该字母和1存入到map集合中。
如果返回不是null,说明该字母在map集合中已经存在并有对应次数,
那么就获取该次数并进行自增,然后将该字母和自增后的次数存入到map集合中,覆盖调用原来键所对应的值。
4.将map集合中的数据变成制定的字符串形式返回。
import java.util.*; class MapTest3 { public static void main(String[] args) { String s = charArray("aabcdddefg"); System.out.println(s); } public static String charArray(String str) { char[] chs = str.toCharArray(); TreeMap<Character,Integer> tm = new TreeMap<Character,Integer>();//由于泛型里接收的都是引用数据类型,因此这里面接收的只能是Character和Integer int count = 0; for(int x=0; x<chs.length; x++) { if(!(chs[x]>='a'&& chs[x]<='z' || chs[x]>='A' && chs[x]<='Z')) continue; Integer value = tm.get(chs[x]); if(value!=null) count = value; count++; tm.put(chs[x],count); count=0; /* if(value==null) { tm.put(chs[x],1); } else { value = value+1; tm.put(chs[x],value); } */ } //System.out.println(tm); StringBuilder sb = new StringBuilder(); Set<Map.Entry<Character,Integer>>entrySet = tm.entrySet(); Iterator<Map.Entry<Character,Integer>>it = entrySet.iterator(); while(it.hasNext()) { Map.Entry<Character,Integer>me = it.next(); Character ch = me.getKey(); Integer value = me.getValue(); sb.append(ch+"("+value+")"); } return sb.toString();//由于sb是StringBuilder类型,因此就要转换成String类型 } }
小结:通过查阅API发现,Character自身就实现了Comparable接口,因此输出的语句就是按自然顺序排序的。
6、Map扩展
map扩展知识,map集合被使用是因为具备映射关系
一个学校有多个教室,每个教室都有名称
import java.util.*; class Student { private String id; private String name; Student(String id,String name) { this.id = id; this.name = name; } public String toString() { return id+"::"+name; } } class MapDemo3 { //通过List集合封装Student对象进行遍历 public static void demo() { HashMap<String,List<Student>>czbk = new HashMap<String,List<Student>>(); List<Student> yure = new ArrayList<Student>(); List<Student> jiuye = new ArrayList<Student>(); czbk.put("yureban",yure); czbk.put("jiuyeban",jiuye); yure.add(new Student("01","zhangsan")); yure.add(new Student("02","lisi")); jiuye.add(new Student("03","wangwu")); jiuye.add(new Student("04","zhaoliu")); Iterator<String> it =czbk.keySet().iterator(); while(it.hasNext()) { String roomName = it.next(); List<Student> room = czbk.get(roomName); System.out.println(roomName); getInfos(room); } } public static void getInfos(List<Student> list) { Iterator<Student> it =list.iterator(); while(it.hasNext()) { Students = it.next(); System.out.println(s); } } public static void main(String[] args) { demo(); /* HashMap<String,HashMap<String,String>>czbk = new HashMap<String,HashMap<String,String>>(); HashMap<String,String> yure = newHashMap<String,String>(); HashMap<String,String> jiuye = newHashMap<String,String>(); czbk.put("yureban",yure); czbk.put("jiuyeban",jiuye); yure.put("01","zhangsan"); yure.put("02","lisi"); jiuye.put("03","wangwu"); jiuye.put("04","zhaoliu"); //遍历czbk集合,获取所有的教室 Iterator<String> it =czbk.keySet().iterator(); while(it.hasNext()) { StringroomName = it.next(); HashMap<String,String> room = czbk.get(roomName); System.out.println(roomName); getStudentInfo(room); } */ } public static void getStudentInfo(HashMap<String,String> roomMap) { Iterator<String> it =roomMap.keySet().iterator(); while(it.hasNext()) { String id = it.next(); String name = roomMap.get(id); System.out.println(id+":"+name); } } }
----------------------
ASP.Net+Android+IOS开发、.Net培训、期待与您交流! ----------------------
详细请查看:http://edu.csdn.net
相关文章推荐
- 黑马程序员-Java API-day13
- 黑马程序员_Java基础_API文档之String类
- 黑马程序员-6-java-IO流开篇基础API
- 黑马程序员-----java基础十四(java之API)
- 黑马程序员--------JAVA基础---集合和API
- 黑马程序员—java基础—常用API
- 黑马程序员Java培训、Android培训-Java 学习过程记录_JavaAPI
- 【黑马程序员】第六章:Java API
- 黑马程序员_javaAPI
- 黑马程序员-JavaAPI-17天-3(Collections-reverseOrder)
- 黑马程序员_JavaAPI——集合框架笔记总结
- 黑马程序员_JavaAPI
- 黑马程序员Java之常用API
- 黑马程序员-学习日记-JAVA中API中的Object类和包的含义及内部类
- 黑马程序员_Java学习日记_JAVA中API中对象String和StringBuffer/StringBuilder
- 黑马程序员_JAVA学习日记_JAVA中API中数据类型包装类(Integer),System,Runtime,Date
- 黑马程序员---Java API
- 黑马程序员-Java API-day14
- 黑马程序员_JAVA学习日记_JAVA中API:集合框架1(Collection,List,Set及其子类和迭代器的应用)
- 黑马程序员_java基础——如何查阅API