1 Map接口

1.1Map集合

双列集合体系结构.png  Collection中的集合,元素是孤立存在的(理解为单身),向集合中存储元素采用一个个元素的方式存储。
 Map中的集合,元素是成对存在的(理解为夫妻)。每个元素由键与值两部分组成,通过键可以找对所对应的值。
 Collection中的集合称为单列集合,Map中的集合称为双列集合。
 需要注意的是,Map中的集合不能包含重复的键,值可以重复;每个键只能对应一个值。
 Map中常用的集合为HashMap集合、LinkedHashMap集合。

1.2 Map集合的基本使用

Map是双列集合,里面的内容都是以键值对的形式保存的,每一个键都对应一个值。

Map集合的常用方法:
V put(K key, V value): 将键值对添加到Map集合中. 如果key已经存在,就会覆盖掉原来的内容。如果这个key不存在,返回值就是null。
V get(Object key): 根据key获取value。
V remove(Object key): 根据key删除整个的键值对。返回的是删除键值对的值。

常见实现类
HashMap(常用),LinkedHashMap


Map: K 表示Map集合中键的数据类型, V表示值的数据类型。
定义泛型的时候,可以定义多个,多个之间使用逗号隔开就可以了。

1.3 遍历Map集合

1.3.1 通过keySet来遍历Map

我们不能直接使用迭代器遍历Map集合。
我们可以先获取到Map集合中的所有的键(key),把这些key放入到一个Set集合,然后再使用迭代器遍历这个Set集合就可以了。

Map集合中有一个方法,可以拿到所有的key。
Set 丨 keySet():返回存放所有key的Set集合。

步骤(非常重要)
1. 调用keySet方法,得到所有的key,放入到Set集合中返回。
2. 遍历这个Set集合,拿到里面的每一个元素(每一个key)
3. 调用map集合的get方法,根据key获取到value。

1.3.2通过entrySet来遍历Map

(1)Entry介绍
在Map类设计时,提供了一个嵌套接口:Entry。Entry将键值对的对应关系封装成了对象。即键值对对象,这样我们在遍历Map集合时,就可以从每一个键值对(Entry)对象中获取对应的键与对应的值。
(2)具体
Map集合还有另外一种遍历方式,就是通过Entry的方式去遍历。
每一个Entry对象中都保存了一个键值对,所以我们可以拿到Map集合中所有的 Entry然后再通过Entry拿到对应的键值对。

如何获取Map集合中的所有Entry对象?
Set> entrySet():获取到所有的Entry对象,并放入到Set集合 中返回。

如何通过Entry对象获取键和值?
K getKey(): 获取Entry中的key。
V getValue():获取Entry中的value

entrySet遍历步骤(必须记住)
1. 调用Map集合的entrySet,得到所有的entry对象,并放入到Set集合中返回。
2. 遍历Set集合,得到里面的每一个Entry对象
3. 调用这个Entry的getKey和getValue方法获取到键和值。
entrySet遍历方式.png

1.3.2 增强for遍历Map集合

增强for不能直接遍历Map集合。

可以调用entrySet或者keySet得到一个Set集合,再使用增强for遍历这个Set集合。

遍历集合(两大种,四小种)
keySet
迭代器
增强for(推荐)
entrySet
迭代器
增强for

  1. Set<String> keys = map.keySet();
  2. //使用增强for循环遍历这个Set集合
  3. for(String key : keys) {
  4. //key表示的就是set集合中的每个元素,就是每个key
  5. //根据key获取value
  6. String value = map.get(key);
  7. System.out.println(key + "--" + value);
  8. }

1.4 HashMap

1.4.1 特点

HashMap是Map接口的一个实现类,也是最常用的一个。
特点:
1. 无序。
2. key不能重复。
3. key和value允许为null。
其实HashSet内部就是HashMap,只用到了其中的key,没用value。

1.4.2 HashMap保存自定义对象

HashMap中的key和HashSet一样,通过hashCode和equals来判断对象的唯一性。
例如:HashMap map = new HashMap<>();
如果想要让学生姓名和年龄相同,就视为同一名学生。需要重写hashCode和equals方法。(和昨天学的HashSet一模一样)

HashMap的key的唯一性是根据hashCode和equals去判断的。

如果key已经存在,就覆盖。

1.5 LinkedHashMap

LinkedHashMap特点:
内部有一个链表,可以保证有序。

1.6 Hashtable(已经淘汰了)

1.0版本就有了,非常老,现在已经淘汰了。(注意,这个就是写成Hashtable不是HashTable,因为出现的版本太早了,那时候对命名规则不是很重视)
键不能是null。
哈希表初始容量是11。HashMap是16.
Hashtable线程安全,效率低。

1.7 properties类

Properties也是一个双列集合,里面也是使用键值对去存储数据。
特点:
1. Properties是Map接口的实现类。所以拥有Map集合的所有的方法。
2. Properties没有泛型,键和值都是String。
3. Properties支持对文件的操作(重要)

特有方法:
(重要)Object setProperty(String key, String value): 向Properties集合中添加键值对。
(重要)String getProperty(String key): 根据key获取value。
Set stringPropertyNames(): 获取Properties集合中的所有的key,保存到Set集合中。 相当于keySet。
(重要)void load(Reader reader): 可以将文件中的键值对加载到Properties集合中。

(重要)void load(Reader reader): 可以将文件中的键值对加载到Properties集合中。参数是Reader,可以传递BufferedReader和FileReader

读取文件中的键值对到Properties集合中的步骤:
1. 创建Properties集合。
2. 创建一个输入流对象。 绑定一个文件。
3. 调用load方法,传递输入流对象,就可以把文件中的键值对读取到Properties集合中了。

文件要求:
1. 文件一般是以properties结尾。
2. 文件中的键值对必须要按照以下格式保存
key=value
key=value
key=value

1.8 可变参数

可变参数: 就是方法的参数个数可以变量。

格式:
修饰符 返回值类型 方法名(参数类型… 参数名) {
//…
}

1. 可变参数方法在调用的时候可以传递【任意】个参数,0个,1个或者多个。
2. 调用方法的时候,可变参数位置传递的数据的数据类型必须一致
3. 【可变参数本质就是数组】,它的使用方式和数组一样。可以对可变参数进行遍历,也可以调用它的length属性。
4. 如果我调用带有可变参数的方法,那么在可变参数位置也能够传递数组。
5. 因为可变参本质是数组,所以不能和数组构成方法重载关系。


注意事项:
1. 一个方法内最多只能有一个可变参。
2. 如果方法中有可变参数,这个可变参数只能放到最后。

2 Collections工具类

Collections 是操作集合的工具类。
Collection 是单列集合的根接口。
千万不要混了

常用方法:
sort(List list):排序。
shuffle(List<?> list):打乱顺序。

3 Arrays工具类

Arrays是操作数组的工具类

sort(数组)方法:对数组中的内容进行排序。内部采用的是快速排序。
toString(数组): 把数组中的内容转成字符串。