java面试锦囊

目录

数据库MySql如何优化的?

Sql语句的优化

你使用SpringBoot的时候各种配置文件是怎么引入的

说说你做过的项目和你主要负责的模块

讲讲Redis,你在项目中有用过Redis吗?

数据库建表的时候int(1)和int(2)的区别

#和$的区别

Springmvc的执行流程

Jvm参数

反射的三种创建方式

Arraylist和linklist的区别

Arraylist一次扩容多少

Vector是如何实现的安全的

讲讲你知道哪些排序方法,并说下他们的时间复杂度

stringbuild跟stringbuffer的区别

hashmap跟hashtable区别

css类选择器

es的使用为什么要用

redis为什么要用

消息队列的用法

常见的设计模式知道几种

spring跟springcloud区别

vue的生命周期

list去重,返回去重结果

jq选择器,如何选中元素

面向对象6大原则

创建线程的三种方式

线程中常用的方法

list set map集合特性

List接口

Set接口

Map接口

Jdk8比以前有什么新特性

elasticsearch用的什么查询

Spring boot有什么注解

Hashmap+list什么时候触发红黑树

面向对象的理解

Linux常用命令

mysql和oracle的区别

Radis怎么实现数据同步

Vue怎么实现中英文切换,用什么实现

在jdbc中是使用什么实现占位符

mybaits常用注解

mysql在插入一条数据后,如何能获得到这个自增id的值呢?

索引的作用

控制反转和注入方式

linux查看日志文件

sleep和wait的区别

深拷贝和浅拷贝的区别


数据库MySql如何优化的?

为什么要优化:

数据量过大的话,读取就比较慢

优化手段:

  • 第一步是表字段的设计,考虑更优的存储计算

    1.使用8字节的主键bigint,而不是直接使用int来做主键

    2.varchar 不存的时候不占空间,存多长数据就占多少空间

    3.尽可能选择小的数据类型和指定短的长度

    4.尽可能使用 not null

    5.符合三大范式

  • 利用好MySQL自身提供的功能,如 存储引擎的选择、索引等

  • 横向扩展:MySQL读写分离

    分布分表,Mysql集群

  • SQL语句的优化(收效甚微)

Sql语句的优化

1.设置合适的字段属性 字段的长度越小,占用的内存就越小,性能就越好 2.使用JOIN语法: (1) JOIN语法分为内连接、左(外)连接、右(外)连接 (2) 优点:性能快 3.尽量少使用SELECT * (1) SELECT *会进行全表查询,消耗的性能大 4.在查找唯一一条数据的时候,使用limit 1,在查找到数据时候就会终止查找 5.、可以使用limit进行分页 6.、尽量少使用排序order by、order by desc 7.、使用索引 加快索引速度

你使用SpringBoot的时候各种配置文件是怎么引入的

如过时yml配置中的属性,@ConfigurationProperties注解设置与yml配置文件中对应的属性名,吧文件中的值通过自动注入,获取值。
配置类:我们需要进行手动创建一个类,然后在这个类中使用@Configuration注解:指定当前的类是配置类,配置类就相当于配置文件。
@Bean注解将一些类或对象交由Spring容器管理
@Value注入配置文件的属性值

说说你做过的项目和你主要负责的模块

登录 | ProcessOn

讲讲Redis,你在项目中有用过Redis吗?

Redis是一个高性能的内存数据库,以key-value方式存储数据,可以作为缓存使用。

redis基于内存,内存IO效率远远高于磁盘

redis可以支撑万级连接

缓存使用的流程

按id查询商品的过程

1) 以id为键查询Redis缓存,如果能查到就返回数据,结束

2)如果查不到,就查询数据库,数据库查到,缓存到Redis,返回数据

3)如果数据库查不到,返回null,结束

4)增删改数据库的同时,要修改缓存

数据库建表的时候int(1)和int(2)的区别

M 表示最大显示宽度,M 的值跟 int(M) 所占多少存储空间并无任何关系, int(1)、int(2) 在磁盘上都是占用 4 btyes 的存储空间

#和$的区别

#是占位符,能防止sql注入,对应的变量会自动加上''

$是拼接符,不能防sql注入,对应的变量不会加上''

Springmvc的执行流程

Jvm参数

(2条消息) 4、常用JVM参数配置_wenbaoxie的博客-CSDN博客

反射的三种创建方式

类名.class

对象名.getclass

class.forname(包名.类名)

Arraylist和linklist的区别

Arraylist 查找快增删慢 底层数据结构:数组

linklist 增删快查找快 底层数据结构:双向链表

Arraylist一次扩容多少

1.5倍

Vector是如何实现的安全的

在Vector类中的方法中加入了synchronized

讲讲你知道哪些排序方法,并说下他们的时间复杂度

1.选择排序:不稳定,时间复杂度 O(n^2)

2.插入排序:稳定,时间复杂度 O(n^2)

3.冒泡排序:稳定,时间复杂度 O(n^2)

4.堆排序:不稳定,时间复杂度 O(nlog n)

5.归并排序:稳定,时间复杂度 O(nlog n)

6.快速排序:不稳定,时间复杂度 最理想 O(nlogn) 最差时间O(n^2)

7.希尔排序:不稳定,时间复杂度 平均时间 O(nlogn) 最差时间O(n^s) 1<s<2

stringbuild跟stringbuffer的区别

stringbuild线程不安全,运行速度快

stringbuffer线程安全,运行速度相对于stringbuild慢

hashmap跟hashtable区别

用法和结构和HashMap一样

1.HashMap的性能高于Hashtable

2.Hashmap可以存null的键值对,hashtable和ConcurrentHashMap不能,

3.Hashmap没有多线程机 制,所以多线程不安全,hashtable和ConcurrentHashMap有线程锁,是线程安全的,

4.hashtable多线程下,会锁住整个code表,效率很低,ConcurrentHashMap,为了提高效率,将code表分成了十六个桶,每次锁时只会锁一个桶,提高了效率

css类选择器

.class 类选择器

#aaa id选择器

p p,a,li 元素选择器

[name="aaa"] 属性选择器

h1 span 派生选择器

es的使用为什么要用

对于负责的搜索业务和大的数据量时,传统的搜索就力不从心了

Elasticsearch

  • 分布式,无需人工搭建集群

  • Restful风格,一切API都遵循Rest原则,容易上手

  • 近实时搜索,数据更新在Elasticsearch中几乎是完全同步的

  • 倒排索引通过value找到key,对内容进行分词,生成倒排索引

redis为什么要用

1)缓存击穿

高并发的情况下,短时间内缓存会被穿过,请求直接打到数据库上,可能导致数据库压力过大。

解决方案:对代码上锁(双重检查锁)

2)缓存穿透

高并发的情况下,如果查询不存在的数据,因为缓存和数据库都不存在,请求都会打到数据库上,可能导致系统崩溃。

解决方案:

1) 保存不存在的数据到缓存中,设置一定过期时间

2) 布隆过滤器(直接过滤掉不存在数据的请求) 不能准确判断是否存在数据,能准确判断数据不存在

3)缓存雪崩

高并发的情况下,缓存服务器重启或热点数据同时过期,全部访问数据库,导致数据库宕机

解决方案:

1)配置缓存集群

2)尽量给热点数据设置不一样的过期时间,相对均匀

消息队列的用法

作用是采用FIFO(先入先出)的方式实现程序之间(服务、进程、线程)的消息通信

MQ的优点有: 1)解耦

服务之间进行解耦,A服务调用B服务时,需要编写相关的代码,调用情况发生改变时,需要修改调用的代码

2)异步

传统的同步调用方式,需要等待调用完成,才能进行其它业务

异步调用方法,将消息发送到队列中,就可以返回,执行其它业务,速度大大提升

3)削峰

出现流量激增的情况时,消息队列可以设置消息的最大数量,处理一部分消息,其它消息交给队列排队处理

MQ的缺点:

  1. 增加了系统的复杂性

  2. 降低了系统的可用性(消息队列出现问题,整个系统的通信受影响)

常见的设计模式知道几种

装饰者设计模式

开闭原则:程序开发过程中,对功能的扩展开放,对功能的修改关闭,提高程序的稳定性

目的:在不修改原有类的代码基础上,对类的功能进行扩展

在Java的IO包下,大量应用了装饰者模式

实现

    1.装饰者和被装饰者都要实现相同的接口或继承相同的父类
​
    2.装饰者中定义一个被装饰者的对象
​
    3.给装饰者传入被装饰者对象
​
    4.调用装饰者的方法时,也调用被装饰者的方法,同时进行功能的扩展

单例设计模式

目的:保证一个类只有一个实例(对象)

应用场景:

对于某些大的对象,单例模式能节省系统资源
​
应用某些特定业务需求,如:保证公司只有一个CEO

实现 PS : Runtime类就是单例模式的

将所有构造方法定义为private
​
在类中创建一个静态的对象
​
在类中定义一个静态方法来返回该对象

两种单例模式

饿汉式:类中一开始就创建对象,不管后面是否使用对象,都消耗了内存。

懒汉式:类中一开始不创建对象,调用返回对象方法时再创建对象。

代理模式

代理模式给某一个对象提供一个代理对象,并由代理对象控制对原对象的引用。

代理模式的作用

代理模式的作用

1)中介的作用,当调用者不能或不方便调用某个对象时,代理起到中介的作用,帮助调用者间接

的调用对象。

2)符合开闭原则,在不修改原有类代码的前提下,对类的功能进行增强。

代理模式的分类

代理模式分为两种:

1) 静态代理,在运行前,通过编写代码的方式生成代理类

2) 动态代理,在运行后,通过反射机制生成代理类

静态代理

1)代理者和被代理者都实现相同的接口

2)代理者包含被代理者的对象

3)创建代理对象时传入被代理对象

4)代理者执行方法时,会调用被代理者的方法,同时扩展新的功能

静态代理的问题:一个代理类只能代理一种业务,如果有多种业务,就必须创建大量的代理类。

动态代理

和静态代理不同,动态代理是在运行时,通过反射机制动态生成代理类。开发者不需要手动编写新

的代理类。

动态代理分类

JDK动态代理

JDK自带的,前提是:被代理类必须实现过接口。

实现步骤

1) 实现InvocationHandler接口

2)实现invoke方法

3)通过Proxy.newProxyInstance方法返回代理对象

CGLib动态代理

需要引入CGLib依赖,它的原理是:通过反射+继承机制动态生成被代理类的子类,所以被代理类

不能是final的。

实现步骤

1)引入cglib

2)实现MethodInterceptor接口

3)实现intercept方法

4)通过Ehancer返回代理对象

spring跟springcloud区别

1、SpringBoot只是一个快速开发框架,使用注解简化了xml配置,内置了Servlet容器,以Java应用程序进行执行。

2、SpringCloud是一系列框架的集合,可以包含SpringBoot。

vue的生命周期

Vue 的生命周期总共分为8个阶段:创建前/后,载入前/后,更新前/后,销毁前/后。

1、beforeCreate(创建前)

表示实例完全被创建出来之前,vue 实例的挂载元素$el和数据对象 data 都为 undefined,还未初

始化。

2、created(创建后)

数据对象 data 已存在,可以调用 methods 中的方法,操作 data 中的数据,但 dom 未生成,$el

未存在 。

3、beforeMount(挂载前)

vue 实例的 $el 和 data 都已初始化,挂载之前为虚拟的 dom节点,模板已经在内存中编辑完成

了,但是尚未把模板渲染到页面中。data.message 未替换。

4、mounted(挂载后)

vue 实例挂载完成,data.message 成功渲染。内存中的模板,已经真实的挂载到了页面中,用户

已经可以看到渲染好的页面了。实例创建期间的最后一个生命周期函数,当执行完 mounted 就表

示,实例已经被完全创建好了,DOM 渲染在 mounted 中就已经完成了。

5、beforeUpdate(更新前)

当 data 变化时,会触发beforeUpdate方法 。data 数据尚未和最新的数据保持同步。

6、updated(更新后)

当 data 变化时,会触发 updated 方法。页面和 data 数据已经保持同步了。

7、beforeDestory(销毁前)

组件销毁之前调用 ,在这一步,实例仍然完全可用。

8、destoryed(销毁后)

组件销毁之后调用,对 data 的改变不会再触发周期函数,vue 实例已解除事件监听和 dom绑定,

但 dom 结构依然存在。

list去重,返回去重结果

List去重的五种方法 - 抟鹏 - 博客园

jq选择器,如何选中元素

JQuery特有的过滤选择器

1) 基本过滤选择器 2)内容过滤选择器 3)可见过滤选择器 4) 属性过滤选择器

5) 子标签过滤选择器 6) 表单属性过滤选择器 7) 表单元素过滤选择器

面向对象6大原则

1.单一责任原则SRP(Single Responsibility Principle):

一个类只有一个引起变化的原因。

一个类只有一个独立责任,不负责其他职责

2.开放封闭原则OCP(Open Closed Principle):

软件实体对扩展开放,对修改封闭。

对功能扩展开放,对功能修改封闭。

3.里氏替换原则LSP(Liskov Substitution Principle):

子类的实例能够替换其父类的实例。

子类尽量不重写父类,尽量用扩展。

4.依赖倒置原则DIP(Dependency Inversion Principle):

依赖抽象不要依赖具体实现。

设计的类依赖接口

5.接口分离原则ISP(Interface Segregation Principle):

使用多个专门的接口比使用单一的总接口要好。一个类对另一个的依赖性建立在最小的接口上。

6.迪米特法则LoD(Law of Demeter):也称为最少知识原则LKP(Least Knowledge Principle)

一个对象应该对其他对象有最少的了解。

设计类的时候用用别人越少,用别人越简单越好

创建线程的三种方式

继承Thread类

1.继承Thread类 2.重写run方法 3.调用start启动线程

实现Runnable接口

1.实现Runnable接口 2.实现run方法

3.创建实现Runnable接口的对象,传入Thread对象中 4.启动线程

实现Callable接口

1.实现Callable接口,实现call方法 2.创建Callable对象,传入FutureTask对象

3.创建FutureTask对象,传入Thread对象 4.启动线程

5.调用get方法得到返回结果

线程中常用的方法

方法介绍
start()启动
stop()停止(禁用,可能导致线程死锁等问题),停止线程可以让run执行结束
String getName()获得线程的名字
setName(String)设置线程名字
sleep(long)进入睡眠,毫秒
setPriority(int)设置线程的优先级(1~10从低到高)越高抢CPU几率更高
setDaemon(boolean)设置为后台线程 true ,后台线程是为其它线程服务的,如果没有其它线程存在,就自动死亡;使用案例:GC就是一种后台线程
join()线程的加入(合并)让其它线程先执行完,再执行自己的指令

list set map集合特性

List接口

继承了Collection接口

List集合的特点:

  • 可以添加重复的数据

  • 数据可以通过下标单独访问

  • 数据可以排序

Set接口

继承了Collection接口

Set集合的特点:

  • 不能添加重复的数据

  • 数据不能单独访问

Map接口

Map集合的特点:

  • 数据以键值对保存

  • 键不能重复

  • 数据可以通过键访问

Jdk8比以前有什么新特性

函数式接口,Lambda表达式,方法引用,Stream接口, Optional类等。

elasticsearch用的什么查询

ElasticSearch常用的几种查询方式,terms 查询是term的扩展,可以支持多个vlaue匹配,只需要一个匹配就可以了。

1 term查询(精准查询)

term是ES中的精准查询,不会参与ES分词查询。

2 math查询(分词匹配查询)

match查询是按ES分词的倒排表进行查询,而keyword不会被分词,match的需要跟keyword的完全匹配可以。可以用于一般性的匹配查询。

3 fuzzy查询(模糊查询)

fuzzy查询可以用于纠正去拼写的问题,fuzziness是可以允许纠正错误拼写的个数

4 wildcard(通配符查询)

通配符查询允许我们指定一个模式来匹配,而不需要指定完整的trem,匹配的方式类似于match的

分词匹配查询。

?将会匹配如何字符;*将会匹配零个或者多个字符。

5 bool查询(布尔查询)

bool查询本身没有查询功能,而是基于逻辑值使用前面几种查询方式进行组合查询

Spring boot有什么注解

@SpringBootApplication:包含了@ComponentScan、@Configuration和@EnableAutoConfiguration注解。其中@ComponentScan让spring Boot扫描到Configuration类并把它加入到程序上下文。

@Configuration 等同于spring的XML配置文件;使用Java代码可以检查类型安全。

@EnableAutoConfiguration 自动配置。

@ComponentScan 组件扫描,可自动发现和装配一些Bean。

@Component可配合CommandLineRunner使用,在程序启动后执行一些基础任务。

@RestController注解是@Controller和@ResponseBody的合集,表示这是个控制器bean,并且是将函数的返回值直 接填入HTTP响应体中,是REST风格的控制器。

@Autowired自动导入。

@PathVariable获取参数。

@JsonBackReference解决嵌套外链问题。

@RepositoryRestResourcepublic配合spring-boot-starter-data-rest使用。

Hashmap+list什么时候触发红黑树

满足:链表长度到8,并且数组长度到64

判断链表长度到达8,调用treeifyBin()方法

用treeifyBin()的方法,先判断数组长度是否小于64,小于则进行扩容;否则,转红黑树。

面向对象的理解

面试对象是一种思想,万物皆可为对象.

封装(Encapsulation):将对象的实现细节隐藏起来,然后通过一些公用方法来暴露该对象的功能。

继承(Inheritance):是面向对象实现软件复用的重要手段,当子类继承父类后,子类作为一种特殊的父类,将直接获得父类的属性和方法。

多态(Polymorphism):子类对象可以直接付给父类变量,但运行时依然表现出子类的行为特征,即同一个类型的对象在执行同一个方法时,可能表现出多种行为特征。

Linux常用命令

切换目录 cd 目录名 查看目录 ls 目录名(不写就是查看当前目录) -l 详细列表 -a 所有文件 查看目录详情 ll 目录名

创建目录 mkdir 目录名 删除目录 rm 目录名 -r 遍历所有子目录 -f 强制删除

创建\打开文件 vi 文件名 三种模式: 命令模式 能删除、复制、粘贴,无法编辑 输入模式 编辑内容 命令行模式 退出、保存文件 操作方式:默认进入命令模式,按i进入输入模式,按esc回到命令模式,按:进入命令行模式 命令模式 x 删除一个字符 dd 删除一行 yy 复制一行 p 粘贴 u 撤销 命令行模式 wq 保存退出 q 退出 (如果有修改,此方式退出会出错) q! 强制退出

cat 显示整个文件内容(不支持分页) more 分页显示(只能向前分页查询) less 分页显示,功能比more强大。(支持前后分页查询) 支持文本查找,/查找内容 向下查询 ; ?查找内容 向上查找内容 退出less模式,点击q

对比vi命令:cat、more、less仅仅是用来进行文本阅读命令,vi用来进行文本编辑的命令。
​
查询当前文件中是否包含有java单词,如果包含有Java单词的所有行全部显示出来。
cat 文件名 | grep 查询文字

find 查找目录 -name 文件名称 find 查找目录 | grep 名称

which 命令名称

移动文件 mv 原文件 目标文件 复制文件 cp 原文件 目标文件

解压指令:tar -zxvf 压缩指令:tar -zcvf -z:表示压缩和解压缩的格式为gz压缩文件(gzip) -c::表示压缩 -x:表示解压缩 -v:表示显示压缩或者解压缩的详细过程。 -f:表示指定压缩或者解压缩的文件,只能放在命令的最后 tar -zcvf demo.tar.gz demo2.txt tar -cvf 压缩后的文件名称 待压缩的文件 tar -xvf 待解压的解压包名

通过端口查看进程:netstat –apn | grep 8080 通过端口查看进程:lsof -i:3306 通过进程名称查询进程:ps -ef | grep redis 杀死进程:kill -9 PID(进程ID,-9表示强制杀死)

mysql和oracle的区别

MySQL和Oracle的区别_MengJing_的博客-CSDN博客_mysql和oracle区别

Radis怎么实现数据同步

Vue怎么实现中英文切换,用什么实现

Vue怎么实现中英文切换,用什么实现

一、安装 vue-i18n插件

二、main.js文件的配置

三、定义两套中英文的 js 文件,并通过 require 的形式引入到 main.js。 在 main.js 中的代码中,可以看到,当 locale 的值为‘zh-CN’时,版本为中文;当 locale 的值为‘en-

US’,版本为英文。当然你也可以换成 zh 和 en,这个自定义就好,对应上就可以。 四、绑定点击事件,来修改 locale 的值去调用对应的语言包实现语种切换。

五、vue-i18n 数据渲染的模板语法

我们知道 vue 中对于文字数据的渲染,有以‘’{{}}‘’或者 v-text、v-html等的形式,同样的使用国际化

后,依旧可以沿用,但需要一点修改。

在jdbc中是使用什么实现占位符

对比 Statement 接口, PreparedStatement 接口的优点:   1.使用该接口操作的 sql 语句会先预先编译成指令在发送给数据库, 数据库就执行指令即可, 这样就提高了一定速度,   2.该接口可以避开 sql 需要使用字符串拼接的方式, 从而解决 sql 注入的安全风险,   而是使用占位符 (?) 来代替原来的字符串拼接.

mybaits常用注解

@Insert : 实现新增 @Update: 实现更新 @Delete:实现删除 @Select:实现查询 @Result: 实现结果集封装 @Results: 可以与@Result 一起使用,封装多个结果集 @ResultMap: 实现引用@Results 定义的封装 @One: 实现一对一结果集封装 @Many: 实现一对多结果集封装

@CacheNamespace: 实现注解二级缓存的使用 复杂关系映射的注解说明 @Results 注解 代替的是标签<resultMap> @Resutl 注解 代替了 <id> 标签和<result> 标签 @One 注解(一对一) 代替了<assocation> 标签,是多表查询的关键,在注解中用来指定子查询返回单一对象 @Many 注解(多对一) 代替了<assocation> 标签,是多表查询的关键,在注解中用来指定子查询返回单一对象

mysql在插入一条数据后,如何能获得到这个自增id的值呢?

使用select last_insert_id() 可以取到最后生成的主键。

索引的作用

加快查询速度,用户查询时,先找索引,通过索引找到实际数据的位置,再直接定位到实际数据上,极大提高查询速度

缺点: 1. 也是数据,需要占存储空间 \2. 降低增删改的速度 \3. 创建索引也需要一定的时间

控制反转和注入方式

控制反转

控制是什么?JavaBean(Java对象)的创建和管理

反转是什么?一般情况下对象的创建和管理由开发者控制,反转是把对象的创建和管理交给容器完成,然后再交给开发者。

IOC的主要作用是:解耦。

没有IOC的程序中,我们使用new来完成对象的创建,如果需要的对象的类型发生改变,就需要手动修改代码。

有了IOC后,对象的创建由第三方(Spring容器)完成,由Spring来管理应用中所有对象的生命周期,开发者只需要关注自己的业务逻辑,代码更利于扩展和维护。

注入方式

\1) set方法注入,就是上面通过property进行配置

\2) 构造方法注入

\3) 自动装配

可以通过bean的autowire属性配置 类型:

- no 默认,不自动装配

- byType 通过类型查找对象,如果相同类型的对象有多个,会出现异常

- byName 通过名称查找对象,如果找不到对应的id或name的对象,会出现空指针异常

- constructor 通过构造方法装配

linux查看日志文件

tail

这个是我最常用的一种查看方式

命令格式: tail必要参数[文件] -f 循环读取 -q 不显示处理信息 -v 显示详细的处理信息 -c<数目> 显示的字节数 -n<行数> 显示行数 -q, --quiet, --silent 从不输出给出文件名的首部 -s, --sleep-interval=S 与-f合用,表示在每次反复的间隔休眠S秒

用法如下:

tail -n 10 test.log 查询日志尾部最后10行的日志; tail -n +10 test.log 查询10行之后的所有日志; tail -fn 10 test.log 循环实时查看最后1000行记录(最常用的)

一般还会配合着grep用,例如 :

tail -fn 1000 test.log | grep '关键字'

如果一次性查询的数据量太大,可以进行翻页查看,例如:

tail -n 4700 aa.log |more -1000 可以进行多屏显示(ctrl + f 或者 空格键可以快捷键)

sleep和wait的区别

  1. 调用对象不同

    wait() 由锁对象调用

    sleep() 由线程调用

  2. 锁使用不同

    执行wait后,自动释放锁

    执行sleep后,不会释放锁

  3. 唤醒机制不同

    执行wait后,可以被通知唤醒

    执行sleep后,只能等待时间结束后,自动唤醒

深拷贝和浅拷贝的区别

1、浅拷贝:将原对象或原数组的引用直接赋给新对象,新数组,新对象数组只是原对象的一个引

用。

2、深拷贝:创建一个新的对象和数组,将原对象的各项属性的“值”(数组的所有元素)拷贝过

来,是“值”而不是“引用”。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值