Map:双列集合
键:不能重复
值:可重复
键+值=键值对、键值对对象、Entry对象(在java中的叫法)
Interface Map<K,V>
K:键的数据类型
V:值得数据类型
键和值是一一对应的,每一个键只能找到自己对应的值
创建Map(接口)集合的对象
多态方式
成员方法:
V put(K key , V value) | 添加对象 如果添加的键不存在,则会把键值对添加到集合中。 如果要添加的键是存在的,那么会覆盖原先的值,并且把原先的值当返回值返回。 |
V remove(Object key) | 根据键删除键值对元素 |
void clear() | 移除所有的键值对元素 |
boolean containsKey(Object key) | 判断集合中是否包含指定的键 |
boolean containsValue(Object value) | 判断集合中是否包含指定的值(比较少用) |
boolean isEmpty() | 判断集合是否为空 |
int size() | 集合长度,也就是键值对个数 |
Map遍历:
Set<String,String> s = new HashSet();
s.put("1号男","1号女");
s.put("2号男","2号女");
s.put("3号男","3号女");
s.put("4号男","4号女");
方式一:
Set<K> keySet() | 获取所有键的集合 |
V get(Object key) | 根据键获取值 |
Set<String> k = s.keySet();
for(String k1 : k ){
String v = s.get(k1);
sout(k1+"---"+v);}
方式二:
Set<Map.Entry<K,V>> entrySet() | 获取所有键值对对象的集合 |
K getKey() | 获取键 |
V getValue() | 获取值 |
Set<Map.Entry<String,String>> e = s.entrySet();
for(Map.Entry<String,String> e1 : e ){
String k2 = e1.getKey();
String v2 = e1.getValue();
sout(k2+"---"+v2);}
方式三:
s.forEach(
(String key , String value) -> { sout(key+"---"+value); }
);
forEach底层原理:(属于map的默认方法,两个实现类hashmap和treemap都可以使用遍历)
HashMap:
HashMap和HashSet底层都是哈希表结构
Map.put("键","值"); = Entry对象(HashCode会根据键的地址值计算出哈希值(注意:和value值无关))
当数组存有键值对时,会调用equals比较键,返回true,则覆盖原先键值对对象,返回false,则直接存链表的第一位
HashCode是计算出哈希值,从而存入数组
注意:没有重写的HashCode是根据对象的地址值计算出来的哈希值,重写的HashCode是根据对象的属性值计算出来的哈希值
equals是当存入的数组索引中已存在对象,则会对比键是否一致
依赖HashCode和equals方法来保证“键”的唯一
键若存储到自定义对象,则必须重写HashCode和equals方法
如果是值存到自定义中,则无需重写(值可以重复,键不能重复)
String之类的底层源码,java已帮我们重写好了
TreeMap:
红黑树结构,其他和Map一样
依赖自然排序和比较器排序,对键进行排序
键若存自定义,则必须在自定义类中实现Comparable接口并重写compareTo或在TreeMap有参构造里实现Comparator比较器排序的排序规则
可变参数:(底层也是数组)
定义一个方法,求N个数的和
public class M23 { public static void main(String[] args) { //定义一个方法,求N个数的和 int b = b(1, 2, 3, 4, 5, 6); System.out.println(b);//输出21 a();//输出[I@1b6d3586 } public static int a(int... sa) { System.out.println(sa);//打印的是地址值 return 0; } public static int b(int... sa) { int sum = 0; for (int i = 0; i < sa.length; i++) { sum = sum + sa[i]; } return sum; } }
JDK5之前:
public static sum(int... arr) | 可变参数 |
sum(int a,int b ,int c , int...arr);
若有多个参数,可变参数要放最后
sum(1,2,3 ,"a","b");
创建不可变集合:(jdk9之后才能用)
static<E> List<E> of(E...elements) | 创建一个具有指定元素的List集合对象 |
static<E> Set<E> of(E...elements) | 创建一个具有指定元素的Set集合对象(元素不能重复,否则报错) |
static<K,V> Map<K,V> of(E...elements) | 创建一个具有指定元素的Map集合对象 |
注意:创建出来的集合是不可变的,也就是不可以增删修改,不然会报错
作用:简化了add、put等等添加步骤,实现批量增加
Map接口中还有一个ofEntres()方法
阅读性较好
Map.ofEntries(Map.entry("ss","11"),Map.entry("aa","11"),Map.entry("bb","21"));
static<E> 也可以有泛型?