Java的集合之Map接口---(英雄联盟的CP例子)从光棍(Collection)变夫妻(Map)

目录

Interface Map

Map接口概述

Map接口和Collection接口的不同

添加功能

V put(K key, V value)

删除功能

void clear()

V remove(Object key)

判断功能

boolean containsKey(Object key)

boolean containsValue(Object value)

boolean isEmpty()

获取功能

V get(Object key)

Set keySet()

Collection values()

长度功能

int size()

英雄联盟CP案例

案例一 遍历map集合的方式1:根据键找值

案例二  遍历Map集合的方式2:根据键值对对象找键和值


Interface Map<K,V>

查看API文档我们知道:

public interface Map<K,V>

将键映射到值的对象。 地图不能包含重复的键; 每个键可以映射到最多一个值。

这个接口取代了Dictionary类,它是一个完全抽象的类而不是接口。

Map界面提供了三个集合视图 ,允许将映射内容视为一组键,值集合或键值映射集合。 地图的顺序被定义为其中在地图上的集合视图迭代返回元素的顺序。 一些地图实现,如TreeMap课程,对他们的订单做出了具体的保证; 其他人,像HashMap班,不要。

注意:如果使用可变对象作为地图键,必须非常小心。 如果对象的值以影响equals比较的方式更改,而对象是地图中的键,则不会指定地图的行为。 这个禁令的一个特殊情况是,地图不允许将自己包含在内。 虽然地图可以将其本身作为一个值,但建议您非常小心: equals和hashCode方法在这样的地图上已经不太明确。

所有通用映射实现类应提供两个“标准”构造函数:一个创建空映射的void(无参数)构造函数,以及一个具有类型为Map的单个参数的构造函数 ,它创建一个具有相同键值的新映射映射作为参数。 实际上,后一个构造函数允许用户复制任何地图,产生所需类的等效地图。 没有办法强制执行此建议(因为接口不能包含构造函数),而JDK中的所有通用映射实现都符合要求。

包含在该界面中的“破坏性”的方法,即,修改其操作地图的方法,被指定抛出UnsupportedOperationException如果此映射不支持该操作。 如果是这种情况,如果调用对地图没有影响,这些方法可能会但不是必须抛出UnsupportedOperationException 。 例如,如果映射映射为“叠加”的地图为空,则可以在不可修改的映射上调用putAll(Map)方法,但不是必须抛出异常。

一些地图实现对它们可能包含的键和值有限制。 例如,一些实现禁止空键和值,有些对键的类型有限制。 尝试插入不合格的键或值会抛出未经检查的异常,通常为NullPointerException或ClassCastException 。 尝试查询不合格键或值的存在可能会引发异常,或者可能只是返回false; 一些实现将展现出前者的行为,一些实现将展现出后者。 更一般来说,尝试对不符合条件的密钥或值的操作,其完成不会导致将不合格元素插入到地图中可能会导致异常或可能成功执行该选项。 此异常在此接口的规范中标记为“可选”。

Collections Framework接口中的许多方法都是按照equals方法定义的。 例如,对于在本说明书containsKey(Object key)方法表示:“返回true当且仅当此映射包含一个键k使得(key==null ? k==null : key.equals(k))的映射。” 该规范应该被解释为意味着具有非空参数调用key Map.containsKey会导致key.equals(k)被调用的任意键k。 实现可以实现优化,从而避免equals的调用,例如,首先比较两个密钥的哈希码。 ( Object.hashCode()规范保证具有不等的哈希码的两个对象不能相等。)更一般地,各种Collections Framework接口的实现可以随意使用底层Object方法的指定行为,无论执行者认为适当。

执行递归遍历地图的一些地图操作可能会失败,并且地图直接或间接包含自身的自引用实例有异常。 这包括clone()equals()hashCode()toString()方法。 实现可以可选地处理自引用场景,然而大多数当前实现不这样做。

此接口是成员Java Collections Framework

通过观察API文档我们得出结论:

Map接口概述

  • 将键(key)映射到值(value)的对象
  • 一个映射不能包含重复的键
  • 没个键最多只能映射到一个值

Map接口和Collection接口的不同

  • Map是双列的,Collection是单列的
  • Map集合中存储的元素都是成双成对出现的,Map元素的键是唯一的,值是可以重复的,键值对有其它的称呼:夫妻对
  • Collection接口中的元素都是单独出现的,Collection接口下面有个子接口Set元素是唯一的List集合中的元素是可以重复的,像这样单独出现的元素,有其它的称呼:光棍

添加功能

V put(K key, V value)

查看API文档我们知道:

V put(K key,V value)

  将指定的值与该映射中的指定键相关联(可选操作)。 如果映射先前包含了密钥的映射,则旧值将被指定的值替换。 (映射m被认为包含关键字的映射k当且仅当m.containsKey(k)将返回true )。

参数

key - 指定值与之关联的键

value - 与指定键相关联的值

结果

前一个值与key相关联 ,或null,如果没有key的映射。 (A null返回也可以表示该地图以前关联的null与key ,如果实现支持null的值)

异常

UnsupportedOperationException -如果 put操作不受此地图支持

ClassCastException - 如果指定的键或值的类阻止它存储在此映射中

NullPointerException - 如果指定的键或值为空,并且此映射不允许空值或值

IllegalArgumentException - 如果指定键或值的某些属性阻止其存储在此映射中

将指定的值与该映射中的指定键相关联(可选操作)

参考代码1:

import java.util.HashMap;

public class MapPutDermo1 {
    public static void main(String[] args) {
        //创建一个Map集合对象
        HashMap<String, String> sshm = new HashMap<>();

        //添加元素
        // V put(K key, V value)将指定的值与该映射中的指定键相关联(可选操作)。

        //返回的是该键对应被覆盖的值,多次添加同一个key的映射的时候key只有一个,值被覆盖。
        System.out.println(sshm.put("盖伦","卡特"));
        System.out.println(sshm.put("盖伦","卡特"));
        System.out.println(sshm.put("盖伦","卡特2"));
        System.out.println(sshm.put("盖伦","卡特3"));
    }
}

输出结果:

null
卡特
卡特
卡特2

通过运行结果我们发现 :返回的是该键对应被覆盖的值,多次添加同一个key的映射的时候key只有一个,值被覆盖。

参考代码2:

import java.util.HashMap;

public class MapPutDermo1 {
    public static void main(String[] args) {
        //创建一个Map集合对象
        HashMap<String, String> sshm = new HashMap<>();

        //添加元素
        // V put(K key, V value)将指定的值与该映射中的指定键相关联(可选操作)。

        //返回的是该键对应被覆盖的值,多次添加同一个key的映射的时候key只有一个,值被覆盖。
        sshm.put("盖伦","卡特");
        sshm.put("EZ","宝石");
        sshm.put("洛","霞");
        sshm.put("卢锡安","塞纳");
        sshm.put("卢锡安","塞纳1");
        sshm.put("卢锡安","塞纳2");
        System.out.println(sshm);
    }
}

输出结果:

{卢锡安=塞纳2, EZ=宝石, 洛=霞, 盖伦=卡特}

通过运行结果我们发现:当key值相同时,值会被覆盖。


删除功能

void clear()

查看API文档我们知道:

void clear()

从该地图中删除所有的映射(可选操作)。 此呼叫返回后,地图将为空。

异常

UnsupportedOperationException -如果 clear操作不受此地图支持

从map中删除所有的映射(可选操作)

参考代码:

import java.util.HashMap;

public class MapClearDermo1 {
    public static void main(String[] args) {
        //创建一个Map集合对象
        HashMap<String, String> sshm = new HashMap<>();

        //添加元素
        // V put(K key, V value)将指定的值与该映射中的指定键相关联(可选操作)
        sshm.put("盖伦","卡特");
        sshm.put("EZ","宝石");
        sshm.put("洛","霞");
        sshm.put("卢锡安","塞纳");
        sshm.put("卢锡安","塞纳1");
        sshm.put("卢锡安","塞纳2");
        System.out.println(sshm);

        System.out.println("\n================\n");

        //void clear()从该map中删除所有的映射(可选操作)
        sshm.clear();
        System.out.println(sshm);

    }
}

输出结果:

{卢锡安=塞纳2, EZ=宝石, 洛=霞, 盖伦=卡特}

================

{}

通过我们输出结果我们得出结论:void clear()删除的是所有映射(可选操作)


V remove(Object key)

查看API文档我们知道:

V remove(Object key)

如果存在(从可选的操作),从该地图中删除一个键的映射。 更正式地,如果该映射包含从关键字k到值v的映射,使得(key==null ? k==null : key.equals(k)) ,该映射被去除。 (地图最多可以包含一个这样的映射。)

返回此地图先前相关联的密钥,或null如果映射包含该键的映射值。

如果此映射允许空值,那么null返回值并不一定表明此映射不包含该键的映射关系; 地图也可能显式地将密钥映射到null 。

一旦呼叫返回,该映射将不包含指定键的映射。

参数

key - 其映射将从地图中删除的密钥

结果

前一个值与 key相关联 ,或 null,如果没有 key的映射。

异常

UnsupportedOperationException -如果 remove操作不受此地图支持

ClassCastException - 如果密钥对于此地图是不合适的类型( optional

NullPointerException - 如果指定的键为空,并且此映射不允许空键( optional

如果存在(从可选的操作),从该地图中删除一个键的映射

参考代码:

import java.util.HashMap;

public class MapRemoveDermo1 {
    public static void main(String[] args) {
        //创建一个Map集合对象
        HashMap<String, String> sshm = new HashMap<>();

        //添加元素
        // V put(K key, V value)将指定的值与该映射中的指定键相关联(可选操作)。
        sshm.put("盖伦","卡特");
        sshm.put("EZ","宝石");
        sshm.put("洛","霞");
        sshm.put("卢锡安","塞纳");
        sshm.put("卢锡安","塞纳1");
        sshm.put("卢锡安","塞纳2");
        System.out.println(sshm);

        System.out.println("\n================\n");

        //V remove(Object key)如果存在(从可选的操作),从该地图中删除一个键的映射
        //key不存在的时候不会报错,返回的是被删除的key对应的值,并且从map集合中移除
        System.out.println(sshm.remove("EZ"));
        System.out.println(sshm);

    }
}

输出结果:

{卢锡安=塞纳2, EZ=宝石, 洛=霞, 盖伦=卡特}

================

宝石
{卢锡安=塞纳2, 洛=霞, 盖伦=卡特}

通过输出结果我们得出结论:key不存在的时候不会报错,返回的是被删除的key对应的值,并且从map集合中移除


判断功能

boolean containsKey(Object key)

查看API文档我们知道:

boolean containsKey(Object key)

如果此映射包含指定键的映射,则返回true 。 更正式地,返回true当且仅当该地图包含关键字k的映射,使得(key==null ? k==null : key.equals(k)) 。 (最多可以有一个这样的映射。)

参数

key - 要在此地图中存在的密钥要进行测试

结果

true如果此映射包含指定键的映射

异常

ClassCastException - 如果密钥对于该地图是不合适的类型( optional

NullPointerException - 如果指定的键为空,并且此映射不允许空键( optional

 如果此映射包含指定键的映射,则返回true

参考代码:

import java.util.HashMap;

public class MapContainsKeyDermo1 {
    public static void main(String[] args) {
        //创建一个Map集合对象
        HashMap<String, String> sshm = new HashMap<>();

        //添加元素
        // V put(K key, V value)将指定的值与该映射中的指定键相关联(可选操作)。

        sshm.put("盖伦","卡特");
        sshm.put("EZ","宝石");
        sshm.put("洛","霞");
        sshm.put("卢锡安","塞纳");
        sshm.put("卢锡安","塞纳1");
        sshm.put("卢锡安","塞纳2");
        System.out.println(sshm);

        System.out.println("\n================\n");

        //boolean containsKey(Object key)如果此映射包含指定键的映射,则返回true 。
        System.out.println(sshm.containsKey("盖伦"));
        System.out.println(sshm.containsKey("洛"));
        System.out.println(sshm.containsKey("佛耶戈"));

    }
}

输出结果:

{卢锡安=塞纳2, EZ=宝石, 洛=霞, 盖伦=卡特}

================

true
true
false

通过输出结果我们得出结论:containsKey就是返回映射的键(key)


boolean containsValue(Object value)

查看API文档我们知道:

boolean containsValue(Object value)

如果此映射将一个或多个键映射到指定的值,则返回true 。 更正式地,返回true当且仅当此映射包含至少一个映射到值v ,使得(value==null ? v==null : value.equals(v)) 。 对于Map接口的大多数实现,此操作对于地图大小可能需要时间线性。

参数

value - 要在此地图中存在的值要进行测试

结果

true如果该地图将一个或多个键映射到指定的值

异常

ClassCastException - 如果该值对于该地图是不合适的类型( optional

NullPointerException - 如果指定的值为空,并且此映射不允许空值( optional

如果此映射将一个或多个键映射到指定的值,则返回true

参考代码:

import java.util.HashMap;

public class MapContainsValueDermo1 {
    public static void main(String[] args) {
        //创建一个Map集合对象
        HashMap<String, String> sshm = new HashMap<>();

        //添加元素
        // V put(K key, V value)将指定的值与该映射中的指定键相关联(可选操作)。

        sshm.put("盖伦","卡特");
        sshm.put("EZ","宝石");
        sshm.put("洛","霞");
        sshm.put("卢锡安","塞纳");
        sshm.put("卢锡安","塞纳1");
        sshm.put("卢锡安","塞纳2");
        System.out.println(sshm);

        System.out.println("\n================\n");

// boolean containsValue(Object value)如果此映射将一个或多个键映射到指定的值,则返回true 

        System.out.println(sshm.containsValue("宝石"));
        System.out.println(sshm.containsValue("塞纳"));
        System.out.println(sshm.containsValue("塞纳2"));
        System.out.println(sshm.containsValue("伊苏尔德"));

    }
}

输出结果:

{卢锡安=塞纳2, EZ=宝石, 洛=霞, 盖伦=卡特}

================

true
false
true
false

通过输出结果我们得出结论:containsValue就是返回映射的值(value)


boolean isEmpty()

查看API文档我们知道:

boolean isEmpty()

如果此地图不包含键值映射,则返回 true 。

结果

true如果此映射不包含键值映射

如果此map不包含键值映射,则返回 true

参考代码:

import java.util.HashMap;

public class MapContainsValueDermo1 {
    public static void main(String[] args) {
        //创建一个Map集合对象
        HashMap<String, String> sshm = new HashMap<>();

        //添加元素
        // V put(K key, V value)将指定的值与该映射中的指定键相关联(可选操作)。

        sshm.put("盖伦","卡特");
        sshm.put("EZ","宝石");
        sshm.put("洛","霞");
        sshm.put("卢锡安","塞纳");
        sshm.put("卢锡安","塞纳1");
        sshm.put("卢锡安","塞纳2");
        System.out.println(sshm);

        System.out.println("\n================\n");

        //boolean isEmpty()如果此map不包含键值映射,则返回 true
        System.out.println(sshm.isEmpty());
        
        //从该map中删除所有的映射
        sshm.clear();
        System.out.println(sshm.isEmpty());

    }
}

输出结果:

{卢锡安=塞纳2, EZ=宝石, 洛=霞, 盖伦=卡特}

================

false
true

通过输出结果我们得出结论:isEmpty()就是判断map键值映射是否为空,如果为空返回ture,反之如果不为空返回false,我们使用用clear删除map中所有映射验证了


获取功能

V get(Object key)

查看API文档我们知道:

V get(Object key)

返回到指定键所映射的值,或null如果此映射包含该键的映射。

更正式地,如果该映射包含从键k到值v ,使得(key==null ? k==null : key.equals(k)) ,则该方法返回v ; 否则返回null 。 (最多可以有一个这样的映射。)

如果此映射允许空值,则返回值null并不一定表明该映射不包含该键的映射关系; 地图也可能明确地将密钥映射到null 。 可以使用containsKey操作来区分这两种情况。

参数

key - 要返回其关联值的键

结果

指定键映射到的值,如果此映射不包含键的映射, null

异常

ClassCastException - 如果密钥是该地图不合适的类型( optional

NullPointerException - 如果指定的键为空,并且此映射不允许空键( optional

返回到指定键所映射的值,或null如果此映射包含该键的映射

参考代码:

import java.util.HashMap;

public class MapGetDemo {
    public static void main(String[] args) {
        //创建map集合对象
        HashMap<String, String> sshm = new HashMap<>();

        //添加元素
        sshm.put("蛮王","艾希");
        sshm.put("孙悟空","阿狸");
        sshm.put("普朗克","俄洛伊");
        sshm.put("雷恩加尔","奈德丽");

        //V get(Object key)返回到指定键所映射的值,或null如果此映射包含该键的映射
        //如果map中不包含该键,返回的是null

        System.out.println(sshm.get("普朗克"));
        System.out.println(sshm.get("雷恩加尔"));
        System.out.println(sshm.get("亚索"));

    }
}

输出结果:

俄洛伊
奈德丽
null

通过运行结果我们得出结论: 如果该映射包含从键k到值v ,使得(key==null ? k==null : key.equals(k)) ,则该方法返回v ; 否则返回null 。 (最多可以有一个这样的映射。)

我们分别get了普朗克、雷恩加尔、亚索,键值映射里获取到了普朗克的老婆俄洛伊、雷恩加尔的老婆奈德丽、键值映射里没有亚索的老婆,可怜的亚索是个光棍。


Set<K> keySet()

查看API文档我们知道:

Set<K> keySet()

返回此地图中包含的键的Set视图。 该集合由地图支持,因此对地图的更改将反映在集合中,反之亦然。 如果在集合中的迭代正在进行中修改映射(除了通过迭代器自己的remove操作),迭代的结果是未定义的。 该组支持元件移除,即从映射中相应的映射,经由Iterator.remove,Set.remove,removeAll,retainAll和clear操作。 它不支持add或addAll操作。

结果

该地图中包含的键的集合视图

 返回此地图中包含的键的Set视图

参考代码:

import java.util.HashMap;
import java.util.Set;

public class MapGetDemo {
    public static void main(String[] args) {
        //创建map集合对象
        HashMap<String, String> sshm = new HashMap<>();

        //添加元素
        sshm.put("蛮王","艾希");
        sshm.put("孙悟空","阿狸");
        sshm.put("普朗克","俄洛伊");
        sshm.put("雷恩加尔","奈德丽");

        //Set<K> keySet()返回此map中包含的键的Set视图
        Set<String> strings = sshm.keySet();
        for (String s : strings) {
            System.out.println(s);

        }
    }
}

输出结果:

雷恩加尔
孙悟空
蛮王
普朗克

通过输出结果我们得出结论:keySet()返回的就是此map中包含的键(key)


Collection<V> values()

查看API文档我们知道:

Collection<V> values()

返回此地图中包含的值的Collection视图。 集合由地图支持,因此对地图的更改将反映在集合中,反之亦然。 如果在集合中的迭代正在进行中修改映射(除了通过迭代器自己的remove操作),迭代的结果是未定义的。 该collection支持元素移除,即从映射中相应的映射,经由Iterator.remove,Collection.remove,removeAll,retainAll和clear操作。 它不支持add或addAll操作。

结果

该地图中包含的值的集合视图

 返回此地图中包含的值的Collection视图

参考代码:

import java.util.Collection;
import java.util.HashMap;

public class MapGetDemo {
    public static void main(String[] args) {
        //创建map集合对象
        HashMap<String, String> sshm = new HashMap<>();

        //添加元素
        sshm.put("蛮王","艾希");
        sshm.put("孙悟空","阿狸");
        sshm.put("普朗克","俄洛伊");
        sshm.put("雷恩加尔","奈德丽");

        //Collection<V> values()返回此地图中包含的值的Collection视图
        Collection<String> values = sshm.values();
        for (String s : values) {
            System.out.println(s);
        }

    }
}

输出结果:

奈德丽
阿狸
艾希
俄洛伊

 通过输出结果我们得出结论:values()返回的就是此map中包含的值(value)


长度功能

int size()

查看API文档我们知道:

int size()

返回此地图中键值映射的数量。 如果地图包含超过Integer.MAX_VALUE个元素,则返回Integer.MAX_VALUE 。

结果

该地图中键值映射的数量

 返回此地图中键值映射的数量

参考代码:

import java.util.HashMap;

public class MapGetDemo {
    public static void main(String[] args) {
        //创建map集合对象
        HashMap<String, String> sshm = new HashMap<>();

        //添加元素
        sshm.put("蛮王","艾希");
        sshm.put("孙悟空","阿狸");
        sshm.put("普朗克","俄洛伊");
        sshm.put("雷恩加尔","奈德丽");

        //int size()返回此地图中键值映射的数量
        System.out.println(sshm);
        System.out.println("map集合中键值对的个数为:" + sshm.size());

    }
}

输出结果:

{雷恩加尔=奈德丽, 孙悟空=阿狸, 蛮王=艾希, 普朗克=俄洛伊}
map集合中键值对的个数为:4

通过输出结果我们得出结论:size()就是获取此map键值对映射的数量


英雄联盟CP案例

案例一 遍历map集合的方式1:根据键找值

分析:

1、获取Map集合中所有映射的键Set集合

2、遍历键的集合根据键找对应的值

3、输出

参考代码:

/*
        遍历map集合的方式1:根据键找值
            1、获取Map集合中所有映射的键的Set集合
            2、遍历键的集合,根据键找对应的值
            3、输出
 */
import java.util.HashMap;
import java.util.Set;

public class MapTest1 {
    public static void main(String[] args) {
        //创建map集合对象
        HashMap<String, String> sshm = new HashMap<>();

        //添加英雄联盟CP到集合中
        sshm.put("布里茨(蒸汽机器人)","奥莉安娜(发条魔灵)");
        sshm.put("德莱文(荣耀行刑官)","迦娜(风暴之怒)");
        sshm.put("阿木木(殇之木乃伊)","安妮(黑暗之女)");
        sshm.put("科加斯(虚空恐惧)","塞克雷(虚空遁地兽)");
        sshm.put("金克斯(暴走萝莉)","蔚(皮城执法官)");

        //获取Map集合中所有映射的键Set集合
        Set<String> keySet = sshm.keySet();

        //使用增强for循环遍历Map集合
        for (String key : keySet) {
            String value = sshm.get(key);
            System.out.println(key + "----CP----" + value);

        }
    }
}

输出结果:

布里茨(蒸汽机器人)----CP----奥莉安娜(发条魔灵)
金克斯(暴走萝莉)----CP----蔚(皮城执法官)
阿木木(殇之木乃伊)----CP----安妮(黑暗之女)
科加斯(虚空恐惧)----CP----塞克雷(虚空遁地兽)
德莱文(荣耀行刑官)----CP----迦娜(风暴之怒)

现在你知道英雄联盟这些CP关系了吗?


案例二  遍历Map集合的方式2:根据键值对对象找键和值

分析:

1、获取所有键值对的集合

2、遍历获取每一个键值对,得到每一个键值对对象

3、根据获取到的每一个键值对对象,来进一步获取键和值

参考代码:

import java.util.HashMap;
import java.util.Map;
import java.util.Set;

/*
        遍历Map集合的方式2:根据键值对对象找键和值
        1、获取所有键值对的集合
        2、遍历获取每一个键值对,得到每一个键值对对象
        3、根据获取到的每一个键值对对象,来进一步获取键和值
 */
public class MapTest2 {
    public static void main(String[] args) {
        //创建map集合对象
        HashMap<String, String> sshm = new HashMap<>();

        //添加英雄联盟CP到集合中
        sshm.put("崔斯特(卡牌大师)","伊芙琳(寡妇制造者)");
        sshm.put("提莫(迅捷斥候)","麦林炮手(崔丝塔娜)");
        sshm.put("扭曲树精(茂凯)","荆棘之兴(婕拉)");
        sshm.put("奥瑞利安.索尔(铸星龙王)","希瓦娜(龙血武姬)");
        sshm.put("伊泽瑞尔(探险家)","伊泽瑞尔(探险家)");

        //获取所有键值对的集合
        Set<Map.Entry<String, String>> entries = sshm.entrySet();

        //使用增强for循环遍历map集合
        for (Map.Entry<String, String> keyValue : entries) {
            //HashMap中重写了getKey()和getValue()方法
            String key = keyValue.getKey();
            String value = keyValue.getValue();

            System.out.println(key + "----CP----" + value);

        }
    }
}

输出结果:

崔斯特(卡牌大师)----CP----伊芙琳(寡妇制造者)
提莫(迅捷斥候)----CP----麦林炮手(崔丝塔娜)
奥瑞利安.索尔(铸星龙王)----CP----希瓦娜(龙血武姬)
扭曲树精(茂凯)----CP----荆棘之兴(婕拉)
伊泽瑞尔(探险家)----CP----伊泽瑞尔(探险家)

 比较案例一和案例二结果,结果输出效果都一样,建议以后做开发使用第二种方法遍历map集合


现在你知道英雄联盟这些CP关系了吗?

༼ つ ◕_◕ ༽つ到底啦!给靓仔点个关注吧!

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

liangzai2048

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值