A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区






6、集合

6.1 常用对象

    6.1.1 String、StringBuffer和StringBuilder

    String类的特点:
    字符串对象一旦被初始化就不会被改变。

    示例1:
  1. public class StringDemo{
  2.        public static void main(String[] args){
  3.             String s = "abc";
  4.             s = "nba";
  5.             System.out.println("s = " + s);
  6.       }
  7. }
复制代码
   运行结果:

    原因分析:
    "abc"字符串对象并没有被改变,只是引用变量s指向了新创建的字符串对象"nba"。

    示例2:
  1. public class StringDemo{
  2.        public static void main(String[] args){
  3.             String s1 = "abc";
  4.             String s2 = "abc";
  5.             System.out.println(s1 == s2);
  6.       }
  7. }
复制代码
    运行结果:

    原因分析:
    字符串创建的时候,有一个字符串常量池,s1创建后,"abc"放入其中。s2创建的时候,"abc"已经存在于字符串常量池中,故引用变量s2直接指向了已经存在的"abc"字符串对象,故s1==s2。

    示例3:
  1. public class StringDemo{
  2.        public static void main(String[] args){
  3.             String s1 = "abc";
  4.             String s2 = new String("abc" );
  5.             System.out.println(s1 == s2);
  6.       }
  7. }
复制代码
    运行结果:

    原因分析:
    s1创建后,是在字符串常量池中创建了一个"abc"字符串对象。而s2是在堆内存中创建了另外一个"abc"字符串对象。所以,两个对象不是同一个对象。

    示例4:
  1. public class StringDemo{
  2.        public static void main(String[] args){
  3.             String s1 = "abc";
  4.             String s2 = new String("abc" );
  5.             System.out.println(s1.equals(s2));
  6.       }
  7. }
复制代码
    运行结果:

    原因分析:
    String类复写了Object中的equals方法,建立了String类自己的判断字符串对象是否相同的依据。只比较字符串内容,不比较地址。

    String类的构造函数

    构造函数:String(bytes[] bytes)
   

    示例1:
  1. public class StringConstructorDemo {
  2.        public static void main(String[] args){
  3.              StringConstructorDemo();
  4.       }

  5.        public static void StringConstructorDemo(){
  6.             String s = new String();//等效于String s = "";不等效于String s = null;
  7.             
  8.             byte[] arr = {65,66,67,68};
  9.             String s1 = new String(arr);
  10.             System.out.println("s1 = " + s1);
  11.       }
  12. }
复制代码
   运行结果:

    构造函数:String(bytes[] bytes)


    示例2:
  1. public class StringConstructorDemo {
  2.        public static void main(String[] args){
  3.              StringConstructorDemo();
  4.       }

  5.        public static void StringConstructorDemo(){
  6.             char[] arr = {'w' ,'a' ,'p' ,'q' ,'x' };
  7.             String s = new String(arr);
  8.             System.out.println( "s = " + s);
  9.       }
  10. }
复制代码
   运行结果:

    构造函数:String(bytes[] bytes)


    示例3:
  1. public class StringConstructorDemo{
  2.        public static void main(String[] args){
  3.             StringConstructorDemo();
  4.       }

  5.       public static void StringConstructorDemo(){
  6.             char[] arr = {'w' ,'a' ,'p' ,'q' ,'x' };
  7.             String s = new String(arr,1,3);
  8.             System.out.println( "s = " + s);
  9.       }
  10. }
复制代码
   运行结果:

    String类部分方法

    1、获取
    获取字符串中字符的个数(长度)
    int length();

    示例1:
  1. public class StringMethodDemo {
  2.        public static void main(String[] args){
  3.              StringMethodDemo();
  4.       }

  5.       public static void StringMethodDemo() {
  6.             String s = new String("abcde" );
  7.             System.out.println( "len = " + s.length());
  8.       }
  9. }
复制代码
    运行结果:

    根据位置获取字符
    char charAt(int index);

    示例2:
  1. public class StringMethodDemo{
  2.        public static void main(String[] args){
  3.             StringMethodDemo();
  4.       }

  5.        public static void StringMethodDemo(){
  6.             String s = "abcde";
  7.             System.out.println( "char:" + s.charAt(2));
  8.       }
  9. }
复制代码
   运行结果:

    根据字符获取在字符串中的位置
    int indexOf(int ch);
    indexO方法参数f类型为int是为了既可以支持字符,也可以支持字符在ASCII码中对应的数字。

    从指定位置开始查找ch第一次出现的位置。
    int indexOf(int ch,int fromIndex);

    int indexOf(String str);
    int indexOf(String str,int fromIndex);


    根据字符串获取在字符串中第一次出现的位置。
    int lastIndexOf(int ch);
    int lastIndexOf(int ch,int fromIndex);
    int lastIndexOf(String str);
    int lastIndexOf(String str,int fromIndex);      

    示例3:
  1. public class StringMethodDemo{
  2.        public static void main(String[] args){
  3.             StringMethodDemo();
  4.       }

  5.        public static void StringMethodDemo(){
  6.             String s = "abcdae";
  7.             System.out.println( "index:" + s.indexOf('a' ));
  8.             System.out.println( "index:" + s.indexOf('k' ));
  9.             System.out.println( "lastIndex:" + s.lastIndexOf('a' ));
  10.       }
  11. }
复制代码
   运行结果:

    P.S.
    可以根据-1,来判断该字符或者字符串是否存在。

    获取字符串中的一部分字符串,也叫子串。
    String substring(int beginIndex,int endIndex);
    String substring(int beginIndex);


    示例4:
  1. public class StringMethodDemo{
  2.        public static void main(String[] args){
  3.             StringMethodDemo();
  4.       }

  5.        public static void StringMethodDemo(){
  6.             String s = "abcdae";
  7.             System.out.println( "substring:" + s.substring(2));
  8.             System.out.println( "substring:" + s.substring(2,4));
  9.       }
  10. }
复制代码
   运行结果:

     2、转换

    将字符串变成字符串数组(字符串的切割)
    String[] split(String regex);涉及到正则表达式。

    示例5:
  1. public class StringMethodDemo {
  2.        public static void main(String[] args){
  3.              StringMethodDemo();
  4.       }

  5.        public static void StringMethodDemo(){
  6.             String s = "张三,李四,王五" ;
  7.             String[] arr = s.split( ",");
  8.             
  9.              for(int i = 0; i < arr.length; i++){
  10.                   System.out.println(arr[i]);
  11.             }
  12.       }
  13. }
复制代码
   运行结果:

    示例6:  
  1. public class StringMethodDemo{
  2.        public static void main(String[] args){
  3.             StringMethodDemo();
  4.       }

  5.       public static void StringMethodDemo(){
  6.             String s = "张三.李四.王五" ;
  7.             String[] arr = s.split( "\\.");
  8.             
  9.              for(int i = 0; i < arr.length; i++){
  10.                   System.out.println(arr[i]);
  11.             }
  12.       }
  13. }
复制代码
    运行结果:

    P.S.
    点在正则表达式中是特殊符号,需要转义。

    将字符串变成字符数组
    char[] toCharArray();

    示例7:
  1. public class StringMethodDemo{
  2.        public static void main(String[] args){
  3.             StringMethodDemo();
  4.       }

  5.        public static void StringMethodDemo(){
  6.             String s = "张三.李四.王五" ;
  7.              char[] chs = s.toCharArray();
  8.             
  9.              for(int i = 0; i < chs.length; i++){
  10.                   System.out.println(chs[i]);
  11.             }
  12.       }
  13. }
复制代码
   运行结果:

   
将字符串变成字节数组
    char[] getBytes();

    示例8:
  1. public class StringMethodDemo{
  2.        public static void main(String[] args){
  3.             StringMethodDemo();
  4.       }

  5.        public static void StringMethodDemo(){
  6.             String s = "ab你" ;
  7.              byte [] bytes = s.getBytes();
  8.            
  9.              for (int i = 0; i < bytes.length; i++){
  10.                   System.out.println(bytes[i]);
  11.             }
  12.       }
  13. }
复制代码
    运行结果:

    将字符串中的字母转成大小写
    String toUpperCase();大写
    String toLowerCase();小写
    示例9:
  1. public class StringMethodDemo{
  2.        public static void main(String[] args){
  3.             StringMethodDemo();
  4.       }

  5.        public static void StringMethodDemo(){
  6.             System.out.println( "Abc".toUpperCase());
  7.       }
  8. }
复制代码
    运行结果:

    将字符串中的内容进行替换
    String replace(char oldCh,char newCh);
    String replace(String s1,String s2);


    示例10:
  1. public class StringMethodDemo{
  2.        public static void main(String[] args){
  3.             StringMethodDemo();
  4.       }

  5.        public static void StringMethodDemo(){
  6.             String s1 = "java";
  7.             String s2 = s1.replace( 'a','o' );
  8.             String s3 = s1.replace( 'q','o' );

  9.             System.out.println(s2);
  10.             System.out.println(s3);
  11.             System.out.println(s1 == s3);
  12.       }
  13. }
复制代码
   运行结果:

    P.S.
    replace方法如果没有找到要替换的内容,则返回的还是原字符串。

    去除字符串两端空格
    String trim();


    示例11:
  1. public class StringMethodDemo {
  2.        public static void main(String[] args){
  3.             StringMethodDemo();
  4.       }

  5.        public static void StringMethodDemo(){
  6.             System.out.println( "-" + "   ab  c    " .trim() + "-");
  7.       }
  8. }
复制代码
   运行结果:

    将字符串进行连接

    String concat(String str);

    示例12:
  1. public class StringMethodDemo{
  2.        public static void main(String[] args){
  3.             StringMethodDemo();
  4.       }

  5.        public static void StringMethodDemo(){
  6.             System.out.println( "abc".concat("kk" ));
  7.             System.out.println( "abc" + "kk" );
  8.       }
  9. }
复制代码
    运行结果:

    P.S.
    concat效果与"+"连接符效果一致,但是效果更高一些。

    将其他类型数据转换成字符串

    示例13:
  1. public class StringMethodDemo{
  2.        public static void main(String[] args){
  3.             StringMethodDemo();
  4.       }

  5.        public static void StringMethodDemo(){
  6.             System.out.println(String.valueOf(4) + 1);
  7.             System.out.println( "" + 4 + 1);
  8.       }
  9. }
复制代码
   运行结果:

    3、判断

    两个字符串内容是否相同呢?
    boolean equals(Object obj);
    boolean equalsIgnoreCase(String str);忽略大小写比较字符串内容。


    示例14:
  1. public class StringMethodDemo {
  2.        public static void main(String[] args){
  3.              StringMethodDemo();
  4.       }

  5.        public static void StringMethodDemo(){
  6.             String s = "abc";
  7.             System.out.println(s.equalsIgnoreCase("ABC" ));
  8.       }
  9. }
复制代码
   运行结果:

    字符串中是否包含指定字符串
    boolean contains(String str);

    示例15:
  1. public class StringMethodDemo{
  2.        public static void main(String[] args){
  3.             StringMethodDemo();
  4.       }

  5.        public static void StringMethodDemo(){
  6.             String s = "abc";
  7.             System.out.println(s.contains( "bc"));
  8.       }
  9. }
复制代码
    运行结果:

    3.3 字符串是否以指定字符串开头,是否以指定字符串结尾
    boolean startsWith(String str);
    boolean endsWith(String str);


    示例16:
  1. public class StringMethodDemo{
  2.        public static void main(String[] args){
  3.             StringMethodDemo();
  4.       }

  5.        public static void StringMethodDemo(){
  6.             String str = "ArrayDemo.java";
  7.             System.out.println(str.startsWith( "Array"));
  8.             System.out.println(str.endsWith( "java"));
  9.       }
  10. }
复制代码
   运行结果:

    4、比较
    int compareTo(String str);
    如果参数字符串等于此字符串,则返回值0;如果此字符串按字典顺序小于字符串参数,则返回一个小于0的值;如果此字符串按字典顺序大于字符串参数,则返回一个大于0的值。

    示例17:
  1. public class StringMethodDemo {
  2.        public static void main(String[] args){
  3.              StringMethodDemo();
  4.       }

  5.        public static void StringMethodDemo(){
  6.             System. out.println("a" .compareTo("A"));
  7.       }
  8. }
复制代码
    运行结果:

    示例18:
  1. public class StringMethodDemo{
  2.        public static void main(String[] args){
  3.             StringMethodDemo();
  4.       }

  5.        public static void StringMethodDemo(){
  6.             System.out.println( "abc".compareTo("aqz" ));
  7.       }
  8. }
复制代码
    运行结果:

    P.S.
    "abc"和"aqz"两个字符串比较,'a'和'a'相等,'b' - 'q' = -15,'c'和'z'也就没有必要比较。

    5、返回字符串对象的规范化表示形式

    String intern();
    当调用intern方法时,如果池已经包含一个等于此String对象的字符串(用equals(Object)方法确定),则返回池中的字符串。否则,将此String对象添加到池中,并返回此String对象的引用。

    示例19:
  1. public class StringMethodDemo{
  2.        public static void main(String[] args){
  3.             StringMethodDemo();
  4.       }

  5.        public static void StringMethodDemo(){
  6.             String s1 = new String("abc" );
  7.             String s2 = s1.intern();

  8.             System.out.println(s1 == s2);
  9.       }
  10. }
复制代码
   运行结果:

     练习
    1、给定一个字符串数组,按照字典顺序进行从小到大的排序。
    {"nba","abc","cba","zz","qq","haha"}


    思路:
    ①对数组排序,可以用选择,冒泡都行。
    ②for嵌套、比较以及换位。
    ③使用String类中提供的用于字符串比较的功能进行比较。


    代码:
  1. public class StringTest{
  2.        public static void main(String[] args){
  3.             String[] arr = { "nba","abc" ,"cba" ,"zz" ,"qq" ,"haha" };

  4.             printArray(arr);
  5.             sortString(arr);
  6.             printArray(arr);
  7.       }

  8.        public static void printArray(String[] arr){
  9.              System.out.print( "[");
  10.              for(int i = 0; i < arr.length; i++){
  11.                    if(i != arr.length -1)
  12.                         System.out.print(arr[i] + ",");
  13.                    else
  14.                         System.out.println(arr[i] + "]");
  15.             }
  16.       }

  17.        public static void sortString(String[] arr){
  18.              for(int i = 0; i < arr.length - 1; i++){
  19.                    for(int j = i + 1; j < arr.length; j++){
  20.                          if(arr[i].compareTo(arr[j])>0){
  21.                               swap(arr,i,j);
  22.                         }
  23.                   }
  24.             }
  25.       }

  26.        private static void swap(String arr[],int i, int j){
  27.             String temp = arr[i];
  28.             arr[i] = arr[j];
  29.             arr[j] = temp;
  30.       }
  31. }
复制代码
   运行结果:

    2、一个子串在整串中出现的次数    "nbaernbatynbauinbaopnba"

    思路:
    ①要找的子串是否存在,如果存在获取其出现的位置,这个可以使用indexOf完成。
    ②如果找到了,那么就记录出现的位置并在剩余的字符串中继续查找该子串,而剩余字符串的起始位是出现位置+子串的长度。
    ③以此类推,通过循环完成查找,如果找不到就是-1,并且每次找到用计数器记录。

    代码:
  1. public class StringTest{
  2.        public static void main(String[] args){
  3.             String str = "nbaernbatynbauinbaopnba";
  4.             String key = "nba";
  5.             
  6.              int count = getKeyStringCount(str,key);
  7.              System.out.println( "count = " + count);
  8.       }

  9.       public static int getKeyStringCount(String str,String key){
  10.              //1、定义计数器
  11.              int count = 0;

  12.              //2、定义变量记录key出现的位置
  13.              int index = 0;

  14.              while((index = str.indexOf(key)) != -1){
  15.                   str = str.substring(index + key.length());
  16.                   count++;
  17.             }

  18.              return count;
  19.       }
  20. }
复制代码
   运行结果:

    3、两个字符串中最大相同的子串
    "qwerabcdtyuiop"
    "xcabcdvbn"


    思路:
   
①既然取的是最大子串,先看短的那个字符串是否在长的那个字符串中。如果存在,短的那个字符串就是最大子串。

    如果不是,那么就将短的那个子串进行长度递减的方式去子串,去子串中判断是否存在。如果存在就已找到,就不用再找了。

    代码:
  1. public class StringTest{
  2.        public static void main(String[] args){
  3.             String s1 = "qwerabcdtyuiop";
  4.             String s2 = "xcabcdvbn";
  5.             String s = getMaxSubstring(s1,s2);
  6.             System.out.println( "s = " + s);
  7.       }

  8.        public static String getMaxSubstring(String s1,String s2){

  9.             String max = null,min = null;
  10.             max = (s1.length() > s2.length())?s1:s2;
  11.             min = max.equals(s1)?s2:s1;

  12.              for(int i = 0; i < min.length(); i++){
  13.                    for(int a = 0,b = min.length() - i; b != min.length() + 1; a++,b++){
  14.                         String sub = min.substring(a,b);
  15.                          if(max.contains(sub))
  16.                                return sub;
  17.                   }
  18.             }
  19.              return null ;
  20.       }
  21. }
复制代码
    运行结果:

    4、模拟一个trim功能方法,去除字符串两端的空白。

    思路:
    ①定义两个变量。
    一个变量作为从头开始判断字符串空格的角标,不断++。
    一个变量作为从尾开始判断字符串空格的角标,不断--。
    ②判断到不是空格为止,取头部之间的字符串即可。


    代码:
  1. public class StringTest{
  2.        public static void main(String[] args){
  3.             String s = "   ab   c    " ;

  4.             s = myTrim(s);
  5.             System.out.println( "-" + s + "-" );
  6.       }

  7.        public static String myTrim(String s){
  8.              int start = 0,end = s.length() - 1;

  9.              while(start <= end && s.charAt(start) == ' '){
  10.                   start++;
  11.             }

  12.              while(start <= end && s.charAt(end) == ' '){
  13.                   end--;
  14.             }
  15.              return s.substring(start,end + 1);
  16.       }
  17. }
复制代码
   运行结果:

    StringBuffer
    StringBuffer:就是字符串缓冲区,用于存储数据的容器。

    特点:
    1. 长度是可变的。
    2. 可以存储不同类型数据。
    3. 最终要转成字符串进行使用。

    P.S.
    StringBuffer的字符串缓冲区初始容量为16个字符,其实质还是数组。

    StringBuffer既然是一个容器对象,应该具备什么功能呢?

    1、添加

    StringBuffer append(data);
    StringBuffer insert(index,data);

    示例:
  1. public class StringBufferDemo{
  2.        public static void main(String[] args){
  3.             bufferMethodDemo();
  4.       }

  5.        public static void bufferMethodDemo(){
  6.             //创建缓冲区对象
  7.             StringBuffer sb1 = new StringBuffer();
  8.             StringBuffer sb2 = sb1.append(4);

  9.             System.out.println(sb1);
  10.             System.out.println(sb2);
  11.             System.out.println(sb1 == sb2);

  12.             System.out.println(sb1.append(5));
  13.             System.out.println(sb1.append(6).append(7));
  14.       }
  15. }
复制代码
   运行结果:


    原因分析:
    sb1.append(4);语句是在缓冲区中添加4,然后将sb2引用变量指向了最终生成的字符串对象,sb1也指向这个新生成的字符串对象,故两者指向的是同一个对象。

    示例:
  1. public class StringBufferDemo{
  2.        public static void main(String[] args){
  3.             bufferMethodDemo();
  4.       }

  5.        public static void bufferMethodDemo(){
  6.             StringBuffer sb = new StringBuffer();
  7.             sb.append(4).append(5);
  8.             sb.insert(1, "haha");
  9.             System.out.println(sb.toString());
  10.       }
  11. }
复制代码
   运行结果:


    P.S.
    insert方法也可以对字符串进行修改。

    2、删除
    StringBuffer delete(int start,int end);包含头,不包含尾。
    StringBuffer deleteCharAt(int index):删除指定位置的元素。

    示例:
  1. public class StringBufferDemo {
  2.        public static void main(String[] args){
  3.             bufferMethodDemo();
  4.       }

  5.        public static void bufferMethodDemo(){
  6.             StringBuffer sb = new StringBuffer("abcd" );
  7.             sb.delete(1,3);
  8.             System.out.println(sb);

  9.              //清空缓冲区
  10.             sb.delete(0,sb.length());
  11.             System.out.println(sb);
  12.       }
  13. }
复制代码
   运行结果:


    3、查找
    char charAt(int index);
    int indexO(String str);
    int lastIndexOf(String str);


    4、修改
    StringBuffer replace(int start,int end,String str);
    void setCharAt(int index,char ch);


    示例:
  1. public class StringBufferDemo{
  2.        public static void main(String[] args){
  3.             bufferMethodDemo();
  4.       }

  5.        public static void bufferMethodDemo(){
  6.             StringBuffer sb = new StringBuffer("abcd" );
  7.             
  8.             sb.replace(1,3,"nba");         
  9.             System.out.println(sb);

  10.             sb.setCharAt(2, 'q');
  11.             System.out.println(sb);
  12.       }
  13. }
复制代码
   运行结果:

    5、其他方法
    void setLength(int newLength);设置字符序列的长度
    public StringBuffer reverse();将字符序列用其反转形式取代

    示例:
  1. public class StringBufferDemo{
  2.        public static void main(String[] args){
  3.             bufferMethodDemo();
  4.       }

  5.       public static void bufferMethodDemo(){
  6.             StringBuffer sb = new StringBuffer("abcd" );
  7.             
  8.             sb.setLength(2);
  9.             System.out.println( "sb:" + sb);
  10.             System.out.println( "len" + sb.length());

  11.             sb.setLength(10);
  12.             System.out.println( "sb:" + sb);
  13.             System.out.println( "len" + sb.length());

  14.             System.out.println(sb.reverse());
  15.       }
  16. }
复制代码
    运行结果:

     P.S.
    1、使用setLength设置StringBuffer中字符序列的长度。
        如果小于已有字符序列的长度,相当于清除缓冲区中的一部分内容。
        如果大于已有字符序列的长度,相当于扩充缓冲区,扩充部门内容用空格字符填充。
    2、当创建的StringBuffer内容长度大于16,将会新创建一个新数组,长度比旧数组要长。然后把就数组的内容拷贝到新的数组,超出旧数组长度范围的内容将会放在新数组现在内容的后面,也可以通过StringBuffer(int capacity);构造函数自己设置StringBuffer缓冲区长度。

    StringBuilder

    jdk1.5以后出现了功能和StringBuffer一模一样的对象,就是StringBuilder。

    不同的是:
    StringBuffer是线程同步的,通常用于多线程。
    StringBuilder是线程不同步的,通常用于单线程,它的出现能够提高程序效率。
    故StringBuilder多用于多个线程是不安全的,如果需要这样的同步,则建议使用StringBuffer。


    P.S.
    JDK一般升级目的:
    1、简化书写。
    2、提高效率。
    3、增加安全性。


   示例:将一个int数组变成字符串。
  1. class StringBuilderTest{
  2.        public static void main(String[] args){
  3.             int[] arr = {3,1,5,4,8};
  4.             String s = arrayToString(arr);

  5.             System.out.println(s);
  6.       }

  7.        public static String arrayToString(int[] arr){
  8.             StringBuilder sb = new StringBuilder();
  9.             sb.append( "[");
  10.              for(int i = 0; i < arr.length; i++){
  11.                    if(i != arr.length - 1)
  12.                         sb.append(arr[i]).append( ",");
  13.                    else
  14.                         sb.append(arr[i]).append( "]");
  15.             }
  16.              return sb.toString();
  17.       }
  18. }
复制代码
   运行结果:

~END~



~爱上海,爱黑马~


50 个回复

倒序浏览
阳哥威武!
回复 使用道具 举报
辛苦啦~~谢谢!
回复 使用道具 举报
x辛苦了!
回复 使用道具 举报
学习啦   
回复 使用道具 举报
可以看看
回复 使用道具 举报
{:2_30:}
回复 使用道具 举报

辛苦啦~~谢谢!
回复 使用道具 举报
辛苦啦~~谢谢!
回复 使用道具 举报
辛苦啦 ,谢谢!
回复 使用道具 举报

辛苦啦~~谢谢!
回复 使用道具 举报
赶紧出PDF,方便学习。
回复 使用道具 举报
MQ_H 中级黑马 2015-6-18 10:15:10
13#
Thanks,,,
回复 使用道具 举报
复习and巩固
回复 使用道具 举报
求分啊,。。

Screenshot_2015-06-26-23-03-48.png (46.14 KB, 下载次数: 95)

Screenshot_2015-06-26-23-03-48.png
回复 使用道具 举报
很不错的 。谢谢
回复 使用道具 举报 1 0
顶完再看。赞赞赞!!!
回复 使用道具 举报
受益匪浅,赞一个
回复 使用道具 举报
赞,刚学过,回顾一下,加深印象!! ! ! ! ! !  ! ! ! !
回复 使用道具 举报
学习了,有几题还要多练习~
回复 使用道具 举报
123下一页
您需要登录后才可以回帖 登录 | 加入黑马