## 一、Map 集合
不属于Collection集合的子集合
Map<key ,value>
## 二、Map集合的特点:
1. 可以有null,只能有一个
2. 以键值对的形式,存储元素
3. Map集合中的元素, key是不允许重复的,value是可以重复的
4. Map集合中的元素, key和value是一一对应
## 三、Map的实现类:
#### HashMap
底层是用`哈希表`实现的,查询的速度特别的快
`HashMap`集合是一个无序的集合,存储元素和取出元素的顺序有可能不一致
#### TreeMap
底层是用`二叉树`实现的
### `HashMap` 类与 `Hashtable` 的区别?
> `HashMap` :线程不同步,不允许null键和null值
>
> `Hashtable`: 线程同步,允许null键和null值
> Map集合没有迭代器,要想遍历集合中的内容,必须把其转为set集合进行
## 四、Map集合常用的方法:
| put(); | |
| :---------: | :--------------------------------------------- |
| get(); | key存在,返回对应的value值;key不存在,返回null |
| remove(); | key存在,v返回被删除的值;key不存在,v返回null |
| entrySet(); | 返回map集合的键值对set集合,常用 |
| keySet(); | 返回ma集合中所有key的set集合,不常用 |
| values(); | 返回map集合中所有value的collection集合,不常用 |
## 五、Map 的练习:
```java
public class MapDemo {
/**
* put
*/
@Test
public void test1() {
Map<String, Integer> a = new HashMap<>();
a.put("语文", 99);
a.put("数学", 94);
a.put("物理", 96);
a.put("英文", 15);
System.out.println(a);
}
/**
* get(); 根据key值获取value值
*/
@Test
public void test2() {
Map<String, Integer> a = new HashMap<>();
a.put("语文", 99);
a.put("数学", 94);
a.put("物理", 96);
a.put("英文", 15);
System.out.println(a);
System.out.println(a.get("数学"));
}
/**
* remove
*/
@Test
public void test3() {
Map<String, Integer> a = new HashMap<>();
a.put("语文", 99);
a.put("数学", 94);
a.put("物理", 96);
a.put("英文", 15);
System.out.println(a.remove("数学"));
System.out.println(a);
}
/**
* Map集合的三种collection视图
*/
@Test
public void test4() {
Map<String, Integer> a = new HashMap<>();
a.put("语文", 99);
a.put("数学", 94);
a.put("物理", 96);
a.put("英文", 15);
System.out.println(a);
// key - value视图
Set<Map.Entry<String,Integer>> s=a.entrySet();
System.out.println(s);
// key 视图
Set keys= a.keySet();
System.out.println(keys);
// value 视图
Collection c=a.values();
System.out.println(c);
}
}
```
## 六、Map 集合遍历键找值方法:
### 1、键找值方式:
**即通过元素中的键,获取键所对应的值**
```Set<K> keySet() 返回此映射中包含的键的 Set 视图。```
### 实现步骤:
1. 使用Map集合中的方法keySet(),把Map集合所有的key取出来,存储到一个Set集合中
1. 遍历set集合,获取Map集合中的每一个key
2. 通过Map集合中的方法get(key),通过key找到value
```java
public static void main(String[] args) {
//创建Map集合对象
Map<String,Integer> map = new HashMap<>();
map.put("赵丽颖",168);
map.put("杨颖",165);
map.put("林志玲",178);
//1.使用Map集合中的方法keySet(),把Map集合所有的key取出来,存储到一个Set集合中
Set<String> set = map.keySet();
//2.遍历set集合,获取Map集合中的每一个key
//使用迭代器遍历Set集合
Iterator<String> it = set.iterator();
while (it.hasNext()){
String key = it.next();
//3.通过Map集合中的方法get(key),通过key找到value
Integer value = map.get(key);
System.out.println(key+"="+value);
}
System.out.println("-------------------");
//使用增强for遍历Set集合
for(String key : set){
//3.通过Map集合中的方法get(key),通过key找到value
Integer value = map.get(key);
System.out.println(key+"="+value);
}
System.out.println("-------------------");
//使用增强for遍历Set集合
for(String key : map.keySet()){
//3.通过Map集合中的方法get(key),通过key找到value
Integer value = map.get(key);
System.out.println(key+"="+value);
}
}
```
------------
### 2、使用Entry对象遍历:
```Set<Map.Entry<K,V>> entrySet() 返回此映射中包含的映射关系的 Set 视图。```
### 实现步骤:
1. 使用Map集合中的方法entrySet(),把Map集合中多个Entry对象取出来,存储到一个Set集合中
2. 遍历Set集合,获取每一个Entry对象
3. 使用Entry对象中的方法getKey()和getValue()获取键与值
```java
public static void main(String[] args) {
//创建Map集合对象
Map<String,Integer> map = new HashMap<>();
map.put("赵丽颖",168);
map.put("杨颖",165);
map.put("林志玲",178);
//1.使用Map集合中的方法entrySet(),把Map集合中多个Entry对象取出来,存储到一个Set集合中
Set<Map.Entry<String, Integer>> set = map.entrySet();
//2.遍历Set集合,获取每一个Entry对象
//使用迭代器遍历Set集合
Iterator<Map.Entry<String, Integer>> it = set.iterator();
while(it.hasNext()){
Map.Entry<String, Integer> entry = it.next();
//3.使用Entry对象中的方法getKey()和getValue()获取键与值
String key = entry.getKey();
Integer value = entry.getValue();
System.out.println(key+"="+value);
}
System.out.println("-----------------------");
for(Map.Entry<String,Integer> entry:set){
//3.使用Entry对象中的方法getKey()和getValue()获取键与值
String key = entry.getKey();
Integer value = entry.getValue();
System.out.println(key+"="+value);
}
}
```
## List集合、Set集合、Map集合之间的区别?
1. ```List``` 和 ```Set``` 是存储单列数据的集合,```Map``` 是存储键值对这样的双列数据的集合;
2.
1) ```List``` 中存储的数据是有顺序的,并且值允许重复;
2) ```Map``` 中存储的数据是无序的,它的键是不允许重复的,但是值是允许重复的;
3) ```Set```中存储的数据是无顺序的,并且不允许重复,但元素在集合中的位置是由元素的```hashcode```决定,即位置是固定的
(Set集合是根据hashcode来进行数据存储的,所以位置是固定的,但是这个位置不是用户可以控制的,所以对于用户来说set中的元素还是无序的)。
```
1. List 集合中对象按照索引位置排序,可以有重复对象,允许按照对象在集合中的索引位置检索对象,例如通过list.get(i)方法来获取集合中的元素;
2. Map 中的每一个元素包含一个键和一个值,成对出现,键对象不可以重复,值对象可以重复;
3. Set 集合中的对象不按照特定的方式排序,并且没有重复对象,但它的实现类能对集合中的对象按照特定的方式排序,例如 Tree Set 类,可以按照默认顺序,也可以通过实现 Java.util.Comparator< Type >接口来自定义排序方式。
```
![1545816646365](C:\Users\yflad-F\Desktop\JAVA笔记\assets\1545816646365.png)
- JAVA笔记
- 01、Java扫盲
- 1、JVM、JRE和JDK的区别
- 2、环境变量path和classpath的作用是什么?
- 3、变量有什么用?为什么要定义变量?什么时候用?
- 4、&和&&的区别?
- 5、标示符命名规则
- 6、数据类型
- 7、类型转换
- 8、java语言的三种技术架构
- 9、java的跨平台性
- 10、有符号数据的表示法(次重点)
- 11、按位运算符
- 12、函数
- 13、重载
- 14、数组
- 15、内存结构
- 一、数据结构
- 随机数
- 流程控制语句
- if 和 if...else
- switch
- for
- 函数
- 重载
- 数组
- 数组的复制
- 冒泡排序法算法
- 方法
- 方法的重载
- 方法的练习
- 面向对象
- 面向对象的特点
- 如何创建类
- 如何创建对象
- 一、引用数据类型具有的默认值
- 二、成员变量和局部变量
- 三、构造函数
- 四、气球理论
- 五、继承(extends)
- 权限修饰符
- 封装
- 内存的分配
- 多态
- super关键字
- static关键字
- final关键字
- 抽象类 抽象方法(abstract)
- 接口(interface)
- 单例模式(singleton)
- Object类
- 内部类
- 匿名内部类
- 阶段项目
- 捕鱼达人
- 飞机大战
- 护盾功能
- 血条
- 爆炸
- API
- String 类相关的方法
- 第三方(Apache)jar包的使用
- 正则表达式
- StringBuffer 和StringBuilder 和Date
- 核心API:集合类
- List 集合
- 遍历集合的方式
- 包装类
- Map 集合
- 异常