zoukankan      html  css  js  c++  java
  • 黑马程序员系列第五篇 集合(2)

    ASP.Net+Android+IOS开发  、Net培训、期待与您交流!

    (前言:本篇文章主要依据毕向东老师的课程视频整理而成,如要详细学习,请观看毕老师视频  百度网盘链接地址: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+"
    "+sb);
    38     }
    39 }

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

    ASP.Net+Android+IOS开发  、Net培训、期待与您交流!

  • 相关阅读:
    【Java8】 @FunctionalInterface 函数式接口
    集合使用copy与mutableCopy的区别
    GCD中的dispatch_sync、dispatch_sync 分别与串行、并行队列组合执行小实验
    podspec文件介绍
    iOS系统app崩溃日志手动符号化
    webView文本长按显示英文
    深拷贝
    view向全屏延伸时的属性设置
    iOS 模拟器截屏快捷键
    mysql 优化常用语句
  • 原文地址:https://www.cnblogs.com/blueFlowers/p/4969969.html
Copyright © 2011-2022 走看看