黑马程序员之泛型和Map集合学习

------- android培训java培训、期待与您交流! ----------

泛型:jdk1.5版本以后出现的一个安全机制。表现格式:< >
好处:
1:将运行时期的问题ClassCastException问题转换成了编译失败,体现在编译时期,程序员就可以解决问题。
2:避免了强制转换的麻烦。
只要带有<>的类或者接口,都属于带有类型参数的类或者接口,在使用这些类或者接口时,必须给<>中传递一个具体的引用数据类型。

泛型技术:

其实应用在编译时期,是给编译器使用的技术,到了运行时期,泛型就不存在了。

在运行时,如何知道获取的元素类型而不用强转呢?
泛型的补偿:因为存储的时候,类型已经确定了是同一个类型的元素,所以在运行时,只要获取到该元素的类型,在内部进行一次转换即可,所以使用者不用再做转换动作了。
什么时候用泛型类呢?
当类中的操作的引用数据类型不确定的时候,以前用的Object来进行扩展的,现在可以用泛型来表示。这样可以避免强转的麻烦,而且将运行问题转移到的编译时期。
泛型类:
class GenericDemo<T>{}
泛型方法:
public <T> void method(){}
泛型接口:
interface Inter<T>{}
class InterImpl implements Inter<String>{}
class InterImpl implements Inter<T>{}
泛型限定:用于泛型扩展
? extends E: 可以接受E类型或E类型的子类,上限定;
? super E:可以接受E类型或E类型的父类,下限定;
泛型特殊之处:
静态方法不可以访问类上定义的泛型;

如果静态方法操作的应用数据类型不确定,可以将泛型定义在方法上。

Map集合:
特点:1,该集合存储键值对,一对一对往里存,而且要保证键唯一性;
添加:put(key,value);添加元素,如果添加时键已存在,那么后添加的值会覆盖键对应的原来的值,并且put方法会返回被覆盖的值。
putAll(Map<? extends k,? extends V> m)
删除:clear();删除所有元素 remove(key);返回被删键对应的值
判断:containsValue(value);containsKey(key);isEmpty()
获取:get(key);size();values();返回值对象的集合Collection<V>
Set<Map.Entry<K,V>> entrySet();将Map集合中映射关系存入到Set, 这个关系就是Map.Entry,通过getKey和getValue分别获取键和值

Map.Entry其实Entry也是一个接口,它是Map接口中的内部接口

Set<E> keySet():将Map中所有的键存入到Set集合,因为Set具备迭代器,所以可以迭代获取所有的键,再根据get方法获取每一个键对应的值;

Hashtable:底层是哈希表数据结构,不可以存入null键null值,该集合线程同步;
HashMap:底层是哈希表数据结构,允许使用null值和null键,该集合不同步;无序
TreeMap:底层是二叉树数据结构,线程不同步,可以用于给Map集合中键进行排序;
Map扩展知识:
Map集合被使用是因为具备映射关系。
imp ort java.util.*;
class MapDemo{
public static void main(String[] args){
Map<String,String> map = new HashMap<String,String>();
map.put("01","zhangsan1");
map.put("02","zhangsan2");
map.put("03","zhangsan3");
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();
String key = me.getKey();
String value = me.getValue();
System.out.println("key:"+key+"=value:"+value);
}
}
public static void mehtod_2(){
Map<String,String> map = new HashMap<String,String>();
map.put("01","zhangsan1");
map.put("02","zhangsan2");
map.put("03","zhangsan3");
Set<String> keySet = map.keySet();
Iterator<String> it = keySet.iterator();
while(it.hasNext()){
String key = it.next();
System.out.println(map.get(key));
}
}
public static void method_1(){
Map<String,String> map = new HashMap<String,String>();
map.put("01","zhangsan1");
map.put("02","zhangsan2");
map.put("03","zhangsan3");
System.out.println("containKey:"+map.containsKey("02"));
System.out.println("remove:"+map.remove("02"));
System.out.println("get:"+map.get("02"));
}
}
/*
每一个学生都有对应的归属地,学生Student,地址String;
学生属性:姓名,年龄;
注:姓名和年龄相同的视为同一个学生,保证学生唯一性;
1,描述学生
2,定义Map容器,将学生作为键,地址作为值,存入;
3,获取Map中元素
*/
class Student implements Comparable<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*34;
}
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");
//第一种取出方式keySet
Iterator<Student> it = hm.keySet().iterator();
while(it.hasNext()){
Student stu = it.next();
System.out.println(stu.getName+":"+hm.get(stu));
}
//第二种取出方法entrySet
Set<Map.Entry<Student,String>> entrySet = hm.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.getName()+":"+addr);
}
}
}

------- android培训java培训、期待与您交流! ----------

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值