Java基础面试题(整理)

文章目录

1.什么是Java

Java是一门面向对象编程语言,不仅吸收了C++语言的各种优点,还摒弃了C++里难以理解的多继承、指针等概念,因此Java语言具有功能强大和简单易用两个特征。Java语言作为静态面向对象编程语言的代表,极好地实现了面向对象理论,允许程序员以优雅的思维方式进行复杂的编程

2.Java语言1.8的新特性

  • lambda表达式:lambda允许把函数作为一个方法的参数
  • 方法引用:方法引用提供了非常有用的语法,可以直接引用已有Java类或对象(实例)的方法或构造器。与lambda联合使用,方法引用可以使语言的构造更紧凑简洁,减少冗余代码
  • 默认方法:默认方法就是在接口内有了一个默认的实现
  • 新工具:新的编译工具,如:jjs,jdeps
  • Stream API:把真正的函数式编程风格引入到java中
  • Data Time API:加强对日期与时间的处理
  • Optional类:Optional类已成为Java8类库的一部分,用来解决空指针异常
  • Nashorn JavaScript引擎:允许在JVM上运行JavaScript

3.Java与其它语言对比

  • Java与C:
    • Java面向对象,C面向过程
    • Java跨平台,C需要重新编译
    • Java没有指针,无法高效运算
    • Java能自动回收垃圾
    • Java无法直接管理内存
    • Java没有预处理器
  • Java与C++:
    • Java采用值传递
    • Java不能多继承
    • Java无法重载运算符
  • Java与PHP:
    • Java是静态语言,PHP是动态语言
    • Java支持多线程,PHP不支持

4.说说你对J2EE的理解

J2EE是一个标准,一个为企业分布式应用的开发提供的标准平台

5.一个".java"源文件中是否可以包含多个类(不是内部类),有什么限制

可以包含多个类,但是只能有一个public修饰的类,并且类名要与文件名一致

6.java有没有goto

goto是Java中的保留字,目前还没有在Java中使用

7.比较一下Java和JavaScript

是俩个公司开发的俩种不同的语言:
- Java是面向对象的语言,JavaScript是基于对象的语言
- Java的源代码在运行前必须经过编译,JavaScript的源代码不需要编译,由浏览器解释执行
- Java采用强类型变量检查,即所有变量在编译前必须作声明,JavaScript采用弱类型变量检查,即变量在使用前不需作声明,而是解释器在运行时检查其数据类型

8.int和Integer有什么区别,为什么要使用Integer

Integer是int的封装类,Java是一个近乎纯洁的面向对象编程语言,但是为了编程的方便还是引入了不是对象的基本数据类型,但是为了能够将这些基本数据类型当成对象操作,Java为没一个基本数据类型都引入了对应的封装类型,Integer就是int的封装类

9.说说&和&&的区别

&和&&都可以作逻辑与的运算符,即当运算符俩边都为true那么结果也为true,如果有一方为false则结果为false,但是&&也被称为短路运算符,使用&&的话如果运算符左边的值为false那么右边就会被短路掉,不会被执行

10.在java中如何跳出当前的多重嵌套循环

在最外层循环语句前定义一个标号,然后在循环体的代码中使用带有标号的break语句就可以跳出最外层循环

11."=="和equals()方法的区别

  • equals()是方法,"=="是运算符
  • equals()的底层就是使用"=="实现的,如果不重写equals(),使用它们得到的结果是一样的
  • 如果是基本数据类型,"=="比较的是数值是否相等,如果是引用数据类型,则比较的是对象的地址值是否相等
  • equals()不能用于基本数据比较,如果重写了对象的equals()和hashCode()方法则比较对象的值

12.静态变量和实例变量的区别

  • 静态变量就是static修饰的变量,属于类,不属于某一个实例,不需要创建实例对象就可以通过类直接调用
  • 实例变量是没有static修饰的变量,只有在实例对象创建的时候才能被调用

13.请说出public、private、protected、以及不写时的区别

修饰符当前类同包子类其他包
publicVVVV
protectedVVVX
defaultVVXX
privateVXXX

14.String和StringBuffer、StringBuilder的区别

  • 可变不可变:
    • String:String使用字符数组保存字符串,因为被final修饰,所有String对象是不可变的
    • StringBuffer、StringBuilder :都继承自AbstractStringBuilder,在AbstractStringBuilder中也是使用字符数组来保存字符串的,但是没有被final修饰,所以是可变的
  • 是否线程安全:
    • String中的对象被final修饰,可以被理解为常量,是线程安全的
    • StringBuffer对方法加了同步锁,是线程安全的
    • StringBuilder没有对方法加同步锁,是线程不安全的

15.面向对象的特征有哪些方面

  • 封装:封装,也就是把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏
  • 继承:从已有类得到继承信息创建新类的过程,提供继承信息的类被称为父类,得到继承信息的类被称为子类,子类可以使用父类的所有对子类可见的功能,并且可以在不改变父类的情况下对这些功能进行扩展
  • 多态:指允许不同类的对象对同一消息作出不同响应,多态的必要条件:继承、重写、父类引用指向子类对象

16.什么是OOP,OOP相对于面向过程编程有哪些优点

OOP:Object-Oriented Programming,面向对象编程

  • OOP关注对象和角色,也就是事物的本质
    • OOP把客观世界中的对象抽象成对应的类
    • 通过类构造实例
    • 通过依赖,继承,实现等形式建立对象间的依赖关系
  • OOP易于扩展,增加或改变业务的功能,无需大幅度改动改变源代码
  • OOP易于建模,OOP就是软件架构师在计算机高级语言中对客观世界的抽象和再现,人们可以很好地理解和建立起计算机中的抽象模型

17.Java中实现多态的机制是什么

靠的是父类或接口定义的引用变量可以指向子类或具体实现类的实例对象,而程序调用的方法在运行期才动态绑定,就是引用变量指向是实例变量的方法,调用该引用的方法时,不是根据引用变量中定义的方法执行,而是根据具体的实例的方法

18.Overload和Override的区别,Overload的方法是否可以改变返回值的类型?

  • Overload是重载,表示在同一个类中可以有多个名称相同的方法,但这些方法的参数列表各不相同。
  • Override是重写,表示子类中的方法可以与父类中的某个方法名称或者参数完全相同,通过子类创建的实例对象调用这个方法时,将调用子类中定义的方法,覆盖父类中相同的方法,这也是面向对象编程中多态的一种表现
  • Overload只要参数列表各不相同,返回值可以任意改变

19.构造器是否可被重写

构造器不能被继承,所以不能重写,但是可以重载

20.接口和抽象类有什么区别

比较抽象类接口
默认的方法实现抽象类中可以有默认的方法实现Java8之前,接口中不存在默认的方法实现
实现方式抽象类使用extends关键字来继承抽象类,如果子类不是抽象类,它需要提供抽象类中所有声明方法的实现接口使用implements来实现接口,需要提供接口中所有声明的实现
构造器抽象类中可以有构造器接口中不能有个构造器
与正常Java类的区别除了不能实例化,它和普通Java类没有任何区别接口是完全不同的类型
访问修饰符抽象方法可以有public、protected、default这些修饰符接口默认是public,不能使用其他修饰符
main方法抽象类可以有main方法并且我们可以运行它java8之前接口没有main方法,因此不能运行它,Java8后可以
多继承一个类只可以继承一个抽象类一个类可以实现多个接口
速度它比接口速度要快接口速度要慢,因为它需要时间去寻找在类中实现的方法
添加新方法向抽象类中添加新方法,可以给它提供默认的实现,因此可以不修改子类现有的代码如果往接口中添加新方法,则子类中需要实现该方法

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

传送门.

22.char型变量中能不能存储一个中文汉字,为什么

可以存储一个中文汉字,因为Java使用的编码是Unicode,一个char类型占俩个字节,所以放一个中文是没问题的

23.什么是内部类,静态内部类和普通内部类有什么区别

内部类就是在一个类的内部定义的类,普通内部类中不能定义静态成员,普通内部类可以直接访问外部类的成员变量,普通类内部类可以定义在外部类的方法外面,也可以定义在外部类的方法体中。
在方法外部定义的类加上static关键字就成了静态内部类,它不再具有普通内部列的特征,所以,从狭义上讲,他不是内部类,只是在编程引用是的语法上有一些差别,它可以定义成任意修饰符类型,而普通类只能定义成public和默认的这俩种类型,在外面引用静态内部类的名称为"外部类名.内部类名"。在外面不需要创建外部类的实例对象就可以直接创建静态内部类。由于静态内部类不依赖于外部类的实例对象,所以,静态内部类能访问外部类的非静态成员变量。当在外部类访问静态内部类时,可以直接使用静态内部类的名字,而不需要加上外部类的名字,在静态内部类中也可以直接引用外部静态类的static的成员变量,不需要加上外部类的名字,在静态方法中定义的内部类也是静态内部类,这时候不能再类面前加static关键字,静态方法中的静态内部类可以直接访问外部类中的static的成员变量,还可以访问静态方法中的局部变量,但是,该局部变量前必须加final修饰符。

24.Java会存在内存泄漏吗,请简单描述

理论上Java因为有垃圾回收机制不会存在内存泄漏问题;然而在实际开发中,可能会存在无用但可达的对象,这些对象不能被GC回收就会发生内存泄漏

25.抽象方法是否可以同时是静态的,是否可以同时是本地方法,是否可以同时被synchronized修饰

都不能,抽象方法需要被子类重写,但是静态方法时无法被重写的,因此二者是矛盾的,本地方法是有本地代码实现的方法,而抽象方法时没有实现的,也是矛盾的,synchronized和方法的实现细节有关,抽象方法不涉及实现细节,因此也是相互矛盾的

26.如何实现对象克隆

  • 实现Cloneable接口并且重写Object类中的clone()方法
  • 实现Serializable接口,通过对象的序列化和反序列化实现克隆

27 String是Java的基本数据类型吗,Java的基本数据类型有哪些,它们占多少个字节大小

String不是Java的基本数据类型,Java的基本数据类型有:byte、short、int、long、double、float、char、boolean,分别占1、2、4、8、8、4、2、1个字节

28.final、finally、finalize的区别

  • final用于声明属性、方法和类,分别表示属性不可变、方法不可重写、类不可继承
  • finally是异常处理语句结构的一部分,表示宗师执行
  • finalize是Object类的一个方法,在垃圾收集器执行的时候会调用被回收对象的此方法

29.Java异常分为哪些种类,如何处理它们

Java的异常分为俩类:

  • Error:就是指在程序运行过程中发生非常严重的错误,导致程序无法继续正常运行,甚至崩溃或宕机,这种错误不是不可以恢复,但恢复需要很大 代价(比较重启系统,重启服务器) 。
  • Exception:就是指在程序运行过程中发生不正常的情况,程序可以继续运行,程序本身也可以处理这种异常。
    • 运行时异常:是RunTimeException类及其子类异常,这些异常是不检查异常,程序可以选择捕获处理也可以不处理, 这些异常一般是由程序逻辑错误引起的,程序应该从逻辑角度尽可能避免这类异常的发生。
    • 非运行时异常:RuntimeException以外的异常,类型上都属于Exception类及其子类。从程序语法角度讲是必须进行处理的异常,如果不处理,程序就不能编译通过。
    • 异常的处理:可以通过try捕获catch掉,也可以throw抛出

30.error和exception有什么区别

error表示恢复不是不可能但是很困难的情况下的一种严重问题,比如说内存溢出,不可能指望程序能处理这样的情况。
exception表示一种设计或实现问题,也就是说,它表示如果程序运行正常,从来不会发生的情况

31.Java中的异常处理机制的简单原理和应用

异常是指java程序运行时所发生的非正常情况和错误,与现实生活中的事件很相似,现实生活中的时间可以包含事件发生的时间、地点、人物、情节等信息,可以用一个对象来表示,Java使用面向对对象的方式来处理异常,它把程序中发生的每个异常也都分别封装到一个对象来表示,该对象包含有异常的信息。Java对异常进行了分类,不同类型的异常分别用不同的Java类表示,所有异常的根类为java.lang.Throwable,Throwable下面又派生了俩个子类:Error和Exception,Error表示应用程序本身无法克服和恢复的一种非严重问题,程序只有死了的份。Exception表示程序还能够克服和恢复的问题。

32.sleep()和wait()有什么区别

sleep()是Thread类的方法,让正在执行的线程主动让出cpu,cpu去执行其他线程,但是不会释放锁,即使当前线程使用sleep方法让出来cpu,但其它被同步锁挡住了的线程也无法得到执行。
wait()是Object类的方法,对此对象调用wait方法可以让出同步锁,其它等待此锁的线程可以得到同步锁并运行

33.同步和异步有何异同,在什么情况下使用它们

如果数据在线程间共享,例如正在写的数据以后可能被另一个线程读到,或者正在读的数据可能已经被另一个线程写过了,那么这些数据就是共享数据,必须进行同步存取。
当应用程序在对象上调用了一个需要花费很长时间来执行的方法,并且不希望让程序等待方法的返回时,就应该使用异步编程。

34.启动一个线程是用run()还是start(),线程的生命周期是什么

启动一个线程是调用start()方法,是线程进入就绪状态,以后可以被cpu钓鱼为运行状态,一个线程必须关联一些具体的执行代码,run()方法是该线程所关联的执行代码。
线程的生命周期:新建、等待、就绪、运行、阻塞、销毁

35.当一个线程进程进入一个对象的一个synchronized方法后,其他线程是否可以进入此对象的其他方法

  • 其他方法是否加了synchronized关键字,如果没加,则能
  • 如果这个方法内部调用了wait,则可以进入其他synchronized方法
  • 如果其他方法也被static关键字修饰,那么这些方法使用的同步锁(或者可以叫做监视器)是当前对象“类锁“,而不是当前“对象锁”(“对象”是“类”的具体实),所以用的是两个锁,就不能同步。

36.线程的基本概念,如何实现一个线程,什么是多线程,为什么要使用多线程

基本概念:一个线程是进程的一个顺序执行流。同类的多个线程共享一块内存空间和一组系统资源,线程本身有一个供程序执行时的堆栈。线程在切换时负荷小,因此,线程也被称为轻负荷进程。一个进程中可以包含多个线程。
多线程指的是在单个程序中可以同时运行多个不同的线程,执行不同的任务。
多线程的优点:

  • 更高的运行效率;
  • 多线程是模块化的编程模式;
  • 与进程相比,线程的创建和切换开销更小;
  • 通信方便;
  • 能简化程序的结构,便于理解和维护;更高的资源利用率;

37.什么是线程池,有哪几种

线程池顾名思义就是事先创建若干个可执行的线程放入一个池(容器)中,需要的时候从池中获取线程不需要自行创建,使用完毕不需要销毁线程而是放回池中,从而减少创建和销毁线程对象的开销。
Java通过Executors提供四种线程池:

  • FixedThreadPool:这是一个线程数固定的线程池,当这个线程池被创建的时候,池里的线程数就已近固定了。
  • SingleThreadExecutor:这是一个线程数为1的线程池,所有提交的这个线程池的任务都会按照提交的先后顺序排队执行。
  • CacheThreadPool:每次有任务提交到线程池的时候,如果池中没有空闲的线程,线程池就会为这个任务创建一个线程,如果有空闲的线程就会使用已有的空闲线程执行任务。这个线程池有一个销毁机制,如果一个线程60秒之内没有被使用过,这个线程就会被销毁。
  • ScheduleThreadPool:创建一个定长的线程池,而且支持定时以及周期性的任务执行。

38.如何保证多线程下的安全问题

传送门.

39.HashMap和HashTable各有什么特点,他们的区别是什么

传送门.

40.List、Set和Map的特点和区别

  • List:
    • 可以允许重复的对象
    • 可以插入多个null元素
    • 是一个有序容器,保持了每个元素的插入顺序,输出的顺序就是插入的顺序
  • Set:
    • 不允许重复的对象
    • 无序容器,无法保证每个元素的存储顺序(TreeSet通过Comparator或者Comparable维护了一个排序顺序)
    • 只允许一个null元素
  • Map:
    • 不是Collection的子类或者实现类,Map是一个接口
    • Map的每个Entry都持有俩个对象,也就是一个键一个值,Map可能会持有相同的值对象,但键对象必须是唯一的
    • TreeMap也通过Comparator或者Comparable维护了一个排序顺序
    • Map可以拥有任意个null值,但最多只能有一个null键

41.ArrayList、Vector、LinkedList的特点和区别

ArrayList、Vector、LinkedList类均在java.util包中,均为可伸缩数组。

  • ArrayList和Vector都是基于数组来实现的,它们会在内存中开辟一块连续的空间来存储,因此支持通过下标来访问元素,同时索引数据的速度比较快,但是在插入和删除元素时速度比较慢;LinkedList是采用双向链表来实现的,对数据的索引需要从头开始遍历,因此用于随机访问的效率比较低,但是插入和删除的效率较高。
  • ArrayList和Vector都有一个初始化的容量的大小,但里面存储的元素超过这个大小时就动态的扩充它们的存储空间,ArrayList默认扩充为原来的1.5倍(没有方法可以设置扩充空间的大小),Vector默认扩充为原来的2倍(每次扩充空间的大小可是设置)
  • Vector是线程安全的,ArrayList和LinkedList不是线程安全的。ArrayList和Vector最大的区别就是synchronized(同步)的使用,ArrayList的方法都不是同步的,但Vector的绝大部分方法都是直接或者间接同步的,因此Vector的性能略逊于ArrayList。
  • 在实际使用中,若对数据的主要操作是索引或者只在集合的末端增加、删除元素时,使用ArrayList和Vector效率较高;若对数据的操作主要为在指定位置的插入或者删除时,使用LinkedList效率比较高;当在多线程中使用容器时,选用Vector较为安全。

42.Collection和Collections的区别

Colleciton是集合类的上级接口,继承于他的接口主要有Set和List
Collections是针对集合类的一个帮助类,他提供一系列静态方法实现对各种集合的搜索、排序、线程安全化等操作

43.Java集合详解

传送门.

44.什么是IO流,为什么要有IO流

IO流包括输入流和输出流,输入流指的是将数据以字符或字节形式从外部媒介比如文件、数据库等读取到存中所以也分为字符输入流和字节输入流;输出流指的是将内存中的数据写入外部媒介,也分为了字符输出流和字节输出流。
为什么要有IO流:数据要传输,必定就有输入端和输出端,也就是数据的读入和数据的读出。

45.字节流和字符流哪个更好,怎么选择

传送门.

46.什么是序列化和反序列化,为什么要使用序列化

序列化就是将对象转换为字节序列的过程,反序列化就是将字节转换为对象的过程。
为什么要使用序列化:java对象序列化后可以很方便的存储或者在网络中传输。

47.PrintStream、BufferedWriter、PrintWriter的比较

  • PrintStream类的输出功能非常强大,通常如果需要输出文本内容,都应该将输出流包装成PrintStream后进行输出。它还提供其他两项功能。与其他输出流不同,PrintStream 永远不会抛出 IOException;而是,异常情况仅设置可通过 checkError 方法测试的内部标志。另外,为了自动刷新,可以创建一个 PrintStream
  • BufferedWriter:将文本写入字符输出流,缓冲各个字符从而提供单个字符,数组和字符串的高效写入。通过write()方法可以将获取到的字符输出,然后通过newLine()进行换行操作。BufferedWriter中的字符流必须通过调用flush方法才能将其刷出去。并且BufferedWriter只能对字符流进行操作。如果要对字节流操作,则使用BufferedInputStream。
  • PrintWriter的println方法自动添加换行,不会抛异常,若关心异常,需要调用checkError方法看是否有异常发生,PrintWriter构造方法可指定参数,实现自动刷新缓存(autoflush);

48.BufferedReader属于哪种流,它是用来做什么的,有哪些经典的方法

属于处理流中的缓冲流,可以将读取的内容存在内存里面,有readLine()方法

49.什么是节点流,什么是处理流,它们各有什么用处,处理流的创建有什么特征

  • 节点流:直接与数据源相连,用于输入或者输出
  • 处理流:在节点流的基础上对之进行加工,进行一些功能的扩展
  • 处理流的构造器必须要传入节点流的子类

50.流一般需不需要关闭,怎么关闭比较好,处理流是怎么关闭的,如果有多个流互相调用传入是怎么关闭的

流一旦打开就必须关闭,使用close方法
放入finally语句块中(finally 语句一定会执行)
调用的处理流就关闭处理流
多个流互相调用只关闭最外层的流

51.InputStream里的read()返回的是什么,read(bytep[] date)是什么意思,返回的是什么值

返回的是所读取的字节的int型(范围0-255)
read(byte [ ] data)将读取的字节储存在这个数组
返回的就是传入数组参数个数

52.OutputStream里的writer()是什么意思,writer(byte b[],int off,int len)这三个参数分别是什么意思

write将指定字节传入数据源
Byte b[ ]是byte数组
b[off]是传入的第一个字符
b[off+len-1]是传入的最后的一个字符
len是实际长度

53.数组和链表的区别

传送门.

54.JVM详解

传送门.

55.GC是什么,为什么要有GC

GC是垃圾回收的意思
垃圾回收可以有效的防止内存泄漏,有效的使用可以使用的内存

56.垃圾回收的原理,并考虑俩种回收机制

垃圾回收器通常是作为一个单独的低级别的线程运行,在不可预知的情况下对内存堆中已经死亡的或者长时间没有使用的对象进行清除和回收,回收机制有分代复制垃圾回收,增量垃圾回收,标记垃圾回收

57.Java会存在内存泄漏吗,请简单描述

会,虽然Java有垃圾回收机制,但是在程序运行过程中可能会产生一些无用但可达的对象,这就造成了内存泄漏,通俗地说,就是程序员可能创建了一个对象,以后一直不再使用这个对象,这个对象却一直被引用,即这个对象无用但是却无法被垃圾回收器回收的,这就是Java中可能出现内存泄露的情况

58.在开发中遇到过内存溢出吗,原因有哪些,解决方法有哪些

传送门.

59.Java总共有多少种设计模式,简述一下你了解的设计模式

Java总共有23中设计模式。
工厂模式:工厂了可以根据条件生成不同子类实例,这些子类有一个公共的抽象父类并且实现了相同的方法,但是这些方法针对不同的数据进行不同的操作(多态)。当得到子类的实例后,开发人员可以调用基类中的方法而不必考虑到底返回的是哪一个子类的实例。
代理模式:给一个对象提供一个代理对象,并由代理对象控制原对象的引用。
适配器模式:把一个类的接口转换成客户端所期待的另一种接口,从而是原本因接口不匹配而无法在一起使用的类能够一起工作。
单例模式:一个类只有一个实例,即一个类只有一个对象实例。
(挑自己最熟悉的、用得最多的作答,以免言多必失)

60.Servlet的运行过程

Web容器加载Servlet并将其实例化后,Servlet生命周期开始,容器运行期init()方法进行Servlet的初始化;请求到达是调用Servlet的service()方法,service()方法会根据需要调用与请求对应的doGet或doPost等方法;当服务器关闭或项目被卸载是服务器会将Servlet()实例销毁,此时会调用Servlet的destory()方法

61.转发和重定向的区别

  • 转发在服务器端完成的;重定向是在客户端完成的
  • 转发的速度快;重定向速度慢
  • 转发的是同一次请求;重定向是两次不同请求
  • 转发不会执行转发后的代码;重定向会执行重定向之后的代码
  • 转发地址栏没有变化;重定向地址栏有变化
  • 转发必须是在同一台服务器下完成;重定向可以在不同的服务器下完成

62.排序有哪几种方法,请列举

插入排序,交换排序,选择排序,归并排序,分配排序

63.什么是MVC模式

MVC 的全称为model-view-controller(模型-视图-控制器)。MVC 是一种开发应用程序
的模式,这个模式已经具有了很好的框架架构,并且十分容易维护。使用MVC 开发出来的应
用程序一般包括以下几块内容:

  • 控制器(Controller):控制器类处理客户端向Web 应用程序发出的请求,获取数据,
    并指定返回给客户端,用来显示处理结果的视图。
  • 模型(Model):模型类代表了应用程序的数据,这些数据通常具有一个数据验证逻
    辑,用来使得这些数据必须符合业务逻辑。
  • 视图(View):视图类是Web 应用程序中用来生成并显示HTML 格式的服务器端对客
    户端请求的响应结果的模板文件

64.BS和CS的联系和区别

传送门.

65.手写单例模式和工厂模式

传送门.

66.什么是RESTful API

传送门.

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值