Java学习札记——集合框架二 Map
2013-04-27 22:07
447 查看
众所周知,Collection是单列集合,即一个元素中只能有一个值,所以,有时候在使用起来就有一点局限了,无法表示一种对应的关系。而Map就恰恰弥补了这个不足,在存储数据时,是以键值对,即一个键对应一个值,一堆一堆往里存,同时还要保证了键的唯一性,就说,一个键只能对应一个值,但是值可就不一定唯一了,这世界上相同的事多了去了。
常用的实现了Map接口的对象有三个,如下:
|--Hashtable 底层是哈希表数据结构,不可以存入null键null值,该集合是线程同步的。jdk1.0效率低
|--HashMap 底层是哈希表数据结构,允许使用null值和null键,该集合是不同步的。jdk1.2效率高
|--TreeMap 底层是二叉树数据结构,线程不同步,可以用于给map集合中的键进行排序。
Map中一些常用的方法:
1、添加。
V put(K key, V value)
void putAll(Map<? extends K,? extends V> m)
2、删除。
clear().
V remove(Object key)
3、判断。
boolean containsKey(Object key)
boolean containsValue(Object value)
boolean isEmpty()
4、获取。
get(Object key)
int size()
values()
entrySet()
keySet()
使用起来和List、Set方法类似,简单举一例说明:
Map功能非常强大,是一个使用非常频繁的集合,主要就像前面描述的,因为Map具备了元素与元素之间的映射关系!可以很好地解决元素对应的问题,这也是我们实际生活中很常见的,每个人都只有一个身份证号,每个老公都只有一个老婆(法律的范围内)等等。。。。
有这样一个例子:
一个学校有多个班级,每个班级都有一个名称,每个班级又有很多学生,学生又有学号。。。
可以这么理解
School ——> | 高三三班
| 01好学生 张三
| 10号学生 李四
| 高二一班这体现了数学里的映射的关系,又不完全是,有点类似的感觉
| 02好学生 王五
| 08号学生 赵六
... ...
这个该怎么用Map表示、操作呢?
请看下例
集合补充:
java.util包中有个和Collection名字很像的东东 Collections ,jdk的解释 在 collection 上进行此类完全由操作或返回 collection
的静态方法组成。它包含在 collection 上操作的多态算法,即“包装器”,包装器返回由指定 collection 支持的新 collection,以及少数其他内容。
查看API可以知道,里面全是static方法,为我们操作集合带来了很大的便利,举个例子说明:
常用的实现了Map接口的对象有三个,如下:
|--Hashtable 底层是哈希表数据结构,不可以存入null键null值,该集合是线程同步的。jdk1.0效率低
|--HashMap 底层是哈希表数据结构,允许使用null值和null键,该集合是不同步的。jdk1.2效率高
|--TreeMap 底层是二叉树数据结构,线程不同步,可以用于给map集合中的键进行排序。
Map中一些常用的方法:
1、添加。
V put(K key, V value)
void putAll(Map<? extends K,? extends V> m)
2、删除。
clear().
V remove(Object key)
3、判断。
boolean containsKey(Object key)
boolean containsValue(Object value)
boolean isEmpty()
4、获取。
get(Object key)
int size()
values()
entrySet()
keySet()
使用起来和List、Set方法类似,简单举一例说明:
public class MapDemo { public static void main(String[] args) { //put方法会返回原来对应的键值 Map<String,String> map = new HashMap<String,String>(); //添加元素 ,如果出现添加时,相同的值,那么后天加的值会覆盖原有键对应的值 //put方法会返回被覆盖的值 System.out.println("put:" + map.put("01","zhangsan1")); System.out.println("put:" + map.put("01","wangwu")); 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("02")); map.put("04", null); System.out.println("get():" + map.get(null)); //可以通过get方法的返回值来判断一个键是否存在,通过返回空来判断 //获取map集合中所有的值。 Collection<String> coll = map.values(); System.out.println(coll); System.out.println(map); } }
Map功能非常强大,是一个使用非常频繁的集合,主要就像前面描述的,因为Map具备了元素与元素之间的映射关系!可以很好地解决元素对应的问题,这也是我们实际生活中很常见的,每个人都只有一个身份证号,每个老公都只有一个老婆(法律的范围内)等等。。。。
有这样一个例子:
一个学校有多个班级,每个班级都有一个名称,每个班级又有很多学生,学生又有学号。。。
可以这么理解
School ——> | 高三三班
| 01好学生 张三
| 10号学生 李四
| 高二一班这体现了数学里的映射的关系,又不完全是,有点类似的感觉
| 02好学生 王五
| 08号学生 赵六
... ...
这个该怎么用Map表示、操作呢?
请看下例
class Student { private String id; private String name; Student(String id,String name) { this.id = id; this.name = name; } public String toString() { return this.id + "..." + this.name; } } class MapTest { public static void demo() { HashMap<String,List<Student>> gaozhong = new HashMap<String,List<Student>>(); List<Student> gaosan = new ArrayList<Student>(); List<Student> gaoer = new ArrayList<Student>(); <span style="font-family: Arial, Helvetica, sans-serif;">gaozhong</span>.put("高三三班",<span style="font-family: Arial, Helvetica, sans-serif;">gaosan</span>); <span style="font-family: Arial, Helvetica, sans-serif;">gaozhong</span>.put("高二一班",gaoer); gaosan.add(new Student("01","zhangsan")); gaosan.add(new Student("10","lisi")); gaoer.add(new Student("02","wangwu")); gaoer.add(new Student("08","zhaoliu")); for(Iterator<String> it = gaozhong.keySet().iterator();it.hasNext();) { String roomName = it.next(); List<Student> room = gaozhong.get(roomName); System.out.println(roomName); getInfos(room); } } public static void getInfos(List<Student> list) { for(Iterator<Student> it = list.iterator();it.hasNext();) { Student s = it.next(); System.out.println(s); } } public static void main(String[] args) { demo(); } public static void getStudentInfo(HashMap<String , String> roomMap) { for(Iterator<String> it = roomMap.keySet().iterator(); it.hasNext();) { String id = it.next(); String name = roomMap.get(id); System.out.println("id :" + id + "...name :" + name); } } }
集合补充:
java.util包中有个和Collection名字很像的东东 Collections ,jdk的解释 在 collection 上进行此类完全由操作或返回 collection
的静态方法组成。它包含在 collection 上操作的多态算法,即“包装器”,包装器返回由指定 collection 支持的新 collection,以及少数其他内容。
查看API可以知道,里面全是static方法,为我们操作集合带来了很大的便利,举个例子说明:
/* 集合框架的工具类演示 Collections:不能个Set排序
实现了一下API其中的几个简单的方法排序,按照某种规则排序 二分查找 按照某种排序后查找
达到和api同样的效果 */ import java.util.*; public class CollectionsDemo { public static void main(String[] args) { sortDemo(); //maxDemo(); //binarySearchDemo(); } public static void binarySearchDemo() { List<String> list = new ArrayList<String>(); list.add("abcd"); list.add("aaa"); list.add("zz"); list.add("kkkk"); list.add("qq"); list.add("z"); <span style="white-space:pre"> </span>//排序 按照指定的字符串长度 Collections.sort(list,new StrLenComparator()); sop(list); //在list中查找 aaaa // int index = Collections.binarySearch(list,"aaaa"); int index = halfSearch2(list,"aaaa",new StrLenComparator()); sop("index=" + index); } //二分查找 public static int halfSearch(List<String> list,String key) { int max,min,mid; max = list.size() -1; min = 0; while(min <= max) { mid = (max+min)>>1; // /2 String str = list.get(mid); int num = str.compareTo(key); if(num > 0) max = mid -1; else if(num < 0) min = mid + 1; else return mid; } return -min-1; } public static int halfSearch2(List<String> list,String key,Comparator<String> cmp) { int max,min,mid; max = list.size() -1; min = 0; while(min <= max) { mid = (max+min)>>1; // /2 String str = list.get(mid); int num = cmp.compare(str,key); if(num > 0) max = mid -1; else if(num < 0) min = mid + 1; else return mid; } return -min-1; } public static void maxDemo() { List<String> list = new ArrayList<String>(); list.add("abcd"); list.add("aaa"); list.add("zz"); list.add("kkkk"); list.add("qq"); list.add("z"); sop(list); Collections.sort(list); sop(list); String max = Collections.max(list,new StrLenComparator()); sop("max = " + max); } public static void sortDemo() { List<String> list = new ArrayList<String>(); list.add("abcd"); list.add("aaa"); list.add("z"); list.add("kkkk"); list.add("qq"); list.add("z"); sop(list); //Collections.sort(list ,new StrLenComparator()); Collections.swap(list,1,2); sop(list); } public static void sop(Object obj) { System.out.println(obj); } } class StrLenComparator implements Comparator<String> { public int compare(String s1 ,String s2) { if(s1.length() > s2.length()) return 1; else if(s1.length() < s2.length()) return -1; else return s1.compareTo(s2); } }
相关文章推荐
- 黑马程序员----Java集合框架学习笔记2 Map-工具类-泛型
- Java学习第15-16天:集合框架之Map和泛型(半壁江山了)
- java学习日记_86:集合框架之Map
- JAVA基础学习之 Map集合、集合框架工具类Collections,Arrays、可变参数、List和Set集合框架什么时候使用等(4)
- Java基础学习笔记十七 集合框架(三)之Map
- (37)Java学习笔记——集合框架 / Map集合
- Java学习札记20:Java程序员集合框架面试题
- Java学习札记——集合框架一
- 黑马程序员_JAVA学习日记_JAVA中API:集合框架2(Map集合及其子集合)
- Java基础6:集合框架学习总结
- Android(java)学习笔记104:Map集合的遍历之键找值
- JAVA基础学习(十六)--集合三-Map、HashMap,TreeMap与常用API
- Java集合源码学习(23)_Map的子接口ConcurrentMap
- java_集合体系之Map框架相关抽象类接口详解、源码——08
- java.util包的集合框架学习
- Java学习之集合框架(中)
- 黑马程序员java学习—Map集合
- java学习之集合框架
- Java基础知识强化之集合框架笔记52:Map集合之Map集合的遍历 键找值
- Java面向对象——集合框架(Map)