Map集合
- map集合是一个双列集合,一个元素包含两个值(一个key,一个Value)。
- map集合中的元素,key和value的数据类型可以相同,也可以不同。
- map集合中的元素,key不允许重复,value是可以重复的。
- map集合中的元素,key和value事一一对应的。
成员方法:
public V put(K key, V value)
: 把指定的键与指定的值添加到Map集合中。
public class MapDemo {
public static void main(String[] args) {
demo();
}
/*`public V put(K key, V value)`: 把指定的键与指定的值添加到Map集合中。
返回值V
存储的key不重复的时候,返回值V是null
存储的key重复,会使用心得value替换map中重复的value,返回被替换的value。
*/
private static void demo() {
//创建map集合,使用多态
Map<String,String> m=new HashMap<>();
String s1=m.put("fjc","ltf");
System.out.println(s1);
//key重复,会使用心得value替换map中重复的value,返回被替换的value。
String s2=m.put("fjc","ltf1");
System.out.println(s2);
//重写了toString方法
System.out.println(m);
}
}
运行结果:
null
ltf
{fjc=ltf1}
public V remove(Object key)
: 把指定的键 所对应的键值对元素 在Map集合中删除,返回被删除元素的值。
private static void demo() {
//创建map集合,使用多态
Map<String,String> m=new HashMap<>();
m.put("fjc","ltf");
m.put("杨过","小龙女");
System.out.println(m);
//`public V remove(Object key)`: 把指定的键 所对应的键值对元素 在Map集合中删除,返回被删除元素的值。
m.remove("fjc");
System.out.println(m);
}
运行结果:
{杨过=小龙女, fjc=ltf}
{杨过=小龙女}
public V get(Object key)
根据指定的键,在Map集合中获取对应的值。
//* `public V get(Object key)` 根据指定的键,在Map集合中获取对应的值。
String s=m.get("fjc");
System.out.println(s);
}
boolean containsKey(Object key)
判断集合中是否包含指定的键。
// `boolean containsKey(Object key) ` 判断集合中是否包含指定的键。
boolean s=m.containsKey("fjc");
boolean s1=m.containsKey("fff");
System.out.println(s);
System.out.println(s1);
运行结果:
true
false
public Set<K> keySet()
: 获取Map集合中所有的键,存储到Set集合中。
// `public Set<K> keySet()`: 获取Map集合中所有的键,存储到Set集合中。
//获取所有的键 获取键集
Set<String> keys = m.keySet();
for(String key:keys) {
String value=m.get(key);
System.out.println(key+"的值是"+value);
}
public Set<Map.Entry<K,V>> entrySet()
: 获取到Map集合中所有的键值对对象的集合(Set集合)。
Map.Entry<K,V>
- 在Map接口中有一个内部接口Entry
- 当Map集合一创建,那么就会在Map集合中创建一个Entry对象,用来记录键与值。
方法:
set<Map.Entry<K,V>> entrySet()
把map集合内部的多个Entry对象取出来,储存到一个Set集合中。public K getKey()
:获取Entry对象中的键。public V getValue()
:获取Entry对象中的值。
private static void demo() {
//创建map集合,使用多态
Map<String,String> m=new HashMap<>();
m.put("fjc","ltf");
m.put("杨过","小龙女");
m.put("aaa","bbb");
Set<Map.Entry<String, String>> set=m.entrySet();
for(Map.Entry<String, String> s:set){
String key=s.getKey();
System.out.println(key);
String value=s.getValue();
System.out.println(value);
}
HashMap
- 基于哈希表的,查询速度特别快。
- 是一个无序的集合,存储元素和取出元素可能不一致。
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (!(o instanceof Student)) return false;
Student student = (Student) o;
return age == student.age &&
name.equals(student.name);
}
@Override
public int hashCode() {
return Objects.hash(name, age);
}
public static void main(String[] args) {
show();
}
private static void show() {
//创建HashMap对象
HashMap<Student,String> map=new HashMap<>();
map.put(new Student("fjc",18),"山西");
map.put(new Student("ltf",20),"湖南");
map.put(new Student("lwh",20),"浙江");
map.put(new Student("fjc",18),"浙江");
Set<Student> set=map.keySet();
for (Student s:set){
System.out.println(s+":"+map.get(s));
}
}
- 重写hashCode和equals方法来保证key的唯一。
LinkHashMap
- 基于哈希表+链表(保证了迭代的顺序)
- 是一个有序的集合,存储元素和取出元素一致。
HashTable
- 实现了Map接口
- HashTable底层是一个哈希表,是一个线程安全的集合,是单线程集合,速度慢。不可以存储null值,null键。
- HashMap底层是一个哈希表,是一个线程不安全的集合,是多线程集合,速度快。可以存储null值,null键。
map集合练习
public class MapTest {
public static void main(String[] args) {
System.out.println("请录入一个字符串:");
String line = new Scanner(System.in).nextLine();
// 定义 每个字符出现次数的方法
findChar(line);
}
private static void findChar(String line) {
//1:创建一个集合 存储 字符 以及其出现的次数
HashMap<Character, Integer> map = new HashMap<Character, Integer>();
//2:遍历字符串
for (int i = 0; i < line.length(); i++) {
char c = line.charAt(i);
//判断 该字符 是否在键集中
if (!map.containsKey(c)) {//说明这个字符没有出现过
//那就是第一次
map.put(c, 1);
} else {
//先获取之前的次数
Integer count = map.get(c);
//count++;
//再次存入 更新
map.put(c, ++count);
}
}
System.out.println(map);
}
}
JDK9对集合的优化
- List接口,Set接口,Map接口里面增加了一个静态方法,可以集合一次性添加多个元素。
- of方法只适用于List接口,Set接口,Map接口,不适用于他的实现类。
- 长度固定,不能使用add,remove,put等方法。
- set接口不能传入重复的元素,否则会抛出异常。
List<String> l=new List.of("a","b");