一、Map:一次添加一对元素。Collection一次添加一个元素。
Map也称为双列集合,Collection集合也称为单列集合。
其实 map集合中存储的是键值对。map集合中必须保证键的唯一性。
常用方法:
-
添加。
value put(key,value) :返回前一个和key关联的值,如果没有,返回null。
-
删除。
void clear();
value remove();根据指定的key删除这个键值对。
-
判断
booleancontainsKey(key);
boolean containsValue(value);
booleanisEmpty();
-
获取
value get(key);通过键获取值。如果没有该键,返回null。当然可以通过返回null,来判断是否包含指定键。
int size();获取键值对的个数。
KeySet:取出map中的所有元素。原理,通过KeySet方法获取map中所有的键所在的Set集合,在通过Set的迭代器获取到每一个键,在对每一个键通过map集合的get方法获取其对应的值即可。
entrySet:该方法将键和值的映射关系作为对象存储到了Set集合中,而这个映射关系的类型就是Map,Entry类型(结婚证)。
Map常用的子类:
Hashtable:内部结构是哈希表,是同步的。不允许null做为键和值。
Properties:用来存储键值对型的配置文件,可以和IO技术相结合。
HashMap:内部结构是哈希表,不是同步的。允许null做为键值。
TreeMap:内部结构是二叉树,不是同步的。可以对Map集合的键进行排序。
二、泛型
是jdk1.5出现的安全机制。
优点:1,将运行时期的问题ClassCaseException转到了编译时期。
2,避免了强制转换的麻烦。
<>:什么时候用?当操作引用数据类型不确定的时候。就使用<>(泛型)。将要操作的引用数据类型传入即可。其实<>就是一个用于接收具体引用数据类型的参数范围。
在程序中,只要用到了带有<>的类或接口,就要明确传入。
泛型技术是给编译器使用的技术,用于编译时期,确保了类型的安全。
运行时,会将泛型去掉,生成的class文件中是不带泛型的,这个称为泛型的擦除。
为什么擦除呢?因为为了兼容运行类加载器。
泛型的补偿机制:在运行时,通过获取元素的类型进行转换动作。不用使用者再强制转换了。
自定义泛型:
在JDK1.5后,使用泛型接收类中要操作的引用数据类型。
泛型类什么时候用?当类中的操作的引用数据类型不确定的时候,就使用泛型来表示。
-
将泛型定义在方法上
-
当方法静态时,不能访问类上定义的泛型。如果静态方法使用泛型,只能将泛型定义在方法上。
泛型的通配符:? 未知类型。
对类型进行限定:?extends E:接收E类型或者E的子类型对象。上限!
? super E:接收E类型或者E的父类型。下限!
注意:一般在存储元素的时候都是用上限,因为这样取出都是按照上限类型来运算的,不会出现类型安全隐患。
什么时候用下限:通常对集合中的元素进行取出操作时,可以使用下限。
集合使用的一些技巧:
需要唯一吗?
需要:Set
需要制定顺序:
需要:TreeSet
不需要:HashSet
但是想要一个和存储一致的顺序(有序):LinkedHashSet
不需要:List
需要频繁增删吗?
需要:LinkedList
不需要:ArrayList
如何记住每一个容器的结构和所属体系呢?
看名字!
List
|--ArrayList
|--LinkedList
Set
|--HashSet
|--TreeSet
后缀名就是该集合所属的体系。前缀名就是该集合的数据结构。
看到array:就要想到数组,就要想到查询快。有角标。
看到Link:就要想到链表,就要想到增删快。就要想到add getremove+first last方法。
看到hash:就要想到哈希表,就要想到唯一性,就要想到元素需要覆盖hashCode方法和equals方法。
看到tree:就要想到二叉树,就要想到排序,就要想到两个接口Comparable,Comparator。
而且通常这些常用的集合容器都是不同步的。
LinkedHashMap:与存储顺序一致
三、集合框架的工具类:Collections的使用
Collections和Collection有什么区别?
Collection是集合框架中的一个顶层接口,它里面定义了单列集合的共性方法。
它有两个常用的子接口,
List:对元素都有定义索引。有序的。可以重复元素。
Set:不可以重复元素。无序。
Collections是集合框架中的一个工具类。该类中的方法都是静态的。
此类完全由在collection上进行操作或返回collection的静态方法组成。
提供的方法中有可以对list集合进行排序,二分查找等方法。
通常常用的集合都是线程不安全的。因为要提高效率。
如果多线程操作这些集合时,可以通过该工具类中的同步方法,将线程不安全的集合,转换成安全的。
传统for和高级for的区别?
传统for可以完成对语句执行多次,因此可以定义控制循环的增量条件。
高级for是一种简化形式。
它必须有被遍历的目标。该目标就是数组,要么就是Collection单列集合。
函数的可变参数。
其实就是一个数组,但是接收的是数组的元素。
自动将这些元素封装成数组。简化了调用者的书写。
可变参数只能定义在参数列表的结尾。
静态导入:其实导入的是静态成员。
例如:importstatic java.util.Collections.*;
注意:当两个静态类中有同样的静态成员名,一定要加类名,否则会有冲突(调用的不确定性)
------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------