Java 習題8 參考答案及解析

1.問答題

  1. “\hello”是正確的字符串常量嗎?
  2. “你好KU”.length()和”\n\t\t”.length()的值分別是多少?
  3. “Hello”.equals(“hello”)和”java”.equals(“java”)的值分別是多少?
  4. “Bird”.compareTo(“Bird fly”)的值是正數還是負數?
  5. “I love this game”.contains(“love”)的值是true嗎?
  6. “RedBird”.indexOf(“Bird)的值是多少?”RedBird”.indexOf(“Cat”)的值是多少?
  7. 執行”Integer.parseInt(“12.9”);”會發生異常嗎?

問答題解析

1.不是。“\hello”是。


2.4和3。.length()返回字符串的長度,第二個字符串時由三個轉義字符構成的。


3.false和true。String對象調用equals(String s)方法比較當前String對象的字符序列是否與參數s指定的String對象的字符序列相同,是區分大小寫的,所以第一個爲false。


4.負數。String對象調用compareTo(String s)方法,按字典序與指定的String對象s的字符序列比較大小。如果當前String對象的字符序列與s的相同,該方法返回0;如果大於s的字符序列,該方法返回正值,如果小於s的字符序列,該方法返回負值。


5.是true。
String對象調用contains方法判斷當前String對象的字符序列是否包含參數s的字符序列


6.3和-1
String 對象的字符序列索引位置從0開始。String對象調用方法indexOf(String str)從當前String對象的字符序列的0索引位置開始檢索首次出現str的字符序列的位置,並返回該位置。如果沒有檢索到,該方法返回的值是-1。


7.會發生NumberFormatException異常,因爲字符序列是浮點格式的,不能用int轉換.


2.選擇題

(1)下列哪個敘述是正確的?
A.String 類是final類,不可以有子類。
B.String類在java.util包中。
C.”abc”==”abc”的值是false。
D.”abc”.equals(“Abc”)的值是true。


(2)下列哪個表達式是正確的(無編譯錯誤)?
A.int m=Float.parseFloat(“567”);
B. int m = Short.parseShort(“567”);
C.byte m = Integer.parseInt(“2”);
D.float m = Float.parseDouble(“2.9”);


(3)對於如下代碼,下列哪個敘述是正確的?
A.程序編譯出現錯誤。
B.程序標註的【代碼】的輸出結果是bird。
C.程序標註的【代碼】的輸出結果是fly。
D.程序標註的【代碼】的輸出結果是null。

Java
public class E{
  public static void main(String [] args){
    String strOne="bird";
    String strTwo = strOne;
    strOne="fly";
    System.out.println(strTwo);//【代碼】
    }
 }

(4)對於下列代碼,下列哪個敘述是正確的?
A.程序出現編譯錯誤。
B.無編譯錯誤,在命令行執行程序”Java E I love this game”,程序輸出this。
C.無編譯錯誤,在命令行執行程序”Java E let us go”,程序無運行異常。
D.無編譯錯誤,在命令行執行程序”Java E 0 1 2 3 4 5 6 7 8 9”,程序輸出3。

Java
public class E{
  public static void main(String args[]){
  String s1=args[1];
  String s2 = args[2];
  String s3=args[3];
  System.out.println(s3);
 }
}

(5)下列哪個敘述是錯誤的?
A.”9dog”.matches(“\ddog”)的值是true。
B.”12hello567”.replaceAll(“[123456789]+”,”@”)返回的字符串是@hello@。
C. new Date(1000)對象含有的時間是公元后1000小時的時間。
D.”\hello\n”是正確的字符串常量。


選擇題解析

1.A
String類在java.lang包中;”abc”==”abc”的值是true,字符常量存儲在常量池中,他們的引用是相同的;而”abc”.equals(“Abc”)的值是false,區分大小寫的。
2.B
parseXXX(String s)方法是將由“數字”字符組成的字符序列轉化成對應的數據類型。
A中不能將float類型賦值給int
C中不能講int賦值給byte
D中Float類不存在parseDouble方法


3.B
String常量是對象,因此可以把String常量的引用賦值給一個String對象。strOne和strTwo是用戶聲明的String對象,strOne的值是可以被改變的,如果再進行strOne=”fly”運算,那麼strOne中的值將發生變化。
strTwo的=strOne就將strOne指向的常量池對象bird賦值給了strTwo。


4.D
B選項輸出的實際是game,因爲下標從0開始;
C選項發生數組下標越界異常,因爲並沒有給arg[3]賦值;


5.C
String對象調用public boolean matches(String regex)方法可以判斷當前String對象的字符序列是否和參數regex指定的正則表達式匹配。\d代表0-9中的任何一個數字。所以A選項是匹配的。
replaceAll(String regex,String replacement)方法返回一個新的String對象,把當前String對象的字符序列中所有和參數regex匹配的子字符序列,用參數replacement的字符序列替換後得到字符序列。
B選項中將1-9數字序列替換爲@,返回的字符串就是@hello@。
C選項1000表示公元后1000毫秒的時間,公元時間是1970-01-01 0時。


閱讀程序

(1)請說出E類中標註的【代碼】的輸出結果

Java
public class E {
    public static void main(String args[]) {
        String str = new String("蘋果");
        modify(str);
        System.out.println(str);// 【代碼】
    }

    public static void modify(String s) {
        s = s + "好吃";
    }
}

(2)請說出E類中標註的【代碼】的輸出結果。

Java
import java.util.StringTokenizer;

class GetToken {
    String s[];

    public String getToken(int index, String str) {
        StringTokenizer fenxi = new StringTokenizer(str);
        int number = fenxi.countTokens();
        s = new String[number + 1];
        int k = 1;
        while (fenxi.hasMoreTokens()) {
            String temp = fenxi.nextToken();
            s[k] = temp;
            k++;
        }
        if (index <= number) {
            return s[index];
        } else
            return null;
    }
}

public class E {
    public static void main(String args[]) {
        String str = "We Love This Game";
        GetToken token = new GetToken();
        String s1 = token.getToken(2, str);
        String s2 = token.getToken(4, str);
        System.out.println(s1 + ":" + s2);//【代碼】
    }
}

(3)請說出E類中標註的【代碼1】和【代碼2】的輸出結果

Java
public class E {
    public static void main(String args[]) {
        byte d[] = "abc我們喜歡籃球".getBytes();
        System.out.println(d.length);//【代碼1】
        String s = new String(d, 0, 7);
        System.out.println(s);//【代碼2】
    }
}

(4)請說出E類中標註的【代碼】的輸出結果。

Java
class MyString {
    public String getString(String s) {
        StringBuffer str = new StringBuffer();
        for (int i = 0; i < s.length(); i++) {
            if (i % 2 == 0) {
                char c = s.charAt(i);
                str.append(c);
            }
        }
        return new String(str);
    }
}

public class E {
    public static void main(String args[]) {
        String s = "1234567890";
        MyString ms = new MyString();
        System.out.println(ms.getString(s));//【代碼】
    }
}

(5)請說出E類中標註的【代碼】的輸出結果

Java
public class E {
    public static void main(String args[]) {
        String regex = "\\djava\\w{1,}";
        String str1 = "88javaookk";
        String str2 = "9javaHello";
        if (str1.matches(regex)) {
            System.out.println(str1);
        }
        if (str2.matches(regex)) {
            System.out.println(str2);//【代碼】
        }
    }
}

閱讀程序題解析

1.蘋果。
String對象的字符序列是不可修改的,也就是說,String對象的字符序列的字符不能被修改、刪除,即String對象的實體是不可以再發生變化的。


2.Love:Game
這道題考察StringTokenizer類使用,該類用於分解String對象的字符序列。首先調用getToken方法傳入2和str字符串,StringTokenizer fenxi = new StringTokenizer(str);爲String對象str構造一個分析器,使用默認的分隔標記,即空格符、換行符、回車符、Tab符做分隔標記。所以str被分解成四個語言符號:We、Love、This和Game。int number = fenxi.countTokens();調用countTokens方法得到分析器中計數變量的值賦值給number,也就是4.在循環中使用了hasMoreTokens()方法,只要字符序列中還有語言符號,該方法就返回true,循環體內使用nextToken()方法逐個獲取字符序列的單詞,並存入字符串數組中(k=1,從1開始)。所以結果變爲了s[1]=”We”,s[2]=”Love”,s[3]=”This”,s[4]=”Game”.之後用條件語句判斷傳入的參數是否小於等於計數變量,是的話就返回index作爲s數組下標的值也就是Love。
第二個同理,只不過傳入的是4,那麼s2就是Game。最後輸出Love:Game。


3.15
abc我們
getBytes()方法使用平臺默認的字符編碼,將當前String對象的字符序列存放到字節數組中,並返回數組的引用。第一行輸出數組的長度,英文字母佔一個字節,漢字佔兩個字節,所以長度爲15.
然後又創建新的String 對象s,在構造方法中傳入三個參數,意思是用數組d中從0到6(7-1)位置上的字符去創建String對象輸出的s爲abc我們


4.13579
這道題考察StringBuffer類使用方法,首先傳入字符串s”1234567890”,使用循環遍歷字符串,如果遍歷到能被2整除的位置,就調用charAt(i)方法得到字符序列該位置上的字符,之後調用append方法將該字符追加到StringBuffer對象的字符序列中。


5.9javaHello
regex是正則表達式,\d代表0-9中任意一個數字,\w代表可用於標識符的字符(不包括美元符號),{1,}表示至少出現1次,調用matches方法判斷當前String對象的字符序列是否和參數regex指定的正則表達式匹配,可以發現str1是不匹配的,因爲有兩個數字,而str2是匹配的,所以輸出str2。


編程題

(1)字符串調用public String toUpperCase()方法返回一個字符串,該字符串把當前字符串中的小寫字母變成大寫字母;字符串調用public String toLowerCase()方法返回一個字符串,該字符串把當前字符串中的大寫字母變成小寫字母。String類的public String concat(String str)方法返回一個字符串,該字符串是把調用該方法的字符串與參數指定的字符串連接。編寫一個程序,練習使用這3個方法。

public class E {
  public static void main (String args[ ]) {
     String s1,s2,t1="ABCDabcd";
     s1=t1.toUpperCase();
     s2=t1.toLowerCase(); 
     System.out.println(s1);
     System.out.println(s2);
     String s3=s1.concat(s2);
      System.out.println(s3);
   }
}

(2)String類的 Public char charAt(int index)方法可以得到當前字符串index位置上的一個字符。編寫程序使用該方法得到一個字符串中的第一個和最後一個字符。

public class E {
  public static void main (String args[ ]) {
     String s="ABCDabcd";
     char cStart=s.charAt(0);
     char cEnd = s.charAt(s.length()-1);
     System.out.println(cStart);
     System.out.println(cEnd);
   }
}

(3)編寫程序剔除一個字符串中的全部非數字字符,例如,將形如“ab123you”的非數字字符全部剔除,得到字符串“123”。

public class E {
      public static void main (String args[ ]) {
        String str = "ab123you你是誰?";
        String regex = "\\D+";
        str = str.replaceAll(regex,"");
        System.out.println(str);
      }
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章