---------------------- android培训、java培训、期待与您交流! ---------------------
JavaSE_18 笔记
Java语言基础之 Map集合 泛型
1、集合框架之 Map集合
Map<K,V> : 一次添加一对元素。Collection一次添加一个元素。其实Map集合中存储的就是键值对,map集合中必须保证键的唯一性。
① 添加:
Value put (key,value) :返回前一个和同key关联的值,若没有返回null。即存相同的键,值会被覆盖。因为要保证key唯一。
② 删除:
Void clear(); //清空map集合
Value remove(key) ;
③ 判断
Boolean containsKey(key);
Boolean containsValue(value);
Boolean isEmpty();
④ 获取
Value get(key) : 通过key获取值。
Int size(); 获取键值对的个数。
2、事例: 取出map集合中所有元素。
方法一:通过keyset()获取map中所有键的Set集合,再通过Iterator迭代器获取到每一个键,进而获取每一个值。
map.put(0, "liang");
map.put(02, "ming");
Set set=map.keySet(); //返回Set集合,而非List,保证元素的唯一性。
Iterator it=set.iterator();
while(it.hasNext()){
System.out.println(map.get(it.next()));
}
方法二:使用map的entrySet(),该方法将键和值的映射关系作为对象存储到了set集合中,而这个映射关系的类型就是Map.Entry类型。
map.put(8, "xiao");
map.put(0, "liang");
map.put(02, "ming");
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();
System.out.println(me.getKey()+":"+me.getValue());
}
3、Map常用的子类
① HashTable:内部结构是哈希表,是同步的。不允许null作为键,Null作为值。
② HashMap:内部结构是哈希表,是不同步的。允许null作为键,null作为值。
③ TreeMap:内部结构是二叉树,不是同步的。可以对Map集合中的键进行排序。
本质:Map是Set集合的扩充,其实Set集合底层就是由Map集合实现的。
4、 Hashtable的子类:Propertise
用来存储键值对象的配置文件信息。
5、集合框架之 泛型
① 是jdk1.5之后出现的安全机制,它将运行时期的问题ClassCastException转到了编译时期。
② 避免了强制转换的麻烦。
③ 使用时期是当操作的引用数据类型不确定的时候,就使用<>。将要操作的引用数据类型传入即可。其实<>就是一个用于接收具体引用数据类型的参数范围。
④ 在程序中,只要用到了带有<>的类或者接口,就要明确传入的具体引用数据类型。
⑤ 泛型的擦除:运行时,会将泛型去掉,生产的class文件中是不带泛型的。为何擦除:因为为了兼容运行的类加载器。
⑥ 泛型的补偿:在运行时,通过获取元素的类型进行转换动作,不用使用者再强制转换了。
6、泛型类
① public class Tool<QQ> ; 当类中操作的引用数据类型不确定的时候,就使用泛型来表示。
② 这种方式比Object安全些,但是稍微麻烦些。 Tool<QQ> tool=new Tool<QQ>() ;
7、泛型方法:
Public <W> void show(W str) { //sop( ) }
8、泛型方法静态:
Public static <Y> void method(Y obj ) { // }
当方法静态时,不能访问类上定义的泛型,如果静态方法使用泛型,那么只能将泛型定义在方法上。
9、泛型接口
Interface Inter<T> { public void show(T t); }
Class InterImpl2<Q> implements Inter<Q> { public void show(Q q) { //... } }
Class InterImpl implements Inter<String> { // }
10、泛型限定 之 泛型通配符的使用
① 定义通配符,可以操作所有类
Public static vid printCollection(Collection<?> a1) { Iterator<?> it=al.iterator() ; }
② 定义类的通配符,只可以操作父类的所有子类。即限制了一部分类型。
Public static void printCollection(Collection<? Extends Person> a1)
{ Iterator<? Extends Person> it = a1.iterator() ; }
11、泛型限定 的 上下限 :
①上限: ? Extends E : 接受E类型或者E的子类型。
一般在存储元素的时候使用上限,因为这样取出的都是按照上限类型来运算的,不会出现类型安全隐患。
②下限: ? Super E : 接受E类型或者E的父类型。下限!
12、集合框架的选择
需要唯一吗?
需要: Set
----需要制定顺序:
需要:TreeSet
不需要:HashSet
但是想要一个和存储一直的顺序(有序):LinkedHashSet
不需要:List
----需要频繁增删:
需要:LinkedList
不需要:ArrayList
13、关于集合框架:
① 看到array :就要想到数组,就要想到查询快,有角标。
② 看到link : 就要想到链表,就要想到增删块,就要想到 add 、get 、remove+first last的方法。
③ 看到 hash :就要想到哈希表,想到唯一性,就要想到元素需要覆盖hashCode方法和equals方法。
④ 看到tree:就要想到二叉树,就要想要排序,想到两个接口 comparable,comparator。
而且通常这些常用的集合容器都是不同步的。