黑马程序员_Java基础_字符串_13

                                       ------- android培训java培训、期待与您交流! ---------- 
 

导读:String概述,获取,判断,字符串转换,替换,切割,子串,大小写转换,去除空格,比较,字符串练习,基本数据类型(对象包装类),包装类新特性
 

 1、String(概述)

l  什么是API呢?APIJava提供给我们的应用程序接口,暴露出来的能让我们直接使用的部分。查API先想有什么功能,这功能运算完后有什么结果,按结果的类型查找的话,会比较方便。虽然有重复,但也能缩小范围。

l  把字符串定义成功能以便于操作这些字符串。很多种语言都有都有对于字符串的描述。在JAVA中描述字符串,用的是java.lang包中的类,叫做String。该类为final表示不能有子类,也就是说,它里面的操作字符串的功能是不能覆写的。任何一个用“”引起来的字符串,都是String的一个具体对象。

l  String s = newString();String s1=""是一回事。因此在建字符串的时候,这种new的方式不多见。

String s1 = “abc”//s1

l  class StringDemo

{

     publicstatic void main(String[] args)

     {

            /*

            Strings1 = "abc";//s1是一个类类型变量, "abc"是一个对象。

                                        //字符串最大特点:一旦被初始化就不可以被改变。

            Strings2 = new String("abc");//这两个使用起来是一样的,但是有区别。

            //s1s2有什么区别?s1在内存中有一个对象。s2在内存中有两个对象。

            System.out.println(s1==s2);

            System.out.println(s1.equals(s2));//String类复写了Object类中equals方法,复写了之后,它建立了自己对象独特的判断判断字符串内容是否相同的方法。字符串在内存中有一个常量池,存放abc这样的字符。

            */

            Strings = "abcde";

            method_1(s);

     }

     /*

     String类是对字符串事物的描述。该类定义了专门用于操作字符串的方法。"abc":

     */

     publicstatic void method_1(String s)

     {

            charch = s.charAt(3);

            System.out.println("ch="+ch);

            intnum = s.codePointAt(3);

            System.out.println("num="+num);

            Strings1 = "qq";

            s1= s1.concat("mm");

            System.out.println("s1="+s1);

            System.out.println("qq"+"mm");

            Stringa = "opq";

            Stringb = "opq";

            System.out.println("a==b:"+(a==b));

     }

}

 

2、常见功能-获取和判断

l  方法区中不仅有静态区(静态数据),动态区(方法数据),还有常量池。

l  我们学习字符串,主要学习两个,一个是字符串的特性,一但被初始化,就再改变。第二个,就是对于其方法的使用。

l  String类适用于描述字符串事物。

那么它就提供了多个方法对字符串进行操作。

常见的操作有哪些?

"abcd"1、它有长度。2、它由字符组成。3、某个字符在什么位置上。4、这个位置上有什么字符。

l  1>获取。(重要)

     1.1 字符串中的包含的字符数,也就是字符串的长度。

            intlength():获取长度,通过方法完成。(数组也有length,但他那个是属性没有括号)

     1.2 根据位置获取位置上某个字符。

            charcharAt(int index):

     1.3 根据字符获取该字符在字符串中位置。(不是char ch是因为它接收的是ASCII码)

            intindexOf(int ch):返回的是ch在字符串中第一次出现的位置。

            intindexOf(int ch, int fromIndex) :fromIndex指定位置开始,获取ch在字符串中出现的位置。

            intindexOf(String str):返回的是str指定子字符串在字符串中第一次出现的位置。

            intindexOf(String str, int fromIndex) :fromIndex指定位置开始,获取str在字符串中出现的位置。

            intlastIndexOf(int ch)        lastIndexOf(int ch) 返回指定字符在此字符串中最后一次出现处的索引。

      int codePointAt(int index):返回指定索引处的ASCII码。

l  2>判断。

     2.1 字符串中是否包含某一个子串。

            booleancontains(str):

                   特殊之处:indexOf(str):可以索引str第一次出现位置,如果返回-1.表示该str不在字符串中存在。(因此containsindexOf(str)都可以做这件事)所以,也可以用于对指定判断是否包含。if(str.indexOf("aa")!=-1) 说明包含。而且该方法即可以判断,有可以获取出现的位置。(只判断用contains(str)、如果即要做判断,又要拿位置的话,indexOf()最方便)

     2.2 字符中是否有内容。

            booleanisEmpty(): 原理就是判断长度是否为0. (区别“”指向对象。Null指向空。)

     2.3 字符串是否是以指定内容开头。

            booleanstartsWith(str);

     2.4 字符串是否是以指定内容结尾。

            booleanendsWith(str);

     2.5 判断字符串内容是否相同。复写了Object类中的equals方法。

            booleanequals(str);

     2.6 判断内容是否相同,并忽略大小写。

            booleanequalsIgnoreCase();

    

3、常见功能转换。

     3.1 将字符数组转成字符串。

            构造函数:String(char[]) (在字符串初始化的时候就可以完成这个操作)

                            String(char[],offset,count):将字符数组中的一部分转成字符串。

            静态方法:

                          staticString copyValueOf(char[]); (静态数组,无特有数据)

                          staticString copyValueOf(char[] data, int offset, int count)

                          static String valueOf(char[]);

     3.2 将字符串转成字符数组。**

            char[]toCharArray():

     3.3 将字节数组转成字符串。

                   String(byte[])

                   String(byte[],offset,count):将字节数组中的一部分转成字符串。

     3.4 将字符串转成字节数组。

                   byte[]  getBytes():

     3.5 将基本数据类型转成字符串。

            staticString valueOf(int)

            staticString valueOf(double)

        //3+"";String.valueOf(3);结果是一样的,但后面的一个显的比较专业,但麻烦。

特殊:字符串和字节数组在转换过程中,是可以指定编码表的。(但凡你在想做编码操作的时候,你要变成字节数组才可以)

 

4、常见功能—替换、切割和子串

替换:Stringreplace(oldchar,newchar);

String replace(CharSequencetarget, CharSequence replacement);字符串替换。(String的父类是CharSequence接口,CharSequence还有一个子类StringBuffer

切割

     String[]split(regex); //split中用“”引起来的部分可以是字符“,” 也可是字母“aa”将字符串分隔成字符串数组

子串。(获取字符串中的一部分)

     Stringsubstring(begin);

     Stringsubstring(begin,end);

 

5、常见功能大小写转换,去除空格,比较

     5.1 将字符串转成大写或则小写。

             String toUpperCase();

             String toLowerCase();

     5.2 将字符串两端的多个空格去除。

(在开发的时候很好用空格在有时不太注意就看不见,在登陆邮箱的时候把你的空格自动给我去了,不然会给我用户一种错觉,自己的账号被盗了。在注册邮箱的时候空格不能做为字符存在非法字符。)

            Stringtrim();

     5.3 对两个字符串进行自然顺序的比较。

            intcompareTo(string); //为什么字符串可以忽略大小写比较?因为不管是大字还是小写,全把你变小写再比较。

class StringMethodDemo

{

     publicstatic void method_5()

     {

            Strings = "    Hello Java     ";

            sop(s.toLowerCase());

            sop(s.toUpperCase());

            sop(s.trim());

            Strings1 = "a1c";

            Strings2 = "aaa";

            sop(s1.compareTo(s2)); //结果为48。返回的值是比较时相对应的第一个不相等的字符的ASC码值之差。(返回值:如果参数字符串等于此字符串,则返回值 0;如果此字符串按字典顺序小于字符串参数,则返回一个小于 0 的值;如果此字符串按字典顺序大于字符串参数,则返回一个大于 0 的值

     }

     publicstatic void method_sub()

     {

            Strings = "abcdef";

            sop(s.substring(2));//从指定位置开始到结尾。如果角标不存在,会出现字符串角标越界异常。

            sop(s.substring(2,4));//包含头,不包含尾。s.substring(0,s.length()); Java但凡是取从头到尾的部分,一般的都是包含头,不包含尾。因为头是0尾一般定义成对应的长度,长度减1是最后一个角标。

     }

     publicstatic void  method_split()

     {

            Strings = "zhagnsa,lisi,wangwu";//也可以取子串,也能把字符串都给取出来。但麻烦没有split

            String[]arr  = s.split(","); 

            for(intx = 0; x<arr.length; x++)

            {

                   sop(arr[x]);

            }

     }

     publicstatic void method_replace()

     {

            Strings = "hello java";

            //Strings1 = s.replace('q','n');//如果要替换的字符不存在,返回的还是原串。

            Strings1 = s.replace("java","world"); //s1是生成了一个新的字符串。

            sop("s="+s);   //它打印的还是"hellojava",字符串,一但被确定就不会被改变。

            sop("s1="+s1);

     }

     publicstatic void method_trans()

     {

            char[]arr = {'a','b','c','d','e','f'};

            Strings= new String(arr,1,3);  //1是起始位,3是个数。

            sop("s="+s);

            Strings1 = "zxcvbnm";

            char[]chs = s1.toCharArray();

            for(intx=0; x<chs.length; x++)

            {

                   sop("ch="+chs[x]);

            }

     }

     publicstatic void method_is()

     {

            Stringstr = "ArrayDemo.java";

            //判断文件名称是否是Array单词开头。

            sop(str.startsWith("Array"));

            //判断文件名称是否是.java的文件。

            sop(str.endsWith(".java"));

            //判断文件中是否包含Demo

            sop(str.contains(".java"));

     }

     publicstatic void method_get()

     {

            Stringstr = "abcdeakpf";

            sop(str.length());    //长度

            //根据索引获取字符。

            sop(str.charAt(4));//当访问到字符串中不存在的角标时会发生StringIndexOutOfBoundsException

            //根据字符获取索引

            sop(str.indexOf('m',3));//如果没有找到,返回-1.

            //反向索引一个字符出现位置。

            sop(str.lastIndexOf("a"));//从右边倒着开始数,数到第一个,字符a,但是角标还是正着的。返回结果为5

                   }

     publicstatic void main(String[] args)

     {

            method_7();

//          method_trans();

//          method_is();

//          method_get();

            /*

            Strings1 = "abc";

            Strings2 = new String("abc");

            Strings3 = "abc";

            System.out.println(s1==s2); //结果为false

            System.out.println(s1==s3);  //结果为true

            */

     }

     publicstatic void sop(Object obj)//也可以传入基本数据类型。是1.5之后,的新特性,自动进行类型的提升,装箱。

     {

            System.out.println(obj);

     }

}

 

6String字符串练习

l  字符串这些方法要求:必须会,会到什么程度?不查阅API文档,不借助Eclipce的高级联想功能。完全自己手写能写得出来。否则你给我别人说你有开发经验,鬼才相信。

l  写代码功能要尽量的细分,细分完之后呢,你修改起来会很方便。功能尽量独立出来,变成一个小的函数。被调用就可以了,它有很多好处,一,它可以被其他的很多的函数调用;二,里面怎么写我没有想到呢,但是我知道了思路是要反转的话,可以先把函数名定义出来。

/*

1.模拟一个trim方法,去除字符串两端的空格。

     思路:

     1,判断字符串第一个位置是否是空格,如果是继续向下判断,直到不是空格为止。

            结尾处判断空格也是如此。

     2,当开始和结尾都判断到不是空格时,就是要获取的字符串。

2.将一个字符串进行反转。将字符串中指定部分进行反转,"abcdefg";abfedcg

     思路:

     1,曾经学习过对数组的元素进行反转。

     2,将字符串变成数组,对数组反转。

     3,将反转后的数组变成字符串。

     4,只要将或反转的部分的开始和结束位置作为参数传递即可。

*/

class StringTest

{

     publicstatic void sop(String str)

     {

            System.out.println(str);

     }

     publicstatic void main(String[] args)

     {

            Strings = "      ab cd      ";

            sop("("+s+")");

            sop("("+reverseString(s)+")");

     }

     //练习二:将字符串反转。

     /*

     思路:

     1,将字符串变成数组。

     2,对数组反转。

     3,将数组变成字符串。

     */

     publicstatic String reverseString(String s,int start,int end) //函数重载

     {

            //字符串变数组。

            char[]chs = s.toCharArray();

            //反转数组。

            reverse(chs,start,end);

            //将数组变成字符串。

            returnnew String(chs);

     }

     publicstatic String reverseString(String s) //这个函数里面调用它的重载的函数

     {

            returnreverseString(s,0,s.length());

     }

     privatestatic void reverse(char[] arr,int x,int y)

     {

            for(intstart=x,end=y-1; start<end ; start++,end--)

            {

                   swap(arr,start,end);

            }

     }

     privatestatic void swap(char[] arr,int x,int y)

     {

            chartemp = arr[x];

            arr[x]= arr[y];

            arr[y]= temp;

     }

     //练习一,去除字符串两端空格。

     publicstatic String myTrim(String str)

     {

            intstart = 0,end = str.length()-1; //从最后一个数往前找

            while(start<=end&& str.charAt(start)==' ')

                   start++;

            while(start<=end&& str.charAt(end)==' ')

                   end--;

            returnstr.substring(start,end+1);

     }

}

 

/*

3,获取一个字符串在另一个字符串中出现的次数。

     "abkkcdkkefkkskk"

     思路:

     1,定义个计数器。

     2,获取kk第一次出现的位置。

     3,从第一次出现位置后剩余的字符串中继续获取kk出现的位置。

            每获取一次就计数一次。

     4,当获取不到时,计数完成。

*/

class StringTest2

{

     //练习三。

     publicstatic int getSubCount(String str,String key)

     {

            intcount = 0;

            intindex = 0;

            while((index=str.indexOf(key))!=-1)

            {

                   sop("str="+str);

                   str= str.substring(index+key.length());

                   count++;      

            }

            returncount;

     }

     //练习三,方式二。

     publicstatic int getSubCount_2(String str,String key)

     {

            intcount = 0;

            intindex = 0;

            while((index=str.indexOf(key,index))!=-1)

            {

                   sop("index="+index);

                   index = index + key.length();

                   count++;

            }

            returncount;

     }

     publicstatic void main(String[] args)

     {

            Stringstr = "kkabkkcdkkefkks";

            ///sop("count====="+str.split("kk").length);不建议使用。kk在开关结尾会切出一个空串出来

            sop("count="+getSubCount_2(str,"kk"));

     }

     publicstatic void sop(String str)

     {

            System.out.println(str);

     }

}

 

/*

4,获取两个字符串中最大相同子串。第一个动作:将短的那个串进行长度一次递减的子串打印。

     "abcwerthelloyuiodef"

     "cvhellobnm"

     思路:

            1,将短的那个子串按照长度递减的方式获取到。

            2,将每获取到的子串去长串中判断是否包含,

                   如果包含,已经找到!。

*/

class  StringTest3

{

     //练习四。

     publicstatic String getMaxSubString(String s1,String s2)

     {

            Stringmax = "",min = "";

            max= (s1.length()>s2.length())?s1: s2; //获取字符串中长的和短的

            min= (max==s1)?s2: s1;

            for(intx=0; x<min.length(); x++)  //大圈套小圈

            {

                   for(inty=0,z=min.length()-x; z!=min.length()+1; y++,z++)

                   {

                          Stringtemp = min.substring(y,z);

                          sop(temp);

                          if(max.contains(temp))//if(s1.indexOf(temp)!=-1)

                                 returntemp;

                   }

            }

            return"";

     }

     publicstatic void main(String[] args)

     {

            Strings1 = "ab";

            Strings2 = "cvhellobnm";

            sop(getMaxSubString(s2,s1));

     }

     publicstatic void sop(String str)

     {

            System.out.println(str);

     }

}

 

7StringBuffer常见功能添加、插入、删除、修改(这些方法要熟记)

l  StringBuffer:String一旦被确定就不能被修改,而StringBuffer是可以对于字符串做修改的。

l  StringBufferfinal的不能被继承。

l  StringBuffer是字符串缓冲区。是一个容器。

l  其中的append()方法,shortbyte类型的没有,其他的它都支持。为什么没有呢,因为有int类型提升了。

l  对于StringBuffer有一个面盆理论,加点面,还是这个盆,可点水还是这个盆。

l  我不想在后面添加,我想在前面添加,这个时候在StringBuffer中不叫添加而叫插入insert()

l  StringBuffer的特点:

1,长度是可变化的。(数组也是容器,但是它的长度是不可变化的)

2,可以直接操作多个数据类型。(数组一次只能操作一种数据类型)

3,最终会通过toString方法变成字符串。

l  什么时候用?

   当数据类型不确定,个数不确定,而且最终要变成字符串的时候。

l  C create U updateR read D delete

1,存储。

     StringBufferappend():将指定数据作为参数添加到已有数据结尾处。

     StringBufferinsert(index,数据):可以将数据插入到指定index位置。(index后面的顺延)

2,删除。

     StringBufferdelete(start,end):删除缓冲区中的数据,包含start,不包含end

     StringBufferdeleteCharAt(index):删除指定位置的字符。

3,获取。

     charcharAt(int index)

     intindexOf(String str)

     intlastIndexOf(String str)

     intlength()

Stringsubstring(int start) 

     Stringsubstring(int start, int end) //这里访问的还是String而不是StringBuffer.

4,修改。(把原来串中的数据改变一下)

     StringBufferreplace(start,end,String); //String是要替换成的字符串。

     voidsetCharAt(int index, char ch) ; //注意它是替换完就完事了,它不返回。

5,反转。

     StringBufferreverse();

6,将缓冲区中指定数据存储到指定字符数组中。

     voidgetChars(int srcBegin, int srcEnd, char[] dst, int dstBegin)

l  JDK1.5 版本之后出现了StringBuilder.

Ø  StringBuffer是线程同步。(安全的,在操作的时候不会出现其他的操作,即使是多线程情况也不会,单线程,效率低,它要判断锁)

Ø  StringBuilder是线程不同步。(不安全的,单线程,不需要判断锁,比较快捷)

以后开发,建议使用StringBuilder(它是后出来的)

StringBuilder一个可变的字符序列。此类提供一个与 StringBuffer 兼容的 API,但不保证同步。该类被设计用作 StringBuffer 的一个简易替换,用在字符串缓冲区被单个线程使用的时候(这种情况很普遍)。如果可能,建议优先采用该类,因为在大多数实现中,它比 StringBuffer 要快。将 StringBuilder 的实例用于多个线程是不安全的。如果需要这样的同步,则建议使用 StringBuffer。(多线程也可以用StringBuffer,要自己加锁lock()unlock())。

l  JDK升级三个因素:

1,提高效率。

2,简化书写。

3,提高安全性。

l  class Demo

{

}

class StringBufferDemo

{

public staticvoid main(String[] args)

{

        //method_update();

        StringBuildersb = new StringBuilder("abcdef");

        char[]chs = new char[6];

        sb.getChars(1,4,chs,1);//bcd存到角标中,包含头不包含尾。

        for(intx=0; x<chs.length; x++)

        {

               sop("chs["+x+"]="+chs[x]+";");

        }

       draw(3,6);

        draw(8,9);

 

//             StringBuildersb1 = new StringBuilder();

//             sb1.append(newDemo()).append(new Demo());

//             sop("sb1="+sb1);

}

public staticvoid method_update()

{

        StringBuffersb  = newStringBuffer("abcde");

//             sb.replace(1,4,"java"); //返回结果为:ajavae

        sb.setCharAt(2,'k');

        sop(sb.toString());

}

public staticvoid method_del()

{

        StringBuffersb  = newStringBuffer("abcde");//一初始化里面就有数据

        //sb.delete(1,3); //bc没了,含头不含尾。

        //sb.delete(0,sb.length());  //清空缓冲区。

        sb.deleteCharAt(2); //删除一个字符,其实也就是这个语句:sb.delete(2,3);,比用delete更方便。

        sop(sb.toString());

}

public staticvoid method_add()

{

        StringBuffersb = new StringBuffer();

        //sb.append("abc").append(true).append(34);//StringBuffer1返回的是本类缓冲区的对象,所以还能调用本类的方法,在后面再加上append();这叫做方法调用链。

//             StringBuffersb1 = sb.append(34);

//             sop("sb==sb1:"+(sb==sb1));   //sbsb1指向的是同一个对象返回的结果是true.

        sb.insert(1,"qq");

        sop(sb.toString());//abctrue34

        //sop(sb1.toString());

}

public staticvoid sop(String str)

{

        System.out.println(str);

}

public staticvoid draw(int row,int col)

{

        StringBuildersb = new StringBuilder();

        for(intx=0; x<row; x++)

        {

               for(inty=0; y<col; y++)

               {

                      sb.append("*");

               }

               sb.append("\r\n");

        }

        sop(sb.toString());

}

}

 

8、基本数据类型-对象包装类

l  按照JAVA面向对象的原则JAVA将万事万物都视为对象,包括基本数据类型。整数就是一个数值,你把它变为对象,到底想干什么呢?

l  Int型有一定的取值范围,有多种表现形式,我怎样把Int型变成其他的表现形式呢?整数自己最清楚。把整数变成对象,里面如果定义这样的功能的话,我们指挥起整数来是不是很方便。

l  基本数据类型对象包装类。

byte     Byte

short    short

int        Integer

long     Long

boolean Boolean

float    Float

double Double

char      Character

l  基本数据类型对象包装类的最常见作用,就是用于基本数据类型和字符串类型之间做转换

l  基本数据类型转成字符串。

     基本数据类型+""

     基本数据类型.toString(基本数据类型值);

     如:Integer.toString(34);//34整数变成"34";

字符串转成基本数据类型。(上网时,文本框中的数据,全都是字符串,想要参与运算,必须做转换)

     xxx a =Xxx.parseXxx(String);

     int a =Integer.parseInt("123"); //这个是静态的方法(下面有非静态的方法)

     double b =Double.parseDouble("12.23");

     boolean b= Boolean.parseBoolean("true"); //“true”和不一样

     Integer i= new Integer("123"); //这个不是非静态的方法

     int num =i.intValue();

l  十进制转成其他进制。

  toBinaryString();

  toHexString();

  toOctalString();

其他进制转成十进制。

  parseInt(string,radix);

class IntegerDemo

{

public staticvoid sop(String str)

{

        System.out.println(str);

}

public staticvoid main(String[] args)

{

        //整数类型的最大值。

        //sop("intmax :"+Integer.MAX_VALUE); //静态的不用自己算231-1了。当你在运算的时候,当你要做一个安全性的判断,看是否超出了范围时用。

//             将一个字符串转成整数。

        int num= Integer.parseInt("123");//必须传入数字格式的字符串。

        //longx = Long.parseLong("123");

//             sop("num="+(num+4));

//             sop(Integer.toBinaryString(-6));

//             sop(Integer.toHexString(60));

        int x =Integer.parseInt("3c",16); //16为进制,它会按指定的进制转换“”中的数。

        sop("x="+x);

}

}

 

9、基本数据类型对象包装类新特性

//JDK1.5版本以后出现的新特性。

class IntegerDemo1

{

     publicstatic void main(String[] args)

     {

           

//          Integerx = new Integer(4);

            Integerx = 4;//1.5自动装箱。//4相当于new Integer(4)x是引用型类型,等号右边必然是一个对象。这个升级是为了简化书写。如果要使用1.5版本后的新特性的话,x除了取整数值以外,还多了一个值叫做null. 不要忘了要做判断,不为空的时候才能参于运算,为空要小心空指针异常,一抛异常程序会停掉,因为它是一个RuntimeException.

            x =x/*拆箱原理:x.intValue() */ +2; //x+2:x 进行自动拆箱。变成成了int类型。和2进行加法运算。之后再将和进行装箱赋给x

            Integerm = 128;

            Integern = 128;

            sop("m==n:"+(m==n));//结果为false;两个对象

            Integera = 127; //byte范围:-128~127,超过的话,会开辟新空间,不超过的话,为了节省空间,是不会开辟的,如果127在的话。

            Integerb = 127;

            sop("a==b:"+(a==b));//结果为true。因为ab指向了同一个Integer对象。因为当数值在byte范围内容,对于新特性,如果该数值已经存在,则不会在开辟新的空间。

     }

     publicstatic void method()

     {

            Integerx = new Integer("123");

            Integery = new Integer(123);

            sop("x==y:"+(x==y)); //两个对象,不相等

            sop("x.equals(y):"+x.equals(y)); //重写了Object类中的equals方法。建立了本对象比较相同的特有的方式。比较的是数据是否相同。结果为true.

     }

     publicstatic void sop(String str)

     {

            System.out.println(str);

     }

}

 

int compareTo(Integer anotherInteger):跟字符串差不多,都是ASCII排序


                                      ------- android培训java培训、期待与您交流! ----------  

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值