黑马程序员系列第五篇 集合(2)

 

(前言:本篇文章主要依据毕向东老师的课程视频整理而成,如要详细学习,请观看毕老师视频  百度网盘链接地址:http://pan.baidu.com/s/1o6mwDzO)

 

目录:  1、泛型      2、Map(HashMap、TreeMap)

 

1、泛型

  JDK1.5以后出现的新特性,用于解决安全问题,是一个安全机制;集合类中都有用到泛型。

  好处:将运行时期出现的问题转移到了编译时期,便于程序安全;避免了强制转换的麻烦。

  什么时候定义泛型类:当类中要操作的引用数据类型不确定时。早期用Object完成扩展,现在用泛型。

  局限性:定义的泛型在整个类中有效,如果泛型类中泛型类型确定,则这个对象的所有用到泛型的方法只能使用这个具体类型。

  解决局限性的办法:在某些方法中定义方法泛型

  注意:静态方法可以定义泛型,但不可以引用泛型类定义的泛型。

  泛型限定的书写格式 :上限-<? Extends 类名>    下限-<? Super 类名>(?为通配符,也可理解为占位符)

 

一个例子简单演示  泛型接口、泛型类、普通泛型方法、静态泛型方法

 1 public class GenericClass {
 2 
 3     public static void main(String[] args) throws ClassNotFoundException {
 4         
 5       Utils<String> util=new Utils<String>();
 6       GenericClass obj=new GenericClass();
 7 
 8       util.getClassName("abc");
 9       util.getClassLoader(obj);
10       Utils.getClassPack(obj);
11     }
12 }
13 //泛型接口
14 interface Util<T>{
15     public void getClassName(T a);
16 }
17 //泛型类
18 class Utils<T> implements Util<T>{
19     //泛型类中使用普通方法
20     public void getClassName(T cla){
21         System.out.println(cla+"的类名为"+cla.getClass().getName());
22     }        
23     //普通泛型方法
24     public <G> void getClassLoader(G cla){
25         System.out.println(cla.getClass().getName()+"的加载器:"+
26                            cla.getClass().getClassLoader().getClass().getName());
27     }
28     //静态泛型方法
29     public static <T> void getClassPack(T cla){
30         System.out.println(cla.getClass().getName()+"所在的包:"+
31                            cla.getClass().getPackage().getClass().getName());
32     }
33 }

 

2、Map(HashMap、TreeMap)

是一种双列集合

 

什么时候使用map集合:当数据间存在映射关系时

 

HashTable  底层是hash表数据结构,不可存入null键null值,线程同步,jdk1.0(少用,可被HashMap替代,仅了解)

 

HashMap    底层是哈希表数据结构,可存入null键null值,线程不同步 效率高,jdk1.2

 

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

 

和Set的关系   Set集合底层使用的就是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集合中的对象的代码示例:
 1 public class MapDemo {
 2     /**
 3      * 目的:用两种方式取出Map集合中的对象,并打印。这两种方式方别封装到了两个函数中
 4      */
 5     public static void main(String[] args) {
 6         //创建集合,存入对象
 7         //Map<Employee,Integer> map=new HashMap<Employee,Integer>();
 8         Map<Employee,Integer> map=new TreeMap<Employee,Integer>(new nameComp());
 9           map.put(new Employee("00123","linda"),10000 );
10           map.put(new Employee("00124","jack"),8000 );
11           map.put(new Employee("00153","tom"),12000 );
12           map.put(new Employee("00153","tom"),15000 );
13           map.put(new Employee("00127","hary"),8000 );
14           
15         //调用函数       
16         //getKeySet(map);
17         getEntrySet(map);
18     }
19     //通过keySet方法获取hashMap中所有值的方法。取出Map集合元素方法,转换成Set集合,再用迭代器取出
20     public static <K,V> void getKeySet(Map<K,V> map){
21         
22         Set<K> keySet = map.keySet();
23         Iterator<K> it = keySet.iterator();
24         while (it.hasNext()) {
25             K key = it.next();
26             V value = map.get(key);
27             System.out.println("key:" + key + ";value:" + value);
28         }
29     }
30     //通过entrySet方法获取hashMap中所有值的方法。取出Map集合元素方法,转换成Set集合,再用迭代器取出
31     public static <K,V> void getEntrySet(Map<K,V> map){
32         
33         Set<Map.Entry<K, V>> entrySet=map.entrySet();
34         Iterator<Map.Entry<K, V>> it = entrySet.iterator();
35         while (it.hasNext()) {
36             Map.Entry<K, V> keyValue =  it.next();
37             System.out.println("key:" +keyValue.getKey() + ";value:" +keyValue.getValue());
38         }
39     }
40 }
41 class Employee implements Comparable<Employee>{
42     private String no;
43     private String name;
44     
45     public Employee(String no,String name){
46         this.name=name;
47         this.no=no;
48     }
49 
50     public String getNo() {
51         return no;
52     }
53 
54     public void setNo(String no) {
55         this.no = no;
56     }
57 
58     public String getName() {
59         return name;
60     }
61 
62     public void setName(String name) {
63         this.name = name;
64     }
65     //重写toString方法,方便打印结果
66     public String toString(){
67         return no+"-"+name;
68     }
69     @Override
70     public int compareTo(Employee emp) {
71         return this.no.compareTo(emp.no);
72     }
73 //重写hashCode和equals方法,判断存入对象是否有重复
74     @Override
75     public int hashCode() {
76         return this.no.hashCode()+this.name.hashCode()*39;
77     }
78     @Override
79     public boolean equals(Object obj) {
80         Employee emp=(Employee)obj;
81         if(!(obj instanceof Employee)){
82             throw new ClassCastException("错误对象!!!");
83         }
84         return this.name.equals(emp.name)&&this.no.equals(emp.no);
85     }    
86 }
87 //自定义比较器
88 class nameComp implements Comparator<Employee>{
89     @Override
90     public int compare(Employee o1, Employee o2) {
91         int num=o1.compareTo(o2);
92         if(num==0)
93             num=o1.getName().compareTo(o2.getName());
94         return num;
95     }
96     
97 }



统计给定字符串的各个字母个数代码示例
 1 //统计给定字符串的各个字母个数,将统计方法封装在findLetter函数中
 2 public class TreeMapDemo {
 3 
 4     public static void main(String[] args) {
 5         
 6          findLetter("aabbcvddewgf44###ds");
 7     }
 8     //统计字母的函数,并打印统计结果
 9     public static void findLetter(String str){
10     //新建TreeMap集合
11       Map<Character,Integer> letters=new TreeMap<Character,Integer>();
12         
13         char[] chars=str.toCharArray(); 
14         int len=chars.length;
15         for(int i=0;i<len;i++){
16             if(!(chars[i]>='a'&&chars[i]<='z'||chars[i]>='A'&&chars[i]<='Z'))
17                  continue;
18             
19             int count=1;          
20             if(letters.containsKey(chars[i]))               
21              count=letters.get(chars[i])+1;
22             
23              letters.put(chars[i], count);
24  
25         }
26        //输出格式
27         StringBuffer sb=new StringBuffer();
28         Set<Map.Entry<Character, Integer>> set=letters.entrySet();
29         Iterator<Entry<Character, Integer>> ite=set.iterator();
30         
31         while(ite.hasNext()){
32             Map.Entry<Character, Integer> entry=ite.next();
33             char key=entry.getKey();
34             int value=entry.getValue();
35             sb.append(key+"("+value+") ");
36         }
37         System.out.println(str+"\n"+sb);
38     }
39 }

 

 

 

 

       初学者难免错误,欢迎评判指教,持续更正ing...........

 

posted @ 2015-11-16 20:32  YerJustDoIt  阅读(246)  评论(0编辑  收藏  举报