黑马程序员_泛型和Map

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

泛型是JDK1.5出现的安全机制,什么时候用呢?当操作的引用数据类型不确定的时候。就使用<>。将要操作的引用数据类型传入即可.其实<>就是一个用于接收具体引用数据类型的参数范围。最基本的用处就是:将运行时期的问题ClassCastException转到了编译时期,并且避免了强制转换的麻烦。泛型可以操作的范围和用处:1.在类当中,当类中操作的引用数据类型不确定是时候,就使用它;2在方法上当方法静态时,不能访问类上定义的泛型,只能将泛型定义在方法上;3.泛型接口,将泛型定义在接口。

泛型的通配符:? 未知类型-----  ? extends E: 接收E类型或者E的子类型对象。上限一般存储对象的时候用。比如 添加元素 addAll;? super E: 接收E类型或者E的父类型对象。 下限一般取出对象的时候用,比如比较器。addAll()方法值得我去注意一下,如果自定义对象比如Person调用它添加它的子类Student比较器的时候根据父类的去排。通配符的体现明显的就是调用remove和contains方法。 

————————————————————————

在jdk1.5后,使用泛型来接收类中要操作的引用数据类型。
泛型类。什么时候用?当类中的操作的引用数据类型不确定的时候,就使用泛型来表示。 
public class Tool<QQ>{
private QQ q;

public QQ getObject() {
return q;
}

public void setObject(QQ object) {
this.q = object;
}

/**
* 将泛型定义在方法上。
* @param str
*/
public <W> void show(W str){
System.out.println("show : "+str.toString());
}
public void print(QQ str){
System.out.println("print : "+str);
}

/**
* 当方法静态时,不能访问类上定义的泛型。如果静态方法使用泛型,
* 只能将泛型定义在方法上。 
* @param obj
*/
public static <Y> void method(Y obj){
System.out.println("method:"+obj);
}
}

————————————————————————

下面学到了集合,Map和Collection2个集合间的区别:Map:一次添加一对元素。Collection 一次添加一个元素;Map也称为双列集合,Collection集合称为单列集合;其实map集合中存储的就是键值对,map集合中必须保证键的唯一性。 Map的子类有下面3种。

|--Hashtable :内部结构是哈希表,是同步的。不允许null作为键,null作为值。 
|--HashMap : 内部结构是哈希表,不是同步的。允许null作为键,null作为值。
|--TreeMap : 内部结构是二叉树,不是同步的。可以对Map集合中的键进行排序。 

常用方法:
1,添加。
value put(key,value):返回前一个和key关联的值,如果没有返回null.
2,删除。
void  clear():清空map集合。
value remove(key):根据指定的key翻出这个键值对。 
3,判断。
boolean containsKey(key):
boolean containsValue(value):
boolean isEmpty();
4,获取。 
value get(key):通过键获取值,如果没有该键返回null。
当然可以通过返回null,来判断是否包含指定键。 
int size(): 获取键值对的个数。

自己打代码的时候,主要是老师上课的例子,可以得到Map中存相同的键,值会被覆盖。想取出Map中所以元素的时候有二种方法:1.通过keySet方法获取map中所有的键所在的Set集合,在通过Set的迭代器获取到每个键, 在对每一个键获取其对于的值即可,Set<Integer> keySet = map.keySet();        Iterator<Integer> it = keySet.iterator();  可以简写成Iterator<key类型> it = Map实例.keySet().iterator();. 取出的是key,在根据key通过get()方法找value   2.通过Map转成set就可以迭代. 找到了另一个方法。entrySet该方法将键和值的映射关系作为对象存储到了Set集合中,而这个映射关系的类型Map.Entry类型,Set<Map.Entry<Integer, String>> entrySet = map.entrySet();     Iterator<Map.Entry<Integer, String>> it = entrySet.iterator(); 可以简写成Iterator<Map.Entry<key类型, value类型>> it = hm.entrySet().iterator(); 接受的取出的是Map.Entry<key类型, value类型>,根据getKey和getValue方法分别去除。

还有在用hashMap时,要保证key唯一性,要重写hashCode和equals方法。用TreeMap时要排序时需要和TreeSet一样的用法,注意泛型的意义。

最后我觉得可以让自己熟练的方式,老师总结的:

集合的一些技巧:
需要唯一吗?
需要:Set
需要制定顺序: 
需要: TreeSet
不需要:HashSet
但是想要一个和存储一致的顺序(有序):LinkedHashSet
不需要:List
需要频繁增删吗?
需要:LinkedList
不需要:ArrayList

如何记录每一个容器的结构和所属体系呢?
看名字!
List
|--ArrayList
|--LinkedList
Set
|--HashSet
|--TreeSet
后缀名就是该集合所属的体系。
前缀名就是该集合的数据结构。
看到array:就要想到数组,就要想到查询快,有角标.
看到link:就要想到链表,就要想到增删快,就要想要 add get remove+frist last的方法 
看到hash:就要想到哈希表,就要想到唯一性,就要想到元素需要覆盖hashcode方法和equals方法。 
看到tree:就要想到二叉树,就要想要排序,就要想到两个接口Comparable,Comparator 。

而且通常这些常用的集合容器都是不同步的。 

————————————————————————

迭代的二种方式演示:

public class MapDemo {

public static void main(String[] args) {

Map<Integer,String> map = new HashMap<Integer,String>();
method_2(map);
}
public static void method_2(Map<Integer,String> map){

map.put(8,"zhaoliu");
map.put(2,"zhaoliu");
map.put(7,"xiaoqiang");
map.put(6,"wangcai");

Collection<String> values = map.values();

Iterator<String> it2 = values.iterator();
while(it2.hasNext()){
System.out.println(it2.next());
}

/*
* 通过Map转成set就可以迭代。
* 找到了另一个方法。entrySet。
* 该方法将键和值的映射关系作为对象存储到了Set集合中,而这个映射关系的类型就是Map.Entry类型
*/
Set<Map.Entry<Integer, String>> entrySet = map.entrySet();
Iterator<Map.Entry<Integer, String>> it = entrySet.iterator();

while(it.hasNext()){
Map.Entry<Integer, String> me = it.next();
Integer key = me.getKey();
String value = me.getValue();
System.out.println(key+"::::"+value);

}

//取出map中的所有元素。
//原理,通过keySet方法获取map中所有的键所在的Set集合,在通过Set的迭代器获取到每一个键,
//在对每一个键通过map集合的get方法获取其对应的值即可。

Set<Integer> keySet = map.keySet();
Iterator<Integer> it = keySet.iterator();

while(it.hasNext()){
Integer key = it.next();
String value = map.get(key);
System.out.println(key+":"+value);

}
}

}


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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值