集合进阶:Map、HashMap、TreeMap、可变参数、创建不可变集合

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都可以使用遍历)

692a264ca22847b6838643e2e7b27655.png

HashMap:

HashMap和HashSet底层都是哈希表结构

Map.put("键","值"); =  Entry对象(HashCode会根据键的地址值计算出哈希值(注意:和value值无关))

当数组存有键值对时,会调用equals比较键,返回true,则覆盖原先键值对对象,返回false,则直接存链表的第一位

HashCode是计算出哈希值,从而存入数组

注意:没有重写的HashCode是根据对象的地址值计算出来的哈希值,重写的HashCode是根据对象的属性值计算出来的哈希值

equals是当存入的数组索引中已存在对象,则会对比键是否一致

a9bc501e86464248bbf57611addcff17.png

依赖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> 也可以有泛型?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值