泛型
好处:
1.将运行时期出现的问题ClassCastException转移到了编译时期,方便于程序员解决问题。
2.避免了强制类型转换问题。
弊端:
1.不可以预先使用对象的特有方法。
比较器和比较接口同样实现了泛型。
泛型定义在类上: class ClassName<T>{//something}
泛型定义在方法上:public <T> void funcName(){//something}
泛型定义在静态方法上:public static <T> void funcName(){//something}
泛型定义在接口上:interface Inter<T>{//something}在实现时,既可以指定实现数据类型,也可以定义泛型类提供更多数据类型使用。
占位符: ? 用来指定不确定的类型部分。
public void funcName(List<?> li){
Interator<?> it = li.iterator();
while(it.hasNext()){
it.next();
}
}
public <T> void funcName(List<T> li){
Interator<T> it = li.iterator();
while(it.hasNext()){
it.next();
}
}
两者几乎没有区别,但T是可以使用并定义类型的,而?不可以。
泛型限定:
<? extends E>可以接受E类型或E的子类型。上限。
<? super E>可以接受E类型和E的父类型。下限。
局限性在于只能调用对象的共性能容。
Map集合
该集合存储键值对。数据成对且唯一。
遍历Map集合的方式:
1.Set<k> keySet:将Map中所有的键存入到Set集合。因为Set具备迭代器。所以可以通过迭代方式取出所有的键,再根据get方法获取每一个键对应的值。
Set<T> keySet = map.keySet();//先获取map集合所有键的Set集合,keySet()
Iterator<T> it = keySet.iterator();
while(it.hasNext()){
T key = it.next();
E value = map.get(key);
}
2.Set<Map.Entry<k,v>> entrySet:将map集合中的映射关系存入到了set集合中。而这个关系的数据类型就是:Map.Entry
Set<Map.Entry<V,K>> entrySet = map.entrySet();//将Map集合中的映射关系取出,并存入到Set集合中。
Iterator<Map.Entry<V,K>> it = entrySet.iterator();
while(it.hasNext()){
Map.Entry<V,K> me = it.next();
K key = me.getKey();
V value = me.getValue();
}
Map - Hashtable
底层是哈希表数据结构,不可以存入null键、null值。该集合是线程同步的。
Map - HashMap
底层是哈希表数据结构,可以存入null键、null值。该集合是线程不同步的。
Map - TreeMap
底层是二叉树数据结构,可以用给Map集合中的键进行排序。线程不同步。
其实Set底层就是使用了Map集合。
|
|