linkin大话数据结构--apache commons工具类

Apache Commons包含了很多开源的工具,用于解决平时编程经常会遇到的问题,减少重复劳动。

一、Commons BeanUtils

说明:针对Bean的一个工具集。由于Bean往往是有一堆get和set组成,所以BeanUtils也是在此基础上进行一些包装。

二、Commons CLI
说明:这是一个处理命令的工具。比如main方法输入的string[]需要解析。你可以预先定义好参数的规则,然后就可以调用CLI来解析。

三、Commons Codec
说明:这个工具是用来编码和解码的,包括Base64,URL,Soundx等等。用这个工具的人应该很清楚这些,我就不多介绍了。

四、Commons Collections
说明:你可以把这个工具看成是java.util的扩展。

五、Commons Configuration
说明:这个工具是用来帮助处理配置文件的,支持很多种存储方式

六、Commons DBCP
说明:Database Connection pool, Tomcat就是用的这个,不用我多说了吧,要用的自己去网站上看说明。

七、Commons DbUtils
说明:我以前在写数据库程序的时候,往往把数据库操作单独做一个包。DbUtils就是这样一个工具,以后开发不用再重复这样的工作了。值得一体的是,这个工具并不是现在流行的OR-Mapping工具(比如Hibernate),只是简化数据库操作,比如

七1、Commons FileUpload
说明:jsp的上传文件功能怎么做呢?

八、Commons HttpClient
说明:这个工具可以方便通过编程的方式去访问网站。

九、Commons IO
说明:可以看成是java.io的扩展,我觉得用起来非常方便。

十、Commons JXPath
说明:Xpath你知道吧,那么JXpath就是基于Java对象的Xpath,也就是用Xpath对Java对象进行查询。这个东西还是很有想像力的。

十一、Commons Lang
说明:这个工具包可以看成是对java.lang的扩展。提供了诸如StringUtils, StringEscapeUtils, RandomStringUtils, Tokenizer, WordUtils等工具类。

十二、Commons Logging
说明:你知道Log4j吗?

十三、Commons Math
说明:看名字你就应该知道这个包是用来干嘛的了吧。这个包提供的功能有些和Commons Lang重复了,但是这个包更专注于做数学工具,功能更强大。

十四、Commons Net
说明:这个包还是很实用的,封装了很多网络协议。
1. FTP
2. NNTP
3. SMTP
4. POP3
5. Telnet
6. TFTP
7. Finger
8. Whois
9. rexec/rcmd/rlogin
10. Time (rdate) and Daytime
11. Echo
12. Discard
13. NTP/SNTP

十五、Commons Validator
说明:用来帮助进行验证的工具。比如验证Email字符串,日期字符串等是否合法。

十六、Commons Virtual File System
说明:提供对各种资源的访问接口。支持的资源类型包括

1. CIFS
2. FTP
3. Local Files
4. HTTP and HTTPS
5. SFTP
6. Temporary Files
7. WebDAV
8. Zip, Jar and Tar (uncompressed, tgz or tbz2)
9. gzip and bzip2
10. res
11. ram
这个包的功能很强大,极大的简化了程序对资源的访问。


十七、Commons Transaction
说明:提供持久层事务支持

十六、Commons Proxy
说明: 动态代理,拦截器一类的东西

十八、Commons pool
说明: 创建新的对象并初始化的操作,可能会消耗很多的时间。
在需要频繁创建并使用这些对象的场景中,为了提供系统性能,通常的做法是,创建一个对象池,将一定数量的对象缓存到这个对象池中。
需要使用时直接从对象池中取出对象,使用完后将对象扔回到对象池中即可。
Apache的commons pool组件是我们实现对象池化技术的良好助手。

十九、Commons Launcher
说明:创建跨平台可执行程序

二十、Commons Bean Scripting Framework(BSF)
说明:是一个支持在Java应用程序内调用脚本语言 (Script),并且支持脚本语言直接访问Java对象和方法的一个开源项目。有了它 , 你就能在java application中使用javascript, Python, XSLT, Perl, tcl, ……等一大堆scripting language
. 反过来也可以,就是在这些scripting language中调用任何已经注册过了的JavaBean,java object。它提供了完整的API实现通过Java访问脚本语言的引擎。

二十一、Commons chain
说明: 可以在你需要定义和执行一些顺序操作的时候采用Commons Chain。

二十二、Commons Compress
说明: 是一个压缩、解压缩文件的类库。可以操作ar, cpio, Unix dump, tar, zip, gzip, XZ, Pack200 and bzip2格式的文件,功能比较强大


二十三、Commons Discovery
说明: 组件被用以查找可插拔接口的实现实例,它提供了一种通用的实例化这些实现的方式,而且可以管理单例(工厂)的生命周期。

二十四、 commons exec
说明: Apache Commons Exec 是 Apache 上的一个 Java 项目,提供一些常用的方法用来执行外部进程,如下面代码所示:

String line = "AcroRd32.exe /p /h " + file.getAbsolutePath();
CommandLine commandLine = CommandLine.parse(line);
DefaultExecutor executor = new DefaultExecutor();
executor.setExitValue(1);
ExecuteWatchdog watchdog = new ExecuteWatchdog(60000);
executor.setWatchdog(watchdog);
int exitValue = executor.execute(commandLine);

二十五、commons jelly
说明:Jelly能够把XML转换成可执行代码,所以Jelly是一个基于XML与Java的脚本和处理引擎。 Jelly借鉴了JSP定指标签,Velocity, Cocoon和Xdoclet中的脚本引擎的许多优点。Jelly可以用在命令行,Ant或者Servlet之中。


Apache Commons包很强大的,这里我主要说几个常用的工具类:

1,BeanUtils copyProperties(java.lang.Object dest, java.lang.Object orig) 【Copy property values from the origin bean to the destination bean for all cases where the property names are the same。dest目标对象,orig原始对象】   使用这个方法的时候,会把后面那个对象所有的属性都会复制到前面的目标对象里面,有一点注意的时候,这个方法不能随便使用,要是自己写一个类,直接调用这个方法是不行的。他的源码里面有这个orig instanceof DynaBean判断,具体什么意思我也不知道。不过在j2ee中可以使用,因为玩的都是j2ee项目,所以一般都可以使用。

2,Commons Lang 说明:这个工具包可以看成是对java.lang的扩展。提供了诸如StringUtils, StringEscapeUtils, RandomStringUtils, Tokenizer, WordUtils等工具类。

跟java.lang这个包的作用类似,Commons Lang这一组API也是提供一些基础的、通用的操作和处理,如自动生成toString()的结果、自动实现hashCode()和equals()方法、数组操作、枚举、日期和时间的处理等等。
 
这一组API的所有包名都以org.apache.commons.lang开头,共有如下8个包:
org.apache.commons.lang
org.apache.commons.lang.builder
org.apache.commons.lang.enum
org.apache.commons.lang.enums
org.apache.commons.lang.exception
org.apache.commons.lang.math
org.apache.commons.lang.mutable
org.apache.commons.lang.time

其中的lang.enum已不建议使用,替代它的是紧随其后的lang.enums包。 lang包主要是一些可以高度重用的Util类;lang.builder包包含了一组用于产生每个Java类中都常使用到的toString()、 hashCode()、equals()、compareTo()等等方法的构造器;lang.enums包顾名思义用于处理枚 举;lang.exception包用于处理Java标准API中的exception,为1.4之前版本提供Nested Exception功能;lang.math包用于处理数字;lang.mutable用于包装值型变量;lang.time包提供处理日期和时间的功 能。

我们首先来看org.apache.commons.lang包,这个包提供了一些有用的包含static方法的Util类。除了6个Exception类和2个已经deprecated的数字类之外,commons.lang包共包含了17个实用的类:
ArrayUtils – 用于对数组的操作,如添加、查找、删除、子数组、倒序、元素类型转换等;
BitField – 用于操作位元,提供了一些方便而安全的方法;
BooleanUtils – 用于操作和转换boolean或者Boolean及相应的数组;
CharEncoding – 包含了Java环境支持的字符编码,提供是否支持某种编码的判断;
CharRange – 用于设定字符范围并做相应检查;
CharSet – 用于设定一组字符作为范围并做相应检查;
CharSetUtils – 用于操作CharSet;
CharUtils – 用于操作char值和Character对象;
ClassUtils – 用于对Java类的操作,不使用反射;
ObjectUtils – 用于操作Java对象,提供null安全的访问和其他一些功能;
RandomStringUtils – 用于生成随机的字符串;
SerializationUtils – 用于处理对象序列化,提供比一般Java序列化更高级的处理能力;
StringEscapeUtils – 用于正确处理转义字符,产生正确的Java、JavaScript、HTML、XML和SQL代码;
StringUtils – 处理String的核心类,提供了相当多的功能;
SystemUtils – 在java.lang.System基础上提供更方便的访问,如用户路径、Java版本、时区、操作系统等判断;
Validate – 提供验证的操作,有点类似assert断言;
WordUtils – 用于处理单词大小写、换行等。


  • 下面讲下最常用的两个类:ArrayUtils
package tz.web.dao.bean;
import org.apache.commons.lang.ArrayUtils;

public class Linkin 
{
    public static void main(String[] args) 
    {
        //定义一个数组
        int[] intArray1 = { 2, 4, 8, 16 };
        //打印数组
        System.out.println("intArray1: " + ArrayUtils.toString(intArray1));//{2,4,8,16}
        //查找数组
        System.out.println("intArray1 contains '8'? "+ ArrayUtils.contains(intArray1, 8));//true
        System.out.println("intArray1 index of '8'? "+ ArrayUtils.indexOf(intArray1, 8));//2
        System.out.println("intArray1 last index of '8'? "+ ArrayUtils.lastIndexOf(intArray1, 8));//2
        //克隆和反转
        int[] intArray3 = ArrayUtils.clone(intArray1);
        System.out.println("intArray3: " + ArrayUtils.toString(intArray3));//{2,4,8,16}
        ArrayUtils.reverse(intArray3);
        System.out.println("intArray3 reversed: "+ ArrayUtils.toString(intArray3));//{16,8,4,2}
        //简单类型到包装类型的包装
        Integer[] integerArray1 = ArrayUtils.toObject(intArray1);
        System.out.println("integerArray1: "+ ArrayUtils.toString(integerArray1));//{2,4,8,16}
        //定义2个数组
        String[] s1 = new String[]{"1","2","3"};
        String[] s2 = new String[]{"a","b","c"};
        //合并2个数组
        String[] s = (String[])ArrayUtils.addAll(s1,s2);
        for (int i=0;i<s.length;i++)
        {
        System.out.print(s[i]);//123abc
        }
        String str = ArrayUtils.toString(s);
        //截取字符串
        str = str.substring(1,str.length()-1);
        System.out.println(str+">>"+str.length());//1,2,3,a,b,c>>11
    }

}


  • StringUtils

处理文本对Java应用来说应该算是家常便饭了,在1.4出现之前,Java自身提供的API非常有限,如String、 StringTokenizer、StringBuffer,操作也比较单一。无非就是查找substring、分解、合并等等。到1.4的出现可以说 Java的文字处理上了一个台阶,因为它支持regular expression了。这可是个重量级而方便的东东啊,缺点是太复杂,学习起来有一定难度。相较而言,Jakarta Commons提供的StringUtils和WordUtils至今还维持着那种简洁而强大的美,使用起来也很顺手

package tz.web.dao.bean;
import org.apache.commons.lang.StringUtils;

public class Linkin 
{
    public static void main(String[] args) 
    {
        String str1 = "";   
        String str2 = " ";   
        String str3 = "\t";   
        String str4 = null;   
        String str5 = "123";   
        String str6 = "ABCDEFG"; 
        //检查非空   下面4个都是true。对应的还有empty,别使用这个,这个不包含空格的。不为空的话前面加not就好了
        System.out.println("Is str1 blank? " + StringUtils.isBlank(str1)); 
        System.out.println("Is str2 blank? " + StringUtils.isBlank(str2));   
        System.out.println("Is str3 blank? " + StringUtils.isBlank(str3));   
        System.out.println("Is str4 blank? " + StringUtils.isBlank(str4));   
        //检查是不是数字  
        System.out.println("Is str5 numeric? " + StringUtils.isNumeric(str5)); //true  
        System.out.println("Is str6 numeric? " + StringUtils.isNumeric(str6)); // false
        //字符串的反转  
        System.out.println("str6 reversed: " + StringUtils.reverse(str6)); // GFEDCBA 
        //将数组转换成字符串,还可以加自己的分隔符
        String[] names = new String[]{"linkin1", "linkin2", "linkin3"};   
        System.out.println(StringUtils.join(names, ","));   //linkin1,linkin2,linkin3
<span style="white-space:pre">	</span>// 1 合并两个数组: org.apache.commons.lang. ArrayUtils
<span style="white-space:pre">		</span>// 有时我们需要将两个数组合并为一个数组,用ArrayUtils就非常方便,示例如下:
<span style="white-space:pre">		</span>private static void testArr() {
<span style="white-space:pre">			</span>String[] s1 = new String[] { "1", "2", "3" };
<span style="white-space:pre">			</span>String[] s2 = new String[] { "a", "b", "c" };
<span style="white-space:pre">			</span>String[] s = (String[]) ArrayUtils.addAll(s1, s2);
<span style="white-space:pre">			</span>for (int i = 0; i < s.length; i++) {
<span style="white-space:pre">				</span>System.out.println(s[i]);
<span style="white-space:pre">			</span>}
<span style="white-space:pre">			</span>String str = ArrayUtils.toString(s);
<span style="white-space:pre">			</span>str = str.substring(1, str.length() - 1);
<span style="white-space:pre">			</span>System.out.println(str + ">>" + str.length());


<span style="white-space:pre">		</span>}
<span style="white-space:pre">		</span>//2 截取从from开始字符串
<span style="white-space:pre">		</span>StringUtils.substringAfter("SELECT * FROM PERSON ", "from");
<span style="white-space:pre">		</span>//3 判断该字符串是不是为数字(0~9)组成,如果是,返回true 但该方法不识别有小数点和 请注意
<span style="white-space:pre">		</span>StringUtils.isNumeric("454534"); //返回true
<span style="white-space:pre">		</span>//4.取得类名
        System.out.println(ClassUtils.getShortClassName(Test.class));
        //取得其包名
        System.out.println(ClassUtils.getPackageName(Test.class));
       
        //5.NumberUtils
        System.out.println(NumberUtils.stringToInt("6"));
        //6.五位的随机字母和数字
        System.out.println(RandomStringUtils.randomAlphanumeric(5));
        //7.StringEscapeUtils
        System.out.println(StringEscapeUtils.escapeHtml("<html>"));
        //输出结果为&lt;html&gt;
        System.out.println(StringEscapeUtils.escapeJava("String"));
       
        //8.StringUtils,判断是否是空格字符
        System.out.println(StringUtils.isBlank("   "));
        //将数组中的内容以,分隔
        System.out.println(StringUtils.join(test,","));
        //在右边加下字符,使之总长度为6
        System.out.println(StringUtils.rightPad("abc", 6, 'T'));
        //首字母大写
        System.out.println(StringUtils.capitalize("abc"));
        //Deletes all whitespaces from a String 删除所有空格
        System.out.println( StringUtils.deleteWhitespace("   ab  c  "));
        //判断是否包含这个字符
        System.out.println( StringUtils.contains("abc", "ba"));
        //表示左边两个字符
        System.out.println( StringUtils.left("abc", 2));
        System.out.println(NumberUtils.stringToInt("33"));
<span style="font-family: Arial, Helvetica, sans-serif; font-size: 12px;"> }</span>

}


  • ListUtils
首先他有一个属性,EMPTY_LIST,它的源码如下:public static final List EMPTY_LIST = Collections.EMPTY_LIST,其实就是JDK中Collections的EMPTY_LIST。以后养成良好的习惯,比如我们在写一个接口的时候,返回值的类型是List,那么要是参数不符合情况时,我们就应该返回一个这个空集合。


package tz.web.dao.bean;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
import org.apache.commons.collections.Bag;
import org.apache.commons.collections.BidiMap;
import org.apache.commons.collections.Buffer;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.collections.IterableMap;
import org.apache.commons.collections.MapIterator;
import org.apache.commons.collections.OrderedMap;
import org.apache.commons.collections.bag.HashBag;
import org.apache.commons.collections.bidimap.TreeBidiMap;
import org.apache.commons.collections.buffer.UnboundedFifoBuffer;
import org.apache.commons.collections.map.HashedMap;
import org.apache.commons.collections.map.LinkedMap;

public class Linkin 
{
    public static void main(String[] args) 
    {
        //通过Iterator遍历得到一个map里的key和value
        IterableMap map = new HashedMap();
        map.put("a","1");
        map.put("b",new Integer(2));
        MapIterator it = map.mapIterator();
        while (it.hasNext()) 
        {
        Object key = it.next();
        Object value = it.getValue();
        System.out.println(">>key>>"+key+">>value>>"+value);
        }
        
        //得到集合里按顺序存放的key之后的某一Key
        OrderedMap map1 = new LinkedMap();
        map1.put("FIVE", "5");
        map1.put("SIX", "6");
        map1.put("SEVEN", "7");
        map1.firstKey();  // returns "FIVE"
        map1.nextKey("FIVE");  // returns "SIX"
        map1.nextKey("SIX");  // returns "SEVEN"
        System.out.println(map1.firstKey()+">>"+map1.nextKey("FIVE")+">>"+map1.nextKey("SIX"));
        
        //通过key得到value        * 通过value得到key        * 将map里的key和value对调
        BidiMap bidi = new TreeBidiMap();
        bidi.put("SIX", "6");
        bidi.get("SIX");  // returns "6"
        bidi.getKey("6");  // returns "SIX"
        //bidi.removeValue("6");  // removes the mapping
        BidiMap inverse = bidi.inverseBidiMap();  // returns a map with keys and values swapped
        System.out.println(inverse);
        
        //移除集合某一元素并返回移除的元素
        Buffer buffer = new UnboundedFifoBuffer();
        buffer.add("ONE");
        buffer.add("TWO");
        buffer.add("THREE");
        System.out.println(buffer.remove());  // removes and returns the next in order, "ONE" as this is a FIFO
        System.out.println(buffer.remove());  // removes and returns the next in order, "TWO" as this is a FIFO
        System.out.println(buffer);
        
        //得到两个集合中相同的元素
        List<String> list1 = new ArrayList<String>();
        list1.add("1");
        list1.add("2");
        list1.add("3");
        List<String> list2 = new ArrayList<String>();
        list2.add("2");
        list2.add("3");
        list2.add("5");
        Collection c = CollectionUtils.retainAll(list1, list2);//
        System.out.println(c);
        
        //复制多个对象保存到Bag对象中
        Bag bag = new HashBag();
        bag.add("ONE", 6);  // add 6 copies of "ONE"
        bag.remove("ONE", 2);  // removes 2 copies of "ONE"
        System.out.println(bag.getCount("ONE"));  // returns 4, the number of copies in the bag (6 - 2)
        for (Iterator ite = bag.iterator();ite.hasNext();)
        {
        System.out.println(ite.next());
        }
    }
    
}
   
  • Logging 
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

	public class CommonLogTest {
	 private static Log log = LogFactory.getLog(CommonLogTest.class);
	 //日志打印
	 public static void main(String[] args) {
		 log.error("ERROR");
		 log.debug("DEBUG");
		 log.warn("WARN");
		 log.info("INFO");
		 log.trace("TRACE");
	  System.out.println(log.getClass());
	 }

	}


1 绪论 1、1 什么是数据结构 1、2 基本概念和术语 1、3 抽象数据类型的表示与实现 1、4 算法和算法分析 1、4、1 算法 1、4、2 算法设计的要求 1、4、3 算法效率的度量 1、4、4 算法的存储空间需求 2 线性表 2、1 线性表的类型定义 2、2 线性表的顺序表示和实现 实验一 2、3 线性表的链式表示和实现 2、3、1 线性链表 2、3、2 循环链表 实验二 2、3、3 双向链表 2、4 一元多项式的表示及相加 3 栈和队列 3、1、0 栈 3、1、1 抽象数据类型栈的定义 3、1、2 栈的表示和实现 3、2、0 栈的应用举例 3、2、1 数制转换 3、2、2 括号匹配的检验 3、2、3 行编辑程序 实验三 3、2、4 迷宫求解 3、2、5 表达式求值 3、3、0 栈与递归的实现 3、4、0 队列 3、4、1 抽象数据类型队列的定义 3、4、2 链队列-队列的链式表示和实现 3、4、3 循环队列-队列的顺序表示和实现 3、5、0 离散事件模拟 4、0、0 串 4、1、0 串类型的定义 4、2、0 串的表示和实现 实验四 4、2、1 定长顺序存储表示 4、2、2 堆分配存储表示 4、2、3 串的块链存储表示 4、3、0 串的模式匹配算法 4、3、1 求子串位置的定位函数 4、3、2 模式匹配的一种改进算法 4、4、0 串操作应用举例 4、4、1 文本编辑 4、4、2 建立词索引表 5、0、0 数组和广义表 5、1、0 数组的定义 5、2、0 数组的顺序表示和实现 实验五 5、3、0 矩阵的压缩存储 5、3、1 特殊矩阵 5、3、2 稀疏矩阵 5、4、0 广义表的定义 5、5、0 广义表的存储结构 5、6、0 m元多项式的表示 5、7、0 广义表的递归算法 5、7、1 求广义表的深度 5、7、2 复制广义表 5、7、3 建立广义表的存储结构 单元测验 6、0、0 树和二叉树 6、1、0 树的定义和基本术语 6、2、0 二叉树 6、2、1 二叉树的定义 6、2、2 二叉树的性质 6、2、3 二叉树的存储结构 6、3、0 遍历二叉树和线索二叉树 6、3、1 遍历二叉树 实验六 6、3、2 线索二叉树 6、4、0 树和森林 6、4、1 树的存储结构 6、4、2 森林与二叉树的转换 6、4、3 树和森林的遍历 6、5、0 树与等价问题 6、6、0 赫夫曼树及其应用 6、6、1 最优二叉树 6、6、2 赫夫曼编码 6、7、0 回溯法与树的遍历 6、8、0 树的计数 7、0、0 图 7、1、0 图的定义和术语 7、2、0 图的存储结构 7、2、1 数组表示法 7、2、2 邻接表 7、2、3 十字链表 7、2、4 邻接多重表 7、3、0 图的遍历 7、3、1 深度优先搜索 7、3、2 广度优先搜索 7、4、0 图的连通性问题 7、4、1 无向图的连通分量和生成树 7、4、2 有向图的强连通分量 7、4、3 最小生成树 7、4、4 关节点和重迦通分量 7、5、0 有向无环图及其应用 7、5、1 拓扑排序 7、5、2 关键路径 7、6、0 最短路径 7、6、1 从某个源点到其余各顶点的最短路径 7、6、2 每一对顶点之间的最短路径 8、0、0 动态存储管理 8、1、0 概述 8、2、0 可利用空间表及分配方法 8、3、0 边界标识法 8、3、1 可利用空间表的结构 8、3、2 分配算法 8、3、3 回收算法 8、4、0 伙伴系统 8、4、1 可利用空间表的结构 8、4、2 分配算法 8、4、3 回收算法 8、5、0 无用单元收集 8、6、0 存储紧缩 9、0、0 查找 9、1、0 静态查找表 9、1、1 顺序表的查找 9、1、2 有序表的查找 9、1、3 静态树表的查找 9、1、4 索引顺序表的查找 9、2、0 动态查找表 9、2、1 二叉排序树和平衡二叉树 9、2、2 B—树和B+树 9、2、3 键树 9、3、0 哈希表 9、3、1 什么是哈希表 9、3、2 哈希函数的构造方法 9、3、3 处理冲突的方法 9、3、4 哈希表的查找及其分析 实验七 10、0、0 内部排序 10、1、0 概述 10、2、0 插入排序 10、2、1 直接插入排序 10、2、2 其它插入排序 10、2、3 希尔排序 10、3、0 快速排序 10、4、0 选择排序 10、4、1 简单选择排序 10、4、2 树形选择排序 10、4、3 堆排序 10、5、0 归并排序 实验八 10、6、0 基数排序 10、6、1 多关键字的排序 10、6、2 链式基数排序 10、7、0 各种内部排序方法的比较讨论 11、0、0 外部排序 11、0、1 外存信息的存取 11、0、2 外部排序
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值