键不能重复,值可以重复
Map接口位于最高层
①注意V put(K key,V value)这个方法,
当加入 的键值对元素的键(key) 不存在时,就会将 键值对 加到双列集合中,此时返回值为null
当加入 的键值对元素 的键(key)已在双列集合中存在时 ,就会 覆盖原有 键(key) 对应的值(value) ,并将value返回。
①两种 获取 成员内部类对象的方式
②Iterator迭代器是 集合的内部类,通过调用方法来获取对象。
注意Outer是一个类名,它是可以改变的,用 类名.this 来调用外部类的成员变量或方法
3.3静态内部类
记得加new 后加括号,因为 此时是 创建内部类的对象,可以想象,平常创建对象的时候都会加括号,跟构造方法有关。
通过 Map的keySet()方法可以获得 包含所有key的一个单列集合
public static void main(String[] args) {
Map map = new HashMap<>();
map.put("海绵宝宝", 1);
map.put("派大星", 2);
map.put("章鱼哥", 3);
//键找值
//1.获取所有的键(key),放在一个单列集合中
Set myKeySet = map.keySet();
//通过迭代器遍历单列集合,并用Map的get(KEY k)方法来获取
Iterator it = myKeySet.iterator();
while (it.hasNext()) {
String key = it.next();
Integer value = map.get(key);
System.out.println("key:" + key + "value:" + value);
}
//通过增强for遍历
for (String key : myKeySet) {
Integer value = map.get(key);
System.out.println("key:" + key + "value:" + value);
}
//使用lambda表达式
myKeySet.forEach(
key -> {
Integer value = map.get(key);
System.out.println("key:" + key + "value:" + value);
}
);
}
public static void main(String[] args) {
Map map = new HashMap<>();
map.put("海绵宝宝", 1);
map.put("派大星", 2);
map.put("章鱼哥", 3);
//Entry接口是 Map接口的内部接口,所以要用Map.Entry
//这和内部类很像的,外部类.内部类 对象名=new 外部类().内部类()
Set> entries = map.entrySet();
//通过迭代器去遍历单列集合,不过这时候里面的类型是 Entry接口,
// 这里使用接口的多态,为了方便学习该接口的一些方法
Iterator> it = entries.iterator();
while (it.hasNext()) {
Map.Entry entry = it.next();
Integer value = entry.getValue();
String key = entry.getKey();
System.out.println(key + " = " + value);
}
//增强for遍历 遍历单列集合
for (Map.Entry entry : entries) {
Integer value = entry.getValue();
String key = entry.getKey();
System.out.println(key + " = " + value);
}
//lambda表达式遍历单列集合
entries.forEach(
stringIntegerEntry -> {
System.out.println(stringIntegerEntry.getKey() + " = " + stringIntegerEntry.getValue());
});
}
前面我们通过 键找值 键值对对象 两种方式 来获取 获取一个单列集合 并对其进行遍历。
现在,我们可以直接 里面 Map的forEach()方式来直接获取key和value。
对于Map的forEach的底层原理,其实是利用 增强for来完成的。
Map map = new HashMap<>();
map.put("海绵宝宝", 1);
map.put("派大星", 2);
map.put("章鱼哥", 3);
map.forEach(new BiConsumer() {
@Override
public void accept(String key, Integer value) {
System.out.println(key + " = " + value);
}
});
①利用 key去计算哈希值,如果Key是 自定义引用类型 因此需要重写key的hashCode方法,如果不是自定义类型,不需要重写。
②在同一索引下有多个元素,当被添加的元素的哈希值通过计算得到的index为该索引时,就会 比较键(key)是否相同,若相同则 将要添加的元素的值(value)会 覆盖 原来集合中存在的键(key)的值。
若key与索引下的所有元素的key不同,则会将key挂在链表下面。
在单列集合中 ,通过比较属性值是否相等来去重。
因此当 键 是自定义数据类型时,需要重写键(key)的equals方法。