2021年数梦工厂笔试题

文章目录

一、单选题

1. 编译和运行以下代码的结果是什么(本题3分)

public class StreamTest {
    public static void main(String[] args) {
        String a="apple";
        String b="apple";
        String c=new String("apple");
        String d=new String("apple");
        System.out.println(a==b);
        System.out.println(a==c);
        System.out.println(c==d);
        System.out.println(a.equals(c));
        System.out.println(c.equals(d));
    }
}

解析truefalse , false , truetrue

  • String定义字符串变量时,会先在常量池里面找有没有字符串apple,如果没有就把字符串apple放到常量池,变量名指向常量池中的地址,如果字符串已存在那么就不再重复放字符串到常量池了,变量名直接指向常量池中的地址

    new String()定义变量时,会和普通的引用类型一样,在堆中新建字符串apple,变量名指向堆中的地址

    第一题

  • ==对于基本类型来说是值比较,对于引用类型来说是引用的比较;而equals()默认情况下是引用比较,只是很多类重写了equals()方法,比如StringInteger等把它变成了值比较,所以一般情况下equals比较的是值是否相等

2. 下列链表的描述,下列语句正确的有(本题3分)

A. 在操作new ArrryList(20);中,链表扩充了一次。

B. 对于随机访问getset操作时,ArrayListLinkedList更合适。

C. ArrayList是线程非安全的,LinkedList是线程安全的。

D. 在链表初始化时,如果像new ArrayList(20);一样指定了链表长度时,则在插入第21个元素时,会抛出异常。

解析:

  • A. ArrayList list=new ArrayList(); 这种是默认创建大小为10的数组,每次扩容大小为1.5倍; ArrayList list=new ArrayList(20); 这种是指定数组大小的创建,创建时直接分配其大小,没有扩充。所以,扩充为0次

  • B. 如果集合数据是对于集合随机访问 get 和 set,ArrayList 绝对优于 LinkedList,因为 LinkedList 要移动指针,耽误时间。如果集合数据是对于集合新增和删除操作 addremoveLinedList 比较占优势,因为 ArrayList 要移动数据。所以 B 正确

  • C. ArrayListLinkedList 都是线程非安全的

  • D. 不会抛出异常,而是会自动扩容为原来长度的1.5倍。

3. 根据下述代码,关于编译描述正确的为(本题3分)

package c05;
public class ab {
    public int a;
    private int b;
    protected int c;
    int d;
    public void f1(){}
    private void f2(){}
    protected void f3(){}
    void f4(){}
}
package c06;

public class a {
    public static void main(String[] args) {
        co5.ab t=new co5.ab();
        t.a=1;
        t.b=2; //编译错误
        t.c=2; //编译错误
        t.d=2; //编译错误
        t.f1();
        t.f2(); //编译错误
        t.f3(); //编译错误
        t.f4(); //编译错误
    }
}

解析:

private : 在同一类内可见。使用对象:变量、方法。 注意:不能修饰类(外部类)

default (即缺省,什么也不写,不使用任何关键字): 在同一包内可见,不使用任何修饰符。使用对象:类、接口、变量、方法。

protected : 对同一包内的类和所有子类可见。使用对象:变量、方法。 注意:不能修饰类(外部类)。

public : 对所有类可见。使用对象:类、接口、变量、方法

如下图:

4. 执行如下程序后,a的值是(本题3分)

 int a=10;
    do{
        a--;
    }while (a-->0);
    System.out.println(a);

A. 0

B. -1

C. 1

D. 死循环

E. -2

解析:选 E.
因为,while(a-->0) 自减条件在while循环中,即使条件不符,后减的a仍会执行;但如果a--放在了循环体中的话,后减的a就不会执行了

引申:i--,--ii++++i
i-- 即 后减减 ,原理是:先自减,然后返回自减之前的值。
本例中,倒数二次循环 a=2时,a--,使得a=1,然后条件判断是a=10判断,条件满足,然后才自减一,使得 a=0, 最后一次循环,a-- , a=-1,然后 -1小于0,条件不满足,退出循环,但是 a 还是要自减一,使得 a 的最后值为 -2 .

--i 即 前减减 ,原理是:先自减,然后返回自减之后的值
同理:i++++i 也是如此。

5. 编译和运行以下类的结果是什么?(本题3分)

public class Test {
    public void methodA(int i){
        System.out.println(i);
    }
    public int methodA(int i){
        System.out.println(i);
    }
    public static void main(String[] args) {
        Test X=new Test();
        X.methodA(5);
    }
}

A. 该程序编译并运行打印5。

B. 该程序编译错误。

C. 该程序运行时异常,因为它找不到方法Test.methodA(int)

D. 该程序编译并运行打印6。

解析: 选 B

​ 该题考的是方法的重载:即发生在同一个类中,方法名相同参数列表不同(参数类型不同、个数不同、顺序不同),与方法返回值和访问修饰符无关,即重载的方法不能根据返回类型进行区分。故本题的methodA(int i)被定义了两次,造成编译错误

引申:

方法的重写:发生在父子类中,方法名、参数列表必须相同,返回值小于等于父类,抛出的异常小于等于父类,访问修饰符大于等于父类(里氏代换原则);如果父类方法访问修饰符为private则子类中就不能重写。

6. 根据下述代码,输出的结果是(本题3分)

public class listTest {
    public static void main(String[] args) {
        List<Integer> list = new ArrayList<>();
        list.add(1);
        list.add(2);

        for (Integer item:list){
            if (item.equals(2)){
                list.remove(item);
            }
        }
        System.out.println(list);
    }

}

A. 打印“[1,2]”

B. 运行时发生异常

C. 编译错误

D. 打印“[1]”

解析: 选 B 。因为 remove(int index) 是删除链表中指定位置的元素,而链表中只有0,1位置有元素。

7.根据下述代码,正确的输出值为(本题3分)

public class Demo {
    public static void main(String[] args) {
        StringBuilder a= new StringBuilder("A");
        StringBuilder b= new StringBuilder("B");
        operate(a,b);
        System.out.println(a+","+b);

    }

    private static void operate(StringBuilder x, StringBuilder y) {
        x.append(y);
        y=x;
    }
}

​ A. A,AB

​ B. A,B

​ C. AB,B

​ D. 编译错误

​ E. AB,AB

解析: 选 C 。

a指向A,b指向B, operate():x指向A,y指向B----------------调用方法:x指向AB,y指向了X为AB

之后:a指向的值变成了AB,b指向的还是B。

如下图:

8. 根据下列代码,正确的输出值为(本题3分)

public class Start {
    public static void main(String[] args) {
        new Apple();
    }
}
class Fruit {
    Fruit(){
        System.out.println("init a fruit");
    }
}
class Apple extends Fruit {
     private double w=initW();
     private  static String color =initC();
     Apple(){
         System.out.println("init an apple");
      }
      private static String initC() {
         System.out.println("init c");
         return "";
     }
     private double initW() {
         System.out.println("init w");
         return 1.0;
     } 
}

解析: 输出顺序为:init c init a fruit init w init an apple

java代码的执行顺序:

  1. 先执行父类的静态变量和代码块,在执行子类的静态变量和代码块

  2. 接着执行父类的变量和构造方法里面的方法

  3. 接着执行子类的变量和构造方法里面的方法

9.下列程序的输出内容为(本题3分)

public class Start {
    public static void main(String[] args) {
        Set<Integer> set=new HashSet<>();
        set.add(0);
        set.add(3);
        set.add(1);
        set.add(2);
        set.add(2);
        System.out.println(set);
        set.remove(2);
        System.out.println(set);
    }
}

解析: 输出内容为:[0, 1, 2, 3]
[0, 1, 3]

Set:一个无序(存入和取出顺序又可能不一致)容器,不可以存储重复元素,只允许存入一个null元素。set.remove(Object o) 方法用于从Set中删除特定元素。

存入和取出顺序又可能不一致的原因:

HashSet:哈希表里面存放的是哈希值,HashSet存储元素的顺序并不是按照存入时的顺序(和List显然不同) 是按照哈希值来存的所以取数据也是按照哈希值取得。

10. 若要求”查询选修了3门以上课程的学生的学生号“,正确的SQL语句是(本题3分)

A. SELECT Sno FROM SC ORDER BY Sno WHERE COUNT (*) > 3

B. SELECT Sno FROM SC ORDER BY Sno HAVING COUNT (*) >= 3

C. SELECT Sno FROM SC GROUP BY Sno HAVING (COUNT (*) > 3)

D. SELECT Sno FROM SC GROUP BY Sno WHERE COUNT (*) > 3

解析: 选 C .

  • order by的用法

    使用order by,一般是用来,依照查询结果的某一列(或多列)属性,进行排序(升序:ASC;序:DESC;默认为升序)。

    当排序列含空值时:

    ASC:排序列为空值的元组最后显示。

    DESC:排序列为空值的元组最先显示。

    • 单一列属性排序

    • 多列属性排序

      选择多个列属性进行排序,排序的顺序是,从左到右,依次排序。如果前面列属性有些是一样的话,再按后面的列属性排序。(前提一定要满足前面的属性排序,因为在前面的优先级高)

  • group by 的用法

    group by按照查询结果集中的某一列(或多列),进行分组,值相等的为一组。

    • 细化集函数(countsumavgmaxmin)的作用对象:

      未对查询结果分组,集函数将作用于整个查询结果。

      例子:求各个课程号及相应的选课人数:

      SELECT cno,count(sno) from sc
      

      对查询结果分组后,集函数将分别作用于每个组

      SELECT cno,count(sno) from sc group by cno
      

    • GROUP BY子句的作用对象是查询的中间结果表

      分组方法:按指定的一列或多列值分组,值相等的为一组。

      使用GROUP BY子句后,SELECT子句的列名列表中只能出现分组属性(比如:sno)和集函数(比如:count())。

      select sno,count(cno) from sc group by sno
      

    • 多个列属性进行分组

      举例:

      select cno,grade,count(cno) from sc group by cno,grade
      

    • 使用HAVING短语筛选最终输出结果

      只有满足HAVING短语指定条件的组才输出。

      HAVING短语与WHERE子句的区别:作用对象不同。

      • WHERE子句作用于基表或视图,从中选择满足条件的元组

      • HAVING短语作用于,从中选择满足条件的

      举例:

      ​ 查询选修了3门以上课程的学生学号:

      select sno from sc group by sno having count(cno)>3
      

      举例:

      ​ 查询选修了3门以上课程,且所有课程成绩都高于60分的学生学号及课程数

      select sno , count(cno)
      from sc 
      where grade > 60  
      group by sno having count(cno) > 3
      

小贴士:

  1. group by 字句也和where条件语句结合在一起使用。当结合在一起时,wheregroup by。即先对select xx from xx的记录集合用where进行筛选,然后再使用group by 对筛选后的结果进行分组 使用having字句对分组后的结果进行筛选。

  2. having只能用在group by之后,对分组后的结果进行筛选(即使用having的前提条件是分组)

  3. where后的条件表达式里不允许使用聚合函数,而having可以

  4. 当一个查询语句同时出现了where,group by,having,order by的时候,执行顺序和编写顺序是:

    ​ (1). 执行where xx对全表数据做筛选,返回第1个结果集。

    ​ (2). 针对第1个结果集使用group by分组,返回第2个结果集。

    ​ (3). 针对第2个结果集中的每1组数据执行select xx,有几组就执行几次,返回第3个结果集。

    ​ (4). 针对第3个结集执行having xx进行筛选,返回第4个结果集。

    ​ (5). 针对第4个结果集排序。

    也就是说其实where不能和聚合函数一起使用,因为select语句执行在where之后。

11. 正确使用索引可以提高查询效率,productLine列已经添加索引,如下哪些表达式会使用索引?(本题3分)

A. select * from products where productLine LIKE "%abc%"

B. select * from products where substr(productLine,2)="abc"

C. select * from products where productLine LIKE "%abc"

D. select * from products where productLine LIKE "abc%"

解析:选 D。

  • 使用索引情景
    • 字段的数值有唯一性的限制,比如用户名
    • 频繁作为 WHERE 查询条件的字段,尤其在数据表大的情况下
    • 需要经常 GROUP BYORDER BY 的列
    • UPDATEDELETEWHERE 条件列,一般也需要创建索引
    • DISTINCT 字段需要创建索引
  • 索引失效的情况
    • 索引进行了表达式计算,则会失效
    • 对索引使用函数,也会造成失效
    • WHERE 子句中,如果在 OR 前的条件列进行了索引,而在 OR 后的条件列没有进行索引,那么索引会失效
    • like 以通配符开头(%abc)会导致索引失效
    • 索引列与 NULL 或者 NOT NULL 进行判断的时候也会失效。

12. 在SQL语句中,与表达式 name NOT IN (“wh1”,“wh2”) 功能相同的表达式是(本题3分)

A. name !=“wh1” AND name != "wh2"

B. name !=“wh1” OR name != "wh2"

C. name =“wh1” AND name = "wh2"

D. name =“wh1” OR name = "wh2"

解析: 选 A.

二、 多选题

13. 下列有关于public,protected,private的描述不正确的是(本题5分)

A. 如果不加上述三个描述词,只能被同一个包内的类访问。

B. 内部类的private类成员不能被外部类访问。

C. public类成员,能够被其他所有类访问。

D. protected类成员,只能被子类访问。

E. private类成员,不能被其他类访问,包括父类和子类。

解析:B、 D、E

B. 对于外部类来说 内部类相当于它的一个属性 内部类中的private也相当于它本身的private属性 所以根据类内可见原则 内部类private是可以被外部类访问的

E. 子类对象拥有父类中的所有属性和方法,则子类当然也继承了父类的私有属性和方法。但是它不能直接访问,之所以说不能直接访问,而不是不能访问,那是因为一旦父类提供了其私有成员的公共访问方法,那么子类就可以访问其私有成员

14. 下面选项中定义正确的有(本题5分)

A. String[] strs = new String[3]{"a","b","c"}

B. String strs[] = new String[]{"a","b","c"}

C. String[] strs = {"a","b","c"}

D. String[] strs = new String{"a","b","c"}

E. String strs[] ={"a","b","c"}

解析: B、C、E

string数组的定义有三种:

String str[] = new String[10]; //创建一个长度为10的String 类型数组。 
String str[] = {"a","b"}; 
String[] str = new String[]{"a","b","c"};

15.下列选项中定义或者描述正确的有(本题5分)

A. 类可以实现多个接口,也可以继承多个父类

B. byte类型的取值范围是-128~127

C. unsigned int =1

D. char类型的长度为2 个字节

解析:B、D

A. Java中一个类可以实现多个接口,但只能继承一个类。因为Java中的多继承有可能会造成二义性。

C. Java 中没有无符号整数的数据类型

16. 关于接口和抽象类,下面选项中说法正确的有(本题6分)

A. 接口支持多继承,一个接口可以继承多个接口

B. 接口中只能有public static final常量,抽象类中既可以有常量,也可以有变量

C. 接口不能实例化,抽象类可以实例化

D.包含抽象方法的类一定是抽象类,但是抽象类不一定含有抽象方法

解析:A、B、D

接口(interface)可以说成是抽象类的一种特例,接口中的所有方法都必须是抽象的。接口中的方法定义默认为public abstract类型,接口中的成员变量类型默认为public static final。

  • 接口和抽象类共同点:

    • 都不能实例化,都位于继承树的顶端,用于被其他类实现和实现
    • 都可以包含抽象方法,实现接口或者继承抽象类的普通子类都必须重写这些抽象方法
  • 接口和抽象类不同点:

    • 接口里只含有默认方法和抽象方法;抽象类中可以含有普通方法
    • 接口不能定义静态方法;抽象类可以定义静态方法
    • 接口只能定义静态常量,不能定义普通成员变量,但接口中定义的变量只能是public static final类型,并且默认即为public static final类型;抽象类既可以定义普通成员变量,也可以定义静态成员变量
    • 接口中不含构造器;抽象类中含有构造器
    • 抽象方法可以有 public,protected,default 这些修饰符,接口默认修饰符为 public
    • 一个类可以实现多个接口,但只能继承一个抽象类

17. 下列哪些函数能保证线程将离开运行状态?(本题6分)

A. Thread.killThread()  
B. wait()
C. sleep(1000)
D. yield()
E. aLiveThread.join()
F. notify()
G. notifyAll()

解析: B、C、D、E

线程离开运行状态的方法:

  1. 调用Thread.sleep():使当前线程睡眠至少多少毫秒(尽管它可能在指定的时间之前被中断)
  2. 调用Thread.yield():不能保障太多事情,尽管通常它会让当前运行线程回到可运行性状态,使得有相同优先级的线程有机会执行
  3. 调用join()方法:保证当前线程停止执行,直到调用join方法的线程完成为止。然而,如果调用join的线程没有存活,则当前线程不需要停止
  4. 线程的run()方法完成
  5. 在对象上调用wait()方法(不是在线程上调用)
  6. 线程不能在对象上获得锁定,它正试图运行该对象的方法代码。
  7. 线程调度程序可以决定将当前运行状态移动到可运行状态,以便让另一个线程获得运行机会,而不需要任何理由。

18. 下列有关 try 语句的描述,正确的有(本题6分)

A. try-with-resources 语句中申明的实现 AutoCloseable 接口的资源可以不手动关闭

B. 在一个有多个 catchtry-catch 语句中,异常的顺序没有特殊的要求。

C. try 语句中至少有一个 catch

D. 使用 try-catch-finally 语句手动对资源关闭时,必须按照创建资源时相反的顺序进行关闭。

E. 在程序正常运行的情况下,try-catch-finally 语句最终都会执行 finally 中的内容

解析:A 、D、E

  • try-with-resources

    jdk1.7开始,Java 7增强了 try 语句的功能——它允许在 try 关键字后跟一对圆括号,圆括号可以声明,初始化一个或多个资源,此处的资源指得是那些必须在程序结束时必须关闭的资源(比如数据库连接,网络连接等),try 语句在该语句结束时自动关闭这些资源。这种称为 try-with-resources语句。
    try (SqlSession sqlSession = sqlSessionFactory.openSession()) { //...... }
    像这样的话,执行完 sqlsession 会自动关闭,不用我们在 finally 中关闭,也再也不用担心忘记关闭了。
    那么为什么这样可以自动关闭资源呢?是不是所有的资源都可以这样关闭呢?
    实际上只要这些资源实现类实现了 CloseableAutoCloseable 接口,就可以自动关闭。比如 Sqlsession 它就是 extends Closeable, Closeable extends AutoCloseable。几乎所有的资源都可以用这种方式实现自动关闭资源,比如 OutputStreamBufferedReaderPrintStreamInputStream 等,都可以。据说到目前为止,只有JavaMail Transport 对象不能利用这种方式实现自动关闭。

注意

  1. try-with-resourcesAutoCloseableclose 执行顺序 try-close-catch-finally
  2. 多资源用分号隔开,执行close的顺序为后声明的先执行;即按照创建资源时相反的顺序进行关闭
  3. 多资源 close 异常,不论前面 close 是否出现异常,后面的 close 一定会执行,异常抛出只能捕获最先执行 close 错误的异常。
  • B. 在写异常处理的时候,一定要把异常范围小的放在前面,范围大的放在后面,Exception这个异常的根类一定要放在最后一个catch里面,如果放在前面或者中间,任何异常都会和Exception匹配的,就会报已捕获到…异常的错误。故 B 错误
  • C. 在try块之后,我们可以使用 catch 块或 finally 块。

19. 下面哪些是 NIO 包特点(本题6分)

A. 文件锁定

B. 字符及编码

C. 内存映射技术

D. 阻塞I/O

解析: A、B、C

NIO 的特点:

  1. 内存映射 这个功能主要是为了提高大文件的读写速度而设计的
  2. 字符及编码
  3. 非阻塞I/O
  4. 文件锁定 文件锁的出现解决了很多Java应用程序和非Java程序之间共享文件数据的问题

20. 如下复合索引(a,b,c),实际生效的索引是?(本题5分)

A. (a)

B. (b,a)

C. (a,c,b)

D. (a,b)

解析: A、B、C、D

组合索引可以这样理解,比如(a,b,c),abc 都是排好序的,在任意一段 a 的下面 b 都是排好序的,任何一段 b 下面 c 都是排好序的;

组合索引的生效原则是 从前往后依次使用生效,如果中间某个索引没有使用,那么断点前面的索引部分起作用,断点后面的索引没有起作用;

比如:

where a=3 and b=4 and c=5 -- 这种三个索引顺序使用中间没有断点,全部发挥作用;
where a=3 and c=5  -- 这种情况下b就是断点,a发挥了效果,c没有效果
where b=3 and c=4   -- 这种情况下a就是断点,在a后面的索引都没有发挥作用,这种写法联合索引没有发挥任何效果;
where b=4 and a=3 and c=5 -- 这个跟第一个一样(原因:mysql自动优化),全部发挥作用,abc只要                  用上了就行,跟写的顺序无关
where a=3 and b>7 and c=3; -- b范围值,断点,阻塞了c的索引
     -- a用到了,b也用到了,c没有用到,这个地方b是范围值,也算断点,只不过自身用到了索引
where a>4 and b=7 and c=9; --a用到了 b没有使用,c没有使用(a用了范围所以,相当于断点,之后的                  b,c都没有用到索引)     
where a=3 order by b;    -- a用到了索引,b在结果排序中也用到了索引的效果,a下面任意一段的b是                  排好序的
where a=3 order by c;    -- a用到了索引,但是这个地方c没有发挥排序效果,因为中间断点了,使                     用explain 可以看到 filesort
where b=3 order by a;    -- b没有用到索引,排序中a也没有发挥索引效果 

三、判断题(每题2分)

21. HashMap 和 TreeMap都允许 key 或 value 的值为 null。

解析: 错误

HashMap 支持 null 键和 null 值

TreeMap 不支持 null 键,但是支持 null 值

22. Hashtable 和 ConcurrentHashMap 都不允许 key 或 value 的值为 null。

解析:正确

ConcurrentHashMap 和 Hashtable 都是支持并发的,二者规定 key,value 均不能为 null,null的话,会抛出空指针异常。

23. 程序使用 Thread.sleep(0) 语句时,可以删除该行代码,程序运行效果时一样的。

解析: 错误

执行 Thread.sleep(0) 后,当前线程不一定会被唤醒,虽然休眠了0秒,但是执行 sleep 方法后,不仅会休眠,还会让 CPU 重新分配。因此,Thread.Sleep(0) 的作用,就是“触发操作系统立刻重新进行一次 CPU竞争”。竞争的结果也许是当前线程仍然获得 CPU 控制权,也许会换成别的线程获得 CPU 控制权。这也是我们在大循环里面经常会写一句 Thread.Sleep(0) ,因为这样就给了其他线程获得 CPU 控制权的权力,这样一些功能就不会假死在那里

24. wait() 方法必须用在同步代码块或方法中。

解析: 正确

Java强制我们的wait()/notify()调用必须要在一个同步块中,就是不想让我们在不经意间出现这种 lost wake up 问题。
不仅仅是这两个方法,包括 java.util.concurrent.locks.Condition 的await()/signal()也必须要在同步块中

25. sleep 和 wait 都会释放持有的锁资源。

解析: 错误

sleep,wait 调用后都会暂停当前线程并让出 cpu 的执行时间,但不同的是 sleep 不会释放当前持有的对象的锁资源,到时间后会继续执行,而 wait 会放弃所有锁并需要 notify/notifyAll 后重新获取到对象锁资源后才能继续执行。

26. 可以通过 for 循环遍历删除集合中的元素。

解析: 错误

for循环只能用来遍历集合,不可以在遍历的同时进行修改和删除

27. 变量定义 String 1abc =“abc”,是可以编译通过的。

解析: 错误

变量的命名要求符合标识符的语法要求:
a. 变量名可以有字母、数字、_、$组成
b. 变量名不能以数字开头
c. Java中变量名的大小写是敏感的
d. 不能使用Java中的保留字作为变量名(保留字:Java中规定好的,一些有特殊含义的词)
e. 中文可以作为变量名,但不提倡使用
f. 变量的命名要见名知意,命名需要遵循驼峰命令规则(如果变量的名字由多个单词组成,除第一个单词以外,其它单词的首字母大写,其余字母小写,尽量不要用拼音来命名变量)

28. volatile 关键字可以保证变量的可见性、有序性、原子性。

解析: 错误

volatile 不能保证变量的原子性。

29. static 修饰的方法不能调用非 static 修饰的方法或变量。

解析: 正确

30. 抽象类不可以使用 final 关键字来修饰。

解析: 正确

抽象类的就是要子类继承然后实现内部方法的。但是final修饰的类是不能再被继承和修改的。所以不能用final修饰。

注意:

以上答案 仅个人意见,如果有错误,欢迎指正,谢谢。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

江七7

感谢大佬的赏赐

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

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

打赏作者

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

抵扣说明:

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

余额充值