2019年10月9日 开始面试同时整理面试题

2019-10-9:

中科软:

1、一对兔子从第三个月起每一个月生一对兔子,求24个月兔子的总数:

void Tuzi(){
        for(int i=1;i<=24;i++){
            long n=fib(i);
            //算出的是对数.要算总数的法,*2就行
            System.out.println("第"+i+"个月有兔子对数为"+n);
            }
    }
    static long fib(int x){
        if(x>2) 
            return (fib(x-1)+fib(x-2));
        else 
            return 1;
    }

2、冒泡排序:

public void bubbleSort(Integer[] arr, int n) {
        if (n <= 1) return;       //如果只有一个元素就不用排序了
 
        for (int i = 0; i < n; ++i) {
            // 提前退出冒泡循环的标志位,即一次比较中没有交换任何元素,这个数组就已经是有序的了
            boolean flag = false;
            for (int j = 0; j < n - i - 1; ++j) {        //此处你可能会疑问的j<n-i-1,因为冒泡是把每轮循环中较大的数飘到后面,
                // 数组下标又是从0开始的,i下标后面已经排序的个数就得多减1,总结就是i增多少,j的循环位置减多少
                if (arr[j] > arr[j + 1]) {        //即这两个相邻的数是逆序的,交换
                    int temp = arr[j];
                    arr[j] = arr[j + 1];
                    arr[j + 1] = temp;
                    flag = true;
                }
            }
            if (!flag) break;//没有数据交换,数组已经有序,退出排序
        }

}

泰康人寿:

依赖注入的原理:

依赖注入又称控制反转,其内涵就是,将创建某个bean的控制权力,由原来需要引用这个bean的bean转移(反转)到外部的spring IOC容器,由IOC容器统一创建,并且注入到需要引用的bean中去。其实,spring的本质是一个工厂(beanFactory)或者说bean容器,但是,我们一般都不直接用BeanFactory,而是用它的实现类ApplicationContext,这个类会自动解析我们配置的applicationContext.xml,然后根据我们配置的bean来new对象,将new好的对象放进一个Map中,键就是我们bean的id,值就是new的对象。

我们可以发现,通过spring  getBean()拿到的对象实例,都是通过读取applicationContext.xml文件,再通过反射拿到的类的实例对象。

因此,spring注入的对象必须可以实例化,也就是说,接口和抽象类是不能通过spring实现注入的,因为两者都不能实例化。

这就让人很不能理解了,因为在做spring-mybatis整合的时候,我们有一个常见的做法就是在service层通过注解注入dao层接口,在这里不是可以注入接口吗?为什么又说spring不能注入接口呢?

其实,这里注入的接口,并不是真正的接口,我们不妨吧这个注入的“接口”打印出来看看,到底是个什么东西:

1 the dao is:  org.apache.ibatis.binding.MapperProxy@33e4ae3b
2 the dao class is : class com.sun.proxy.$Proxy21

输出显示,其实注入的并不是接口,而是mybatis中的mapper对象的代理类。

什么是aop:

AOP思想就是把中间的非主流程的代码(比如:验证、事务管理、缓存、日志记录等), 横向抽取出来放在一个公共的类中, 也就是切面.可以通过Spring框架来配置该切面.

spring是什么?

Spring是一个库,它的功能是提供了一个软件框架,这个框架目的是使软件之间的逻辑更加清晰,配置更灵活,实现这个目的的手段使用AOP和IoC,而AOP和IoC是一种思想

通过类的反射能否访问私有属性和方法?

可以

servlet的生命周期?

Servlet启动时,开始加载  servlet生命周期开始。Servlet被服务器实例化后,容器运行其init方法,请求到达时运行其 service方法,service方法自动派遣运行与请求对应的doXXX方法(doGet,doPost)等,当服务器决定将实例销毁的时候(服务器关闭)调用其 destroy方法。

jsp的四大域?

page范围:只在一个页面保留数据(javax.servlet.jsp.PageContext(抽象类))

request范围:只在一个请求中保存数据(javax.servlet.httpServletRequest)

Session范围:在一次会话中保存数据,仅供单个用户使用(javax.servlet.http.HttpSession)

Application范围:在整个服务器中保存数据,全部用户共享(javax.servlet.ServletContext)

jQuery的特点?

1.JQuery是一款轻量级的js框架,JQuery核心js文件才几十kb,不会影响页面加载速度。与Extjs相比要轻便的多。

1.JQuery的选择器用起来很方便,好比说我要找到某个dom对象的相邻元素js可能要写好几行代码,而JQuery一行代码就搞定了,再比如我要将一个表格的隔行变色,JQuery也是一行代码搞定。

2.JQuery的链式操作可以把多个操作写在一行代码里。

3.JQuery还简化了js操作css的代码,并且代码的可读性也比js要强。

4.JQuery简化了AJAX操作,后台只需返回一个JSON格式的字符串就能完成与前台的通信。

4.JQuery基本兼容了现在主流的浏览器,不用再为浏览器的兼容问题而伤透脑筋。

5.JQuery有着丰富的第三方的插件,例如:树形菜单、日期控件、图片切换插件、弹出窗口等等基本前台页面上的组件都有对应插件,并且用JQuery插件做出来的效果很炫,并且可以根据自己需要去改写和封装插件,简单实用。

6.JQuery可扩展性强,JQuery提供了扩展接口:JQuery.extend(object),可以在JQuery的命名空间上增加新函数。JQuery的所有插件都是基于这个扩展接口开发的。

Redis可以存那些类型的数据?

key-velue数据结构存储

key   只能是字符串

value 有5种数据leixing、

  字符串 string

  哈希 hash

  列表 list

  集合 set

  有序集合 zset

springmvc的优点?

清晰的角色划分

强大而直接的配置方式

可适配、非侵入

可重用的业务代码

可定制的绑定(binding)和验证(validation)li

可定制的handler mapping和view resolution

灵活的model转换

可定制的本地化和主题(theme)解析

简单而强大的JSP标签库

Spring Bean的生命周期可以被限制在当前的HTTp Request或者HTTp Session。准确的说,这并非Spring MVC框架本身特性,而应归属于Spring MVC使用的WebApplicationContext容器

什么是多态?

用最简单的一句话就是:父类型的引用指向子类型的对象。用一句比较通俗的话:同一操作作用于不同的对象,可以产生不同的效果。这就是多态。

2019-10-10

合力亿捷:

多线程的创建方式?

第一种:继承Thread类:重写run()方法

第二种: 实现Runnable接口,实现run()方法

第三种:使用ExecutorService、Callable、Future实现有返回结果的多线程,

bootstrap是什么?

Bootstrap集合CSS、HTML和JavaScript,使用了最新的浏览器技术,为实现快速开发提供了一套前端工具包,包括布局、栅格、表格、按钮、表单、导航和提示等。使用Bootstrap不仅可以构建出非常优雅的前端界面,而且占用资源非常少,使用zip压缩后大小仅有10多KB。

bootstrap主要特色

移动设备优先
浏览器支持
容易上手
支持式响应式设计
开源代码
支持HTML5和CSS3
优秀的开发及维护团队
样式化的开发文档

Bootstrap构成模块

CSS样式
Bootstrap 自带以下特性:全局的 CSS 设置、定义基本的 HTML 元素样式、可扩展的 class,以及一个先进的栅格系统。
基本组件
例如,网站导航、标签页、工具条、面包屑、分页栏、提示标签、产品展示、提示信息块和进度条等。
JavaScript 插件
Bootstrap 包含了十几个自定义的 jQuery 插件,这些jQuery插件主要用来帮助开发者实现与用户交互的功能

依赖注入的理解?

对spring的理解?

list和set的区别?

List和Set是用来存放集合的接口,并且二者都继承自接口Collection。

1、 在List中的元素存放是有序的,可以存放重复的元素,检索效率较高,插入删除效率较低。 
ArrayList、LinkedList、Vector是List的两个实现类。 
ArrayList: 
底层的实现就是一个可变数组非同步实现,当数组长度不够用的时候就会重新开辟一个新的数组,然后将原来的数据拷贝到新的数组内。由于这一底层实现,所以ArrayList集合中元素存储的位置是连续的,查询起来效率比较高,插入删除效率较低。 
LinkedList: 
底层实现是双向循环链表数据结构非同步实现,数据结构如下代码

class Node 
{
  private Node privious;//引用前一个节点
  private Object value;//当前节点的value值
  private Node next;//引用下一个节点的值
}
LinkList中元素存储位置是不连续的,插入删除的执行效率高,查询效率低。 
Vector: 
Vector作为List的另外一个典型实现类,完全支持List的全部功能,Vector类也封装了一个动态的,允许在分配的Object[]数组,Vector是一个比较古老的集合,JDK1.0就已经存在,建议尽量不要使用这个集合,Vector与ArrayList的主要是区别是,Vector是线程安全的,但是性能比ArrayList要低。

2、 set没有存放顺序不能存放重复元素检索效率较低,插入删除效率较高,由于set集合储存位置是由他的HashCode码决定的,所以他的存储对象必须有equals()方法,而且set遍历只能用迭代,没有下标。 
HashSet: 
底层由哈希表(实际上是一个HashMap实例)支持,不能保证元素的顺序,元素是无序的,可以有null,但是null只能有一个,不能有重复的元素。HashSet不是同步的,需要外部保持线程之间的同步问题。 
TreeSet: 
TreeSet实现了SortedSet接口,它是一个有序的集合类,TreeSet的底层是通过TreeMap实现的。TreeSet并不是根据插入的顺序来排序,而是根据实际的值的大小来排序。TreeSet也支持两种排序方式:自然排序和自定义排序。不能放入重复元素和null。

ArrayList和linkedlist的区别?

1、ArrayList和LinkedList可想从名字分析,它们一个是Array(动态数组)的数据结构,一个是Link(链表)的数据结构,此外,它们两个都是对List接口的实现。

前者是数组队列,相当于动态数组;后者为双向链表结构,也可当作堆栈、队列、双端队列

2、当随机访问List时(get和set操作),ArrayList比LinkedList的效率更高,因为LinkedList是线性的数据存储方式,所以需要移动指针从前往后依次查找。

3、当对数据进行增加和删除的操作时(add和remove操作),LinkedList比ArrayList的效率更高,因为ArrayList是数组,所以在其中进行增删操作时,会对操作点之后所有数据的下标索引造成影响,需要进行数据的移动。

4、从利用效率来看,ArrayList自由性较低,因为它需要手动的设置固定大小的容量,但是它的使用比较方便,只需要创建,然后添加数据,通过调用下标进行使用;而LinkedList自由性较高,能够动态的随数据量的变化而变化,但是它不便于使用。

5、ArrayList主要控件开销在于需要在lList列表预留一定空间;而LinkList主要控件开销在于需要存储结点信息以及结点指针信息。

Redis可以存的数据类型?

hashmap底层原理?

简单来说,HashMap由数组+链表组成的,数组是HashMap的主体,链表则是主要为了解决哈希冲突而存在的,如果定位到的数组位置不含链表(当前entry的next指向null),那么对于查找,添加等操作很快,仅需一次寻址即可;如果定位到的数组包含链表,对于添加操作,其时间复杂度为O(n),首先遍历链表,存在即覆盖,否则新增;对于查找操作来讲,仍需遍历链表,然后通过key对象的equals方法逐一比对查找。所以,性能考虑,HashMap中的链表出现越少,性能才会越好。
 

缓存穿透和雪崩?

缓存穿透是指查询一个一定不存在的数据,由于缓存不命中,接着查询数据库也无法查询出结果,因此也不会写入到缓存中,这将会导致每个查询都会去请求数据库,造成缓存穿透;

解决方案

布隆过滤

对所有可能查询的参数以hash形式存储,在控制层先进行校验,不符合则丢弃,从而避免了对底层存储系统的查询压力;

缓存空对象

当存储层不命中后,即使返回的空对象也将其缓存起来,同时会设置一个过期时间,之后再访问这个数据将会从缓存中获取,保护了后端数据源;

但是这种方法会存在两个问题:

如果空值能够被缓存起来,这就意味着缓存需要更多的空间存储更多的键,因为这当中可能会有很多的空值的键;

即使对空值设置了过期时间,还是会存在缓存层和存储层的数据会有一段时间窗口的不一致,这对于需要保持一致性的业务会有影响。

缓存雪崩

缓存雪崩是指,由于缓存层承载着大量请求,有效的保护了存储层,但是如果缓存层由于某些原因整体不能提供服务,于是所有的请求都会达到存储层,存储层的调用量会暴增,造成存储层也会挂掉的情况。

解决方案

保证缓存层服务高可用性

即使个别节点、个别机器、甚至是机房宕掉,依然可以提供服务,比如 Redis Sentinel 和 Redis Cluster 都实现了高可用。

依赖隔离组件为后端限流并降级

在缓存失效后,通过加锁或者队列来控制读数据库写缓存的线程数量。比如对某个key只允许一个线程查询数据和写缓存,其他线程等待。

数据预热

可以通过缓存reload机制,预先去更新缓存,再即将发生大并发访问前手动触发加载缓存不同的key,设置不同的过期时间,让缓存失效的时间点尽量均匀。

缓存并发

缓存并发是指,高并发场景下同时大量查询过期的key值、最后查询数据库将缓存结果回写到缓存、造成数据库压力过大

分布式锁

在缓存更新或者过期的情况下,先获取锁,在进行更新或者从数据库中获取数据后,再释放锁,需要一定的时间等待,就可以从缓存中继续获取数据。

2019-10-13 亿维

简述面向对象编程的特征都有哪些方面?

封装:封装是保证软件部件具有优良的模块性的基础,封装的目标就是要实现软件部件的“高内聚、低耦合”,对象是封装的最基本单位。

继承:在一个已经存在的类的基础之上来进行,把这个已经存在的类所定义的内容作为自己的内容,并可以加入若干新的内容,或修改原来的方法使之更适合特殊的需要,这就是继承,提高了软件的可重用性和可扩展性。

多态:多态是同一个行为具有多个不同表现形式或形态的能力。 多态就是同一个接口,使用不同的实例而执行不同操作。

抽象:抽象就是找出一些事物的相似和共性之处,然后将这些事物归为一个类,这个类只考虑这些事物的相似和共性之处。

描述一下JVM加载class文件的原理机制?

JVM将类加载过程分为三个步骤:装载(Load),链接(Link)和初始化(Initialize)

1) 装载:查找并加载类的二进制数据;
2)链接:
验证:确保被加载类的正确性;
准备:为类的静态变量分配内存,并将其初始化为默认值;
解析:把类中的符号引用转换为直接引用;
3)初始化:为类的静态变量赋予正确的初始值;

int和Integer有什么区别?

(1)Integer是int的包装类;int是基本数据类型; 
(2)Integer变量必须实例化后才能使用;int变量不需要; 
(3)Integer实际是对象的引用,指向此new的Integer对象;int是直接存储数据值 ; 
(4)Integer的默认值是null;int的默认值是0。

String 、StringBuffer 、Stringbuilder的区别?

在这方面运行速度快慢为:StringBuilder > StringBuffer > String

在线程安全上,StringBuilder是线程不安全的,而StringBuffer是线程安全的

String:适用于少量的字符串操作的情况

StringBuilder:适用于单线程下在字符缓冲区进行大量操作的情况

StringBuffer:适用多线程下在字符缓冲区进行大量操作的情况

简述JSP和servlet的区别、共同点、应用范围?

JSP在本质上就是SERVLET,但是两者的创建方式不一样.

Servlet完全是JAVA程序代码构成,擅长于流程控制和事务处理,通过Servlet来生成动态网页很不直观.

JSP由HTML代码和JSP标签构成,可以方便地编写动态网页.
因此在实际应用中采用Servlet来控制业务流程,而采用JSP来生成动态网页.

在struts框架中,JSP位于MVC设计模式的视图层,而Servlet位于控制层.

JSP是Servlet技术的扩展,本质上就是Servlet的简易方式。

JSP编译后是“类servlet”。

Servlet和JSP最主要的不同点在于,Servlet的应用逻辑是在Java文件中,并且完全从表示层中的HTML里分离开来。而JSP是Java和HTML组合成一个扩展名为.jsp的文件。

JSP侧重于视图,Servlet主要用于控制逻辑。

简述cookie和session的作用、区别、应用范围?

Session用于保存每个用户的专用信息. 每个客户端用户访问时,服务器都为每个用户分配一个唯一的会话ID(Session ID) . 她的生存期是用户持续请求时间再加上一段时间(一般是20分钟左右).Session中的信息保存在Web服务器内容中,保存的数据量可大可小.当 Session超时或被关闭时将自动释放保存的数据信息.由于用户停止使用应用程序后它仍然在内存中保持一段时间,因此使用Session对象使保存用户数据的方法效率很低.对于小量的数据,使用Session对象保存还是一个不错的选择

Cookie 用于保存客户浏览器请求服务器页面的请求信息,程序员也可以用它存放非敏感性的用户信息,信息保存的时间可以根据需要设置.如果没有设置Cookie失效日期,它们仅保存到关闭浏览器程序为止.Cookie存储的数据量很受限制,大多数浏览器支持最大容量为4K

session的工作原理?

(1)当有Session启动时,服务器生成一个唯一值,称为Session ID(好像是通过取进程ID的方式取得的)。

(2)然后,服务器开辟一块内存,对应于该Session ID。

(3)服务器再将该Session ID写入浏览器的cookie。

(4)服务器内有一进程,监视所有Session的活动状况,如果有Session超时或是主动关闭,服务器就释放改内存块。

(5)当浏览器连入IIS时并请求的ASP内用到Session时,IIS就读浏览器Cookie中的Session ID。

(6)然后,服务检查该Session ID所对应的内存是否有效。

(7)如果有效,就读出内存中的值。

(8)如果无效,就建立新的Session。

简述过滤器和拦截器的区别和使用场景?

  1. 拦截器是基于java的反射机制的,而过滤器是基于函数回调。
  2. 拦截器不依赖与于servlet容器,过滤器依赖于servlet容器。
  3. 拦截器只能对action请求起作用,而过滤器则可以对几乎所有的请求起作用。
  4. 拦截器可以访问action上下文、值栈里的对象,而过滤器不能访问。
  5. 在action的生命周期中,拦截器可以多次被调用,而过滤器只能在容器初始化时被调用一次。
  6. 拦截器可以获取IOC容器中的各个bean,而过滤器就不行,这点很重要,在拦截器里注入一个service,可以调用业务逻辑。

使用场景:

1、日志记录:记录请求信息的日志,以便进行信息监控、信息统计、计算PV(Page View)等。

2、权限检查:如登录检测,进入处理器检测检测是否登录,如果没有直接返回到登录页面;

3、性能监控:有时候系统在某段时间莫名其妙的慢,可以通过拦截器在进入处理器之前记录开始时间,在处理完后记录结束时间,从而得到该请求的处理时间(如果有反向代理,如apache可以自动记录);

4、通用行为:读取cookie得到用户信息并将用户对象放入请求,从而方便后续流程使用,还有如提取Locale、Theme信息等,只要是多个处理器都需要的即可使用拦截器实现。

简述springMVC原理?

SpringMVC工作流程概述:

1、客户端向web服务器(如tomcat)发送一个http请求,web服务器对http请求进行解析,解析后的URL地址如果匹配了DispatcherServlet的映射路径(通过web.xml中的servlet-mapping配置),web容器就将请求交给DispatcherServlet处理。

2、DispatcherServlet接收到这个请求后,再对URL进行解析,得到请求资源标识符(URI)。然后调用相应方法得到的HandlerMapping对象,再根据URI,调用这个对象的相应方法获得Handler对象以及它对应的拦截器。(在这里只是获得了Handler对象,并不会操作它,在SpringMVC中,是通过HandlerAdapter对Handler进行调用、控制的)

3、DispatcherServlet根据得到的Handler对象,选择一个合适的HandlerAdapter,创建其实例对象,执行拦截器中的preHandler()方法。

4、在拦截器方法中,提取请求中的数据模型,填充Handler入参,所以所有准备工作都已做好,开始执行Handler(我们写的controller代码并不是能被直接执行,需要有刚才那些操作,才能转变为Handler被执行)。

5、Handler执行完毕后返回一个ModelAndView对象给DispatcherServlet。

6、这个ModleAndView只是一个逻辑视图,并不是真正的视图,DispatcherServlet通过ViewResolver视图解析器将逻辑视图转化为真正的视图(通俗理解为将视图名称补全,如加上路径前缀,加上.jsp后缀,能指向实际的视图)。

7、DispatcherServlet通过Model将ModelAndView中得到的处数据解析后用于渲染视图。将得到的最终视图通过http响应返回客户端。

列举springMVC常用注解几用途?

1、@Controller

     @Controller 用于标记在一个类上,使用它标记的类就是一个SpringMVC Controller 对象。分发处理器将会扫描使用了该注解的类的方法,并检测该方法是否使用了@RequestMapping 注解。@Controller 只是定义了一个控制器类

2、@RequestMapping

  RequestMapping是一个用来处理请求地址映射的注解,可用于类或方法上。用于类上,表示类中的所有响应请求的方法都是以该地址作为父路径。

3、@Resource和@Autowired

  @Resource和@Autowired都是做bean的注入时使用,其实@Resource并不是Spring的注解,它的包是javax.annotation.Resource,需要导入,但是Spring支持该注解的注入。

4、@PathVariable

  用于将请求URL中的模板变量映射到功能处理方法的参数上,即取出uri模板中的变量作为参数。

5、@CookieValue

  作用:用来获取Cookie中的值;

6、@RequestParam

  @RequestParam用于将请求参数区数据映射到功能处理方法的参数上

7、@SessionAttributes

  @SessionAttributes即将值放到session作用域中,写在class上面。  

  @SessionAttributes 除了可以通过属性名指定需要放到会话中的属性外(value 属性值),

还可以通过模型属性的对象类型指定哪些模型属性需要放到会话中(types 属性值)

8、@ModelAttribute

  代表的是:该Controller的所有方法在调用前,先执行此@ModelAttribute方法,可用于注解和方法参数中,可以把这个@ModelAttribute特性,应用在BaseController当中,所有的Controller继承BaseController,即可实现在调用Controller时,先执行@ModelAttribute方法。

9、@ResponseBody 

  作用: 该注解用于将Controller的方法返回的对象,通过适当的HttpMessageConverter转换为指定格式后,写入到Response对象的body数据区。

使用时机:返回的数据不是html标签的页面,而是其他某种格式的数据时(如json、xml等)使用;

简述spring事物管理?

在 Spring 中通常可以通过以下三种方式来实现对事务的管理:

  • 使用 Spring 的事务代理工厂管理事务(已过时)
  • 使用 Spring 的事务注解管理事务
  • 使用 AspectJ 的 AOP 配置管理事务

事务的四大特性:   简称ACID,这样比较容易记

  • Atomic, 原子性,指的是事务不可再分。

  • Consistency, 一致性,当事务结束后,内存中的数据与磁盘中的数据保持一致。

  • Isolation, 隔离性,多个事务之间互相隔离,互不干扰

  • Durability, 持久层,只要事务提交成功,数据永不丢失

支持两种事务操作

1.编程式事务操作

优点:全程可以细粒度地控制事务,因为是由程序员自已控制事务的开启、提交或回滚

缺点: 每个需要做事务控制的方法都需要手动编码去完成。

2.申明式事务操作

优点: 无需编写代码,只需要进行配置,把事务当做一个切面,基于AOP的动态代理来给目标添加事务。

缺点: 只能在方法层面进行事务控制。

用一条sql语句查询出每门功课都大于80分的name?

name           class        score

张三             数学     70

张三             语文     88

张三             英语     60

李四              数学    99

李四              语文    88

李四              英语    98

select name from (select name,min(score) from student group by name having min(score)>80) stu;

表中有A B C三列,用sql语句实现:当A列大于B列时,选择A列,否则选择B列,当B列大于C列时,选择B列否则选择C列?

select (case when A>B then A else B end),(case when B>C then B else C end) from table_nam

纵表转横表

传统的行列转换

select 姓名,
SUM(case 课程 when  '语文' then 分数 else 0 end) as 语文,
SUM(case 课程 when  '数学' then 分数 else 0 end) as 数学,
SUM(case 课程 when  '物理' then 分数 else 0 end) as 物理
from scores group by 姓名

pivot纵表转横表

select
    t2.姓名,
    t2.数学,
    t2.物理,
    t2.语文
from Scores as t1
pivot (sum(分数) for 课程 in(数学,语文,物理)) as t2

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值