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+"\n"+sb); 38 } 39 }
初学者难免错误,欢迎评判指教,持续更正ing...........
ASP.Net+Android+IOS开发 、Net培训、期待与您交流!
原文:http://www.cnblogs.com/blueFlowers/p/4969969.html