Map接口
1.1 Map概念及使用
1.1.1 Map概念
双列集合是每个元素都有键与值两部分组成的集合,记录的是键值对对应关系。即通过键可以找到值。
常用子类:
最常用的双列集合是Map下的子类HashMap。
Hashtable也是Map集合的一种已被HashMap取代。
Map集合的特点,如是否可重复,是否有序仅作用在键上,如HashMap集合的键不得重复,值可以重复。
1.1.2 基本使用
Map(HashMap)的使用:创建对象时加入两个泛型。
Map<k,v>
key - 此映射所维护的键的类型
value - 映射值的类型
常用方法:
public V put(K key,V value) //加入元素,则新值会覆盖掉旧值
public V get(Object key) //根据键找值
public Set<K> keySet() //返回所有键的集合
Collection<V> values() //返回所有值的集合
可以根据以上方法,完成Map集合遍历,通常使用keySet方法配合get方法。
如
//创建双列集合对象
Map<String, String> map = new HashMap<String, String>();
//向集合中添加元素
map.put("呼保义", "宋江");
map.put("玉麒麟", "卢俊义");
map.put("智多星", "吴用");
map.put("入云龙", "公孙胜");
//返回集合中所有键的集合
Set<String> keySet = map.keySet();
//遍历键的集合,依次获取每一个键
for (String key : keySet) {
//通过键获取集合中的每个值并打印
String value = map.get(key);
System.out.println(value);
}
1.1.3 Map存储自定义类型
在1.1.1中,我们介绍了Map集合的特点,如是否可重复,是否有序仅作用在键上,如HashMap集合的键不得重复,值可以重复。
Map存储自定义类型时,需要做到键不能重复,此时,其键的判断规则与HashSet的判断规则相同。如果想通过内容,而非通过地址比较两个对象是否相同,就需要重写该类型的hashCode与equals方法。
1.1.4 Entry键值对对应关系
在Map类设计时,提供了一个嵌套类:Entry。Entry将键值对对应关系封装成了对象。是我们可以独立使用,比如遍历Map集合。可以从一个Entry对象中中获取一个键值对的键与值。
Set<Map.Entry<K,V>> entrySet() 方法用于返回某个集合所有的键值对对象。
Entry中的方法如下:
K getKey() 获取键
V getValue() 获取值
容器工具类
2.1 Collections
Collections是集合工具类,专门对集合进行操作。常用方法:
public static<T> void sort(List<T> list) //排序
public static<T> int binarySearch(List<?> list,T key) //查找元素索引
public static voidshuffle(List<?> list) //打乱元素顺序
2.2 Arrays
Arrays是数组工具类,常用方法:
public static int binarySearch(Xxx[] a,Xxx key) //查找元素索引
public static void sort(Xxx[] a) //排序
public static String toString(Xxx[] a) //返回字符串内容
集合ArrayList转为数组的方法为ArrayList的以下两个方法:
public Object[] toArray() //集合转数组
public <T> T[] toArray(T[] a)
2.3 可变参数
Collections中有一个方法可以一次加入多个元素
Collections中有一个方法可以一次加入多个元素
public static <T> boolean addAll(Collection<? super T> c,T... elements)
该方法使用到了可变参数,即定义时并不知道要传入多少个实际参数。此时设计成...的方式,此时可以在调用该方法时,
一次传入多个参数。传入的多个数将被自动组织成数组,我们只要操作生成的数组即可。
类似的方法还有Arrays的public static <T> List<T> asList(T... a) //数组转固定长度集合
注:可变参数只能放在最后定义。可变参数方法本质是数组,所以不可以与数组类型参数重载。
2.4 静态导入
在导包的过程中我们可以直接导入静态部分,这样某个类的静态成员就可以直接使用了。在源码中经常会出现静态导入,而在日常开发中几乎没有人使用。
静态导入格式:
import static XXX.YYY; 导入后YYY可直接使用。
集合框架总结
3.1 简单数据结构
数据结构指的数据存储和组织方式,如日常的容器中,有方形、圆形、存放液体、固体,都是。
我们在前边见到了多种不同结构的集合,每种集合有各自数据结构特点,总结如下:
数组结构:一块连续的存储区域
链表结构:每个元素指向下一个元素
队列结构:容器先进先出的规则
栈结构:容器先进后出规则
3.2 集合嵌套
集合嵌套并不是一个新的知识点,仅仅是集合内容又是集合,如单列集合嵌套、双列集合与单列集合嵌套、双列集合嵌套。
单列集合嵌套:
北京大学(List表示)有多个分校(list表示),每个分校有多个班级(字符串)。
双列集合与单列集合嵌套
北京大学Map表示,key:分校名称、value:分校集合)
有多个分校(List表示)
每个分校有多个班级(字符串)。
双列集合嵌套
北京大学(Map表示,key:分校名称、value:分校集合)
有多个分校(Map表示,key:班级名称、value 班级对象)
每个分校有多个班级(自定义班级类MyClass)。