JAVA全套简答题201-298

201. Java中的HashMap的工作原理是什么? Java中的HashMap是以键值对(key-value)的形式存储元素的。HashMap需要一个hash函数,它使用hashCode()和equals()方法来向集合/从集合添加和检索元素。当调用put()方法的时候,HashMap会计算key的hash值,然后把键值对存储在集合中合适的索引上。如果key已经存在了,value会被更新成新值。

202. 如何决定选用HashMap还是TreeMap? 对于在Map中插入、删除和定位元素这类操作,HashMap是最好的选择。然而,假如你需要对一个有序的key集合进行遍历,TreeMap是更好的选择。基于你的collection的大小,也许向HashMap中添加元素会更快,将map换为TreeMap进行有序key的遍历。

203. TreeMap的特点有什么? 不允许出现重复的key;可以插入null键,null值;可以对元素进行排序;无序集合(插入和遍历顺序不一致)

204. TreeMap增加的方法有哪些?  V put(K key, V value):将指定映射放入该TreeMap中 V putAll(Map map):将指定map放入该TreeMap中

205. 与HashMap相比,TreeMap有什么不同? 与HashMap相比,TreeMap是一个能比较元素大小的Map集合,会对传入的key进行了大小排序。其中,可以使用元素的自然顺序,也可以使用集合中自定义的比较器来进行排序;

206. Iterator是什么?    Iterator接口提供遍历任何Collection的接口。我们可以从一个Collection中使用迭代器方法来获取迭代器实例。迭代器取代了Java集合框架中的Enumeration。迭代器允许调用者在迭代过程中移除元素。

207. 使用ArrayList集合,对其添加10个不同的元素,并使用Iterator遍历该集合。提示:1)使用add()方法将元素添加到SrrayList集合中。2)调用集合的Iterator()方法获得Iterator对象,并调用Iterator的hashNext()和next()方法,迭代出 集合中的所有元素 import java.util.*; public class Test01 { public static void main(String[] args) { ArrayList list = new ArrayList(); for(int i = 0; i < 10; i++) { list.add("A"+i); } Iterator it = list.iterator(); while(it.hasNext()) { Object obj = it.next(); System.out.println(obj); } } }

208. 为何Iterator接口没有具体的实现? Iterator接口定义了遍历集合的方法,但它的实现则是集合实现类的责任。每个能够返回用于遍历的Iterator的集合类都有它自己的Iterator实现内部类。 这就允许集合类去选择迭代器是fail-fast还是fail-safe的。比如,ArrayList迭代器是fail-fast的,而CopyOnWriteArrayList迭代器是fail-safe的。

209. Enumeration接口和Iterator接口的区别有哪些? Enumeration速度是Iterator的2倍,同时占用更少的内存。但是,Iterator远远比Enumeration安全,因为其他线程不能够修改正在被iterator遍历的集合里面的对象。同时,Iterator允许调用者删除底层集合里面的元素,这对Enumeration来说是不可能的。

210. forEach语句的含义和特点 forEach语句是java5的新特征之一,在遍历数组、集合方面、forEach为开发人员提供了极大的方便。forEach语句是for语句的特殊简化版本,但是forEach语句并不能完全取代for语句、然而任何的forEach都可以改写为for语句版本

211. forEach循环与for循环的区别? foreach有的也叫增强for循环,foreach其实是for循环的一个特殊简化版。再说一下foreach的书写格式: for(元素类型  元素名称 : 遍历数组(集合)(或者能进行迭代的)){ 语句   }foreach虽然是for循环的简化版本,但是并不是说foreach就比for更好用,foreach适用于循环次数未知,或者计算循环次数比较麻烦情况下使用效率更高,但是更为复杂的一些循环还是需要用到for循环效率更高。

212. 能用forEach遍历访问的对象需要实现什么接口或声明什么方法的类型? 能用forEach遍历访问的对象需要实现Ienumerable接口或声明GetEnumerator方法的类型

213. forEach循环的语法格式为? for(元素类型t 元素变量x:遍历对象obj){ 引用x的java语句;}

214.  Java中的泛型是什么 ? 使用泛型的好处是什么? 这是在各种Java泛型面试中,一开场你就会被问到的问题中的一个,主要集中在初级和中级面试中。那些拥有Java1.4或更早版本的开发背景的人 都知道,在集合中存储对象并在使用前进行类型转换是多么的不方便。泛型防止了那种情况的发生。它提供了编译期的类型安全,确保你只能把正确类型的对象放入 集合中,避免了在运行时出现ClassCastException。

215. 泛型的实现原理 泛型的实现是靠类型擦除技术 类型擦除是在编译期完成的 也就是在编译期 编译器会将泛型的类型参数都擦除成它的限定类型,如果没有则擦除为object类型之后在获取的时候再强制类型转换为对应的类型。 在运行期间并没有泛型的任何信息,因此也没有优化。

216. 泛型的使用场景? 1)集合2)泛型类返回参数封装类,如下代码。3)泛型接口4)泛型方法"

217. 简述泛型的作用? 泛型的主要作用是解决对象向下转型所带来的ClassCastException,使用泛型之后,类之中的属性或方法中的参数类型就由调用处来决定,而如果调用处不设置泛型,为了保证程序不出错,则会使用Object类型进行定义。

218. Collections类中的常用方法有哪些? 1、void sort排序方法 2、max方法作用:取集合中的最大值。 3、shuffle方法作用:将集合中的元素顺序打乱。 4、synchronizedList(Listlist)方法作用:将参数中不同步的集合list转换为同步访问的集合。

219. Collections集合工具类的作用? java.utils.Collections是针对集合操作的工具类

220. Collections类是什么? Java.util.Collections是一个工具类仅包含静态方法,它们操作或返回集合。它包含操作集合的多态算法,返回一个由指定集合支持的新集合和其它一些内容。这个类包含集合框架算法的方法,比如折半搜索、排序、混编和逆序等。

221. 请说说Collection和Collections的有什么区别? Collection是集合类的上级接口,继承与他的接口主要有Set 和List.Collections是针对集合类的一个帮助类,他提供一系列静态方法实现对各种集合的搜索、排序、线程安全化等操作。"

222. Arrays 类的数组的排序语法? Arrays.sort(数组名);

223. Arrays将一个数组array转换成一个字符串的语法? String toString();

224. Arrays类的功能?  Arrays类是一个工具类,其中包含了数组操作的很多方法,比如搜索和排序;Arrays类中的方法均为static修饰的,可以直接通过Arrays.xxx(xxx)的形式调用方法。

225. Arrays类的常用方法?  sort方法、toString方法、binarySearch方法

226. IO流的分类? 流按照流向数据流向可以分为输入流和输出流。流按照处理数据类型的单位不同可以分为字节流和字符流

227. 什么是Filter流? 1)Filter Stream是一种IO流。2)Filter流的主要作用是:对存在的流增加一些额外的功能,像给目标文件增加源文件中不存在的行数,或者增加拷贝的性能。

228. 什么是节点流,什么是处理流,它们各有什么用处,处理流的创建有什么特征? 节点流 直接与数据源相连,用于输入或者输出 处理流:在节点流的基础上对之进行加工,进行一些功能的扩展 处理流的构造器必须要 传入节点流的子类

229. 字符流和字节流有什么区别? 字符流和字节流的使用非常相似,但是实际上字节流的操作不会经过缓冲区(内存)而是直接操作文本本身的,而字符流的操作会先经过缓冲区(内存)然后通过缓冲区再操作文件

230. 简述流的概念? Java程序通过流来完成输入和输出,流是输入或输出信息的抽象。流通过Java的输入/输出系统与外设连接进行数据通信。流是抽象的对象,具体实现代码在java.io包中。

231. 什么是输入流? InputStream抽象了应用程序读取数据的方式,即输入流。

232. 一般操作文件流时,字节流的步骤? 1、使用File类找到一个文件,或创建一个文件 2、通过File类去实例化字节流的类 3、进行字节的读写操作 4、关闭文件流

233. 输出流的概念?

OutputStream抽象了应用程序写出数据的方式,即输出流。234. 除了字节流,JDK还提供了用于实现字符操作的字符流,同字节流一样,字符流也有两个抽象的顶级父类,分别是()和() Reader、Writer

235. 字符流的处理,及它的序列?

字符的处理,一次处理一个字符;字符的底层依然是基本的字节序列;

236. 字符流操作文件流的基本步骤?

1、使用File类找到一个文件,或创建一个文件 2、通过File类去实例化字符流的类 3、进行字符的读写操作 4、关闭文件流

237. 简述字节流与字符流操作的区别?

字节流没有使用到缓冲区,而字符流使用了; 处理各种数据都可以通过字节流完成,而在处理中文的时候使用字符流会更好。

238. 简述线程两种实现方式及区别?

多线程的两种实现方式都需要一个线程的主类,而这个类可以实现Runnable接口或继承Thread类,不管使用何种方式都必须在子类之中覆写run()方法,此方法为线程的主方法;Thread类是Runnable接口的子类,而且使用Runnable接口可以避免单继承局限,以及更加方便的实现数据共享的概念。

239. 线程和进程有什么区别?

线程是进程的子集,一个进程可以有很多线程,每条线程并行执行不同的任务。不同的进程使用不同的内存空间,而所有的线程共享一片相同的内存空间。别把它和栈内存搞混,每个线程都拥有单独的栈内存用来存储本地数据。240. java中有几种方法可以实现一个线程?用什么关键字修饰同步方法?

有两种实现方法,分别是继承Thread类与实现Runnable接口 用synchronized关键字修饰同步方法

241. 启用一个线程是用run()还是start()?

启动一个线程是调用start()方法,使线程所代表的虚拟处理机处于可运行状态,这意味着它可以由JVM调度并执行。这并不意味着线程就立即运行。run()方法可以产生必须退出的标志来停止一个线程

242. 多线程有几种实现方法,都是什么?同步有几种实现方法,都是什么?

多线程有两种实现方法,分别是继承Thread类与实现Runnable接口同步的实现方面有两种,分别是synchronized,wait与notify

243. 怎样继承Thread类?

定义一个从Thread类继承的子类并重写其run方法 然后生成该类的对象,调用Thread类对象start方法启动线程

244. 通过继承Thread类创建线程?

(1).首先定义一个类去继承Thread父类,重写父类中的run()方法。在run()方法中加入具体的任务代码或处理逻辑。 (2).直接创建一个ThreadDemo2类的对象,也可以利用多态性,变量声明为父类的类型。 (3).调用start方法,线程t启动,隐含的调用run()方法。

245. 简述Thread类的子类或实现Runnable接口两种方法创建线程的异同?

一、继承Thread类,实现步骤 1)自定义一个类,继承自Thread类,然后重写里面的run方法 2)在主线程中创建自定义类的实例对象,通过调用start方法启动线程 二、实现Runnable接口,步骤 1)自定义一个类实现Runnable接口并重写里面的run方法 2)在主线程中创建此类的实例对象 3)创建Thread类的实例对象,将自定义类的实例对象作为参数进行传递 4)通过start方法启动线程 这两个方法的共同点就是子类重写run方法,但是继承是重写Thread中的run方法,实现接口是Runnable中的run方法。而且都需要start来启动线程,继续是通过其创建的子类对象来调用的,接口是将子类对象作为参数来传递给Thread,然后通过Thread的对象来调用start启动的。

246. Thread类的wait( )和sleep( )的区别?

1)所在类不同:wait( )是Object类中的方法;sleep( )是Tread类中的方法;     (2)slepp( )没有释放同步锁,而wait( )释放了同步锁;     (3)slepp( )必须制定时间,而wait( )不用;     (4)slepp( )可以在任何地方使用,而wait( )、notify( )、notifyAll( )只能在同步方法或同步代码块中使用;     (5)slepp( )必须捕获异常,而wait( )、notify( )、notifyAll( )不用;

247. 请描述实现Runnable接口比继承Thread类所具有的优势?

1、 适合多个相同的程序代码的线程去共享同一个资源。2、可以避免java中的单继承的局限性。3、增加程序的健壮性,实现解耦操作,代码可以被多个线程共享,代码和数据独立。4、线程池只能放入实现Runable或callable类线程,不能直接放入继承Thread的类

248. Runnable接口的定义? Runnable接口是线程辅助类,仅定义了一个方法run()方法

249. Runnable接口的使用方法?

(1) 实现Runnable接口(2) 重写run()方法(3) 创建runnable实例(4) 创建Thread实例(5) 将Runnable实例放入Thread实例中(6) 通过线程实例控制线程的行为(运行,停止),在运行时会调用Runnable接口中的run方法。

250. Runnable接口的有点?

灵活:Runnable可以继承其他类实现对Runnable实现类的增强,避免了Thread类由于继承Thread类而无法继承其他类的问题共享资源:Runnable接口的run()方法可以被多个线程共享,适用于多个进程处理一种资源的问题251. 简述线程状态的转换方式  

新建状态是指创建了一个线程,但它还没有启动。 就绪状态是当前线程处于新建状态后,调用了start()方法,线程就处于就绪状态。就绪状态的线程具备了运行条件,但尚未进入运行状态。 运行状态是某个就绪状态的线程获得CPU资源,正在运行。 阻塞状态是正在运行的线程遇到某个特殊情况。例如,延迟、挂起、等待I/O操作完成等。进入阻塞状态的线程让出CPU,并暂时停止自己的执行。线程进入阻塞状态后,就一直等待,直到引起阻塞的原因被消除,线程又转入就绪状态,重新进入就绪队列排队。 死亡状态是指线程不再具有继续运行的能力,也不能再转到其他状态。

252. 线程的生命周期可分为哪几种状态? 新建、就绪、运行、阻塞和死亡五中状态

253. 线程调用sleep()方法后,该线程将进入________ 阻塞状态

254. 在java中 ,新建的线程调用start()方法,将使线程的状态从New(新建状态)转换为_______ 可运行状态

255. 简述sleep( )。

sleep() 定义在ThreaD、java中。 sleep() 的作用是让当前线程休眠,即当前线程会从“运行状态”进入到“休眠(阻塞)状态”。sleep()会指定休眠时间,线程休眠的时间会大于/等于该休眠时间;在线程重新被唤醒时,它会由“阻塞状态”变成“就绪状态”,从而等待cpu的调度执行。

256. sleep()与wait()比较说明。   

wait()的作用是让当前线程由“运行状态”进入“等待(阻塞)状态”的同时,也会释放同步锁。而sleep()的作用是也是让当前线程由“运行状态”进入到“休眠(阻塞)状态”。但是,wait()会释放对象的同步锁,而sleep()则不会释放锁。

  1. 使用Sleep(TimeSpan)方法重载来阻止应用程序的主线程五次,为两秒每次。

static void Main(){ TimeSpan interval = new TimeSpan(0, 0, 2); for (int i = 0; i <5; i++){ ConsolE、WriteLine("Sleep for 2 seconds."); ThreaD、Sleep(interval); } ConsolE、WriteLine("Main thread exits."); }

258. 线程组最大优先级的设定?

1.系统线程组的最大优先级默认为ThreaD、MAX_PRIORITY 2.创建线程组的时候其最大优先级默认为父线程组(如果未指定父线程组,则其父线程组默认为当前线程所属线程组)的最大优先级 3.可以通过setMaxPriority更改最大优先级,但无法超过父线程组的最大优先级

259. 简述如何实现线程插队?

线程通过调用join()方法就可以实现合并

260. 什么叫做线程的调度?

程序中的多个线程是并发执行的,某个线程若想被执行必须要得到CPU的使用权,Java虚拟机会按照特定的机制为程序中的每个线程分配CPU的使用权,这种机制被称作线程的调度。

261. 线程插队?

调用其它线程的join()方法时,调用的线程将被阻塞,直到被join()方法加入的线程执行完成后他才会继续执行。

262. 线程调度的方式?

线程休眠,线程让步,线程插队

263. 同步锁的实现方式?

操作系统调度实现;应用自行实现;CAS自旋;

264. 同步方法概念?    

即有synchronized关键字修饰的方法。 由于java的每个对象都有一个内置锁,当用此关键字修饰方法时, 内置锁会保护整个方法。在调用该方法前,需要获得内置锁,否则就处于阻塞状态。265. 实现线程同步的方式有哪些?

同步方法、同步代码块、同步锁

266. 请简述什么是死锁?

死锁是指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程。

267. 字节输入流缓冲效率问题

1. 在BufferedInputStream底层中有一个默认容量为8KB的byte类型缓冲数组。2. fill方法是一个操作核心a. 从硬盘中读取数据,读取的数据容量和缓冲数组容量一致。b. 所有的read方法,都是从缓冲数组中读取数据c. 每一次读取数据之前,都会检查缓冲区内是否有数据,如果没有,fill方法执行,填充数据。3. 利用缓冲,fill方法,可以极大的降低CPU通过内存访问硬盘的次数。同时程序操作的数据是在内存中进

268. 字节缓冲流?

输入BufferedInputStream(InputStream in); 这里需要的对象是一个字节输入流基类对象。同时也可也传入InputStream子类对象输出BufferedOutputStream(OutputStream out);这里需要的对象是一个字节输出流基类对象。同时也可也传入OutputStream子类对象

269. 缓冲流的作用?

使用缓冲数组以后,整体的读取,写入效率提升很大!!!降低了CPU通过内存访问硬盘的次数。提高效率,降低磁盘损耗。字节输入缓冲 BufferedInputStream字节输出缓冲BufferedOutputStream字符输入缓冲BufferedReader字符输出缓冲BufferedWrite

270. 简述字节流与字符流操作的区别。

字节流没有使用到缓冲区,而字符流使用了;处理各种数据都可以通过字节流完成,而在处理中文的时候使用字符流会更好。

271. File类的方法有什么,分别解释?

delete() 删除文件或一个空文件夹,如果是文件夹且不为空,则不能删除,成功返回true,失败返回false。deleteOnExit() 在虚拟机终止时,请求删除此抽象路径名表示的文件或目录,保证程序异常时创建的临时文件也可以被删除

272. File类的定义

1. File类主要是JAVA为文件这块的操作(如删除、新增等)而设计的相关类2. File类的包名是java.io,其实现了Serializable, Comparable两大接口以便于其对象可序列化和比较

273. File类构造方法有哪三种,分别解释?

1、File(String pathname):通过路径名创建一个新 File 实例。2、File(File parent, String child):根据父目录路径File实例和子目录或文件路径创建一个新 File 实例。3、File(String parent, String child) :根据父目录路径和子目录或文件路径创建一个新 File 实例。

274. 简述File类的基本功能?

处理文件和获取文件信息,文件或文件夹的管理

275. 什么是java序列化?

序列化就是一种用来处理对象流的机制,所谓对象流也就是将对象的内容进行流化。 可以对流化后的对象进行读写操作,也可将流化后的对象传输于网络之间。 序列化是为了解决在对对象流进行读写操作时所引发的问题。276. 如何实现java序列化?

将需要被序列化的类实现Serializable接口,该接口没有需要实现的方法,implements Serializable只是为了标注该对象是可被序列化的,然后使用一个输出流(如:FileOutputStream)来构造一个ObjectOutputStream(对象流)对象,接着,使用ObjectOutputStream对象的writeObject(Object obj)方法  就可以将参数为obj的对象写出(即保存其状态),要恢复的话则用输入流。

277. 什么是对象序列化和反序列化?

在软件开发过程中,可能需要把创建的对象保存在文件中,在需要的时候进行恢复。对象序列化(有些书称为对象持久化)可以实现对象的传输和存储。对象的序列化是指把对象变为二进制数据写入到一个输出流中,对象的反序列化是指从一个输入流中读取一个对象。 在 Java 语言中,只有实现了java.io.Serializable 接口的类的对象才能被序列化和反序列化。对象序列化和反序列化需要依靠对象输出流ObjectOutputStream 和对象输入流ObjectInputStream 。

278. 简述对象序列化的主要作用?

对象序列化主要是指将内存之中保存的对象以二进制数据流的方式进行传输,要实现序列化的对象所在类必须实现java.io.Seriliazable接口。

279. 使用缓冲区有这么两个好处是什么?

1、减少实际的物理读写次数2、缓冲区在创建时就被分配内存,这块内存区域一直被重用,可以减少动态分配和回收内存的次数

280. 缓存(cache)与缓冲(buffer)的主要区别

Buffer的核心作用是用来缓冲,缓和冲击。比如你每秒要写100次硬盘,对系统冲击很大,浪费了大量时间在忙着处理开始写和结束写这两件事嘛。用个buffer暂存起来,变成每10秒写一次硬盘,对系统的冲击就很小,写入效率高了,日子过得爽了。极大缓和了冲击。Cache的核心作用是加快取用的速度。比如你一个很复杂的计算做完了,下次还要用结果,就把结果放手边一个好拿的地方存着,下次不用再算了。加快了数据取用的速度。

281. 缓冲区的类型?

全缓冲、行缓冲和不带缓冲。

282. 什么是缓冲区?

缓冲区(buffer),它是内存空间的一部分。也就是说,在内存空间中预留了一定的存储空间,这些存储空间用来缓冲输入或输出的数据,这部分预留的空间就叫做缓冲区,显然缓冲区是具有一定大小的。缓冲区根据其对应的是输入设备还是输出设备,分为输入缓冲区和输出缓冲区。283. 什么是线程的新建状态?

当线程对象对创建后,即进入了新建状态

284. 当线程的处于继续状态时,应该调用什么方法?

start()方法

285. 同步阻塞的状态的概念?

线程在获取synchronized同步锁失败(因为锁被其它线程所占用),它会进入同步阻塞状态286. 什么是就绪状态?

当调用线程对象的start()方法(t.start();),线程即进入就绪状态。处于就绪状态的线程,只是说明此线程已经做好了准备,随时等待CPU调度执行,并不是说执行了t.start()此线程立即就会执行;

287. 线程休眠的的定义?

所谓的线程休眠就是让线程的速度变慢一点。用sleep方法。

288. 设置线程优先级的代码是什么?

public final void setPriority(int newPriority) ;

289. 线程休眠的两个常用的方法?

sleep、run、

290. 什么是线程的优先级?

线程优先级是指优先级越高,越有可能先执行,但只是建议先执行,具体什么时候执行由系统决定。

291. Java中线程的安全问题是通过那个关键字解决的?

synchronized关键字

292. 线程安全性的分类方法包括哪几种?

不可变类、线程安全性类、有条件的线程安全类、线程兼容类、线程对立类293. 线程安全的意义?

线程安全, 是指变量或方法( 这些变量或方法是多线程共享的) 可以在多线程的环境下被安全有效的访问。这说明了两方面的问题:(1)可以从多个线程中调用, 无需调用方有任何操作;(2)可以同时被多个线程调用, 无需线程之不必要的交互

294. 什么是java的线程安全?

线程安全是多线程编程时的计算机程序代码中的一个概念。在拥有共享数据的多条线程并行执行的程序中,线程安全的代码会通过同步机制保证各个线程都可以正常且正确的执行,不会出现数据污染等意外情况。295. java的同步方法?

使用 synchronized 关键字等价于用 ReentrantLock 控制 lock 和 unlock。

296. 同步方法和同步代码块的区别?

1.同步方法使用synchronized修饰方法,在调用该方法前,需要获得内置锁(java每个对象都有一个内置锁),否则就处于阻塞状态2.同步代码块使用synchronized(object){}进行修饰,在调用该代码块时,需要获得内置锁,否则就处于阻塞状态

297. java中同步代码块的作用?

保证多线程访问数据的安全 保证同步代码块中只有一个线程运行

298. 请简述Java中同步代码快和同步方法的弊端?

同步代码块和同步方法解决多线程问题有好处也有弊端。同步解决了多个线程同时访问共享数据时的线程安全问题,只要加上同一个锁,在同一时间内只能有一条线程执行。但是线程在执行同步代码时每次都会判断锁的状态,非常消耗资源,效率较低。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

小孙同学1024

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

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

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

打赏作者

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

抵扣说明:

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

余额充值