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.不是。


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);
      }
}

  • 65
    点赞
  • 206
    收藏
    觉得还不错? 一键收藏
  • 15
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值