1 下列说法正确的是:

A.在Java语言中,使用new关键字创建的字符串缓存在常量池中。

B.在Java语言中,可以使用直接量“字符序列”的方式创建字符串。

C.在Java语言中,对于使用new关键字创建的字符串序列,如果重复出现,JVM会首先在常量池中查找,如果存在即返回该对象。

D.下列代码的输出结果为false

String str1 = "WhatisJava";
String str2 = "WhatisJava";
System.out.println(str1 == str2);

参考答案

本题正确答案为B。

Java语言中可以使用直接量“字符序列”的方式创建字符串,代码如下所示:

    String str = “WhatisJava”

出于性能的考虑,JVM会将字符串直接量对象缓存在常量池中;对于重复出现的字符串直接量,JVM会首先在常量池中查找,如果存在即返回该对象。请看下列代码:

String str1 = "WhatisJava";
String str2 = "WhatisJava";
System.out.println(str1 == str2);

以上代码的输出结果为true,第二次定义的“WhatisJava”不会重复创建String对象,而是使用str1所指向的对象。如果是使用new关键字创建的字符串,则不会缓存在常量池中,代码如下所示:

String str1 = "WhatisJava";
String str3 = new String("WhatisJava");
System.out.println(str1 == str3);

以上代码的输出结果为false,使用new关键字将会创建新的String对象。

2 下面关于字符串长度说法正确的是:

A.使用Java中的String类的length方法计算字符串的长度,如果是英文算1个长度,如果是中文算2个长度。

B.使用Java中的String类的length方法计算字符串的长度,由于Java采用Unicode编码任何一个字符在内存中算2个长度 ,因此,length方法中也是一个字符2个长度,不区分中文还是英文。

C.使用Java中的String类的length方法计算字符串的长度,无论中文还是英文都算1个长度。

D.使用Java中的String类的length方法计算字符串"你好String"的长度为10。

参考答案

本题正确答案为C。

使用Java中的String类的length方法计算字符串的长度,无论中文还是英文都算1个长度。另外,在Java中,字符在内存里采用的是Unicode编码,每个字符占用两个字节,请注意区别。

3 获取一个字符串中最后一个"/"后的字符序列

获取一个字符串中最后一个"/"后的字符序列,即,现有字符串“someapp/manager/emplist.action”,截取该字符串最后一个“/”后的所有字符,截取后的结果为字符串“emplist.action”。

在课上案例“将其他类型转换为字符串类型”的基础上完成当前案例。

参考答案

首先,使用String类的lastIndexOf方法获取字符串“someapp/manager/emplist.action”中最后一个“/”的索引位置;然后在该索引位置的基础上加1,形成新的索引位置;最后,使用String类的substring方法,从新的索引位置开始截取到字符串的末尾,即为字符串“emplist.action”。

实现此案例需要按照如下步骤进行。

步骤一:重构TestString类,添加getPath方法

在课上案例“将其他类型转换为字符串类型”的基础上,在TestString类中添加getPath方法,代码如下所示:

package day01;

import org.junit.Test;

public class TestString {
	//...(之前案例的代码,略)

#cold_bold	/**
#cold_bold	 * 获取一个字符串中最后一个"/"后的字符序列
#cold_bold	 */
#cold_bold	@Test
#cold_bold	public void getPath() {
#cold_bold	}
}

步骤二:使用String类的lastIndexOf方法和substring方法

首先,使用String类的lastIndexOf方法获取字符串“someapp/manager/emplist.action”中最后一个“/”的索引位置;然后在该索引位置的基础上加1,形成新的索引位置;最后,使用String类的substring方法,从新的索引位置开始截取到字符串的末尾,即为字符串“emplist.action”,代码如下所示:

package day01;

import org.junit.Test;

public class TestString {
	//...(之前案例的代码,略)

	/**
	 * 获取一个字符串中最后一个"/"后的字符序列
	 */
	@Test
	public void getPath() {
#cold_bold		String uri = "someapp/manager/emplist.action";
#cold_bold		String path = uri.substring(uri.lastIndexOf("/") + 1);
#cold_bold		System.out.println(path); // emplist.action
	}
}

步骤三:运行

运行getPath方法,控制台输出结果如下所示:

emplist.action

从输出结果可以看出,与预期结果相符。

本案例中,TestString类的完整代码如下所示:

package day01;

import org.junit.Test;

public class TestString {
	//...(之前案例的代码,略)

	/**
	 * 获取一个字符串中最后一个"/"后的字符序列
	 */
	@Test
	public void getPath() {
		String uri = "someapp/manager/emplist.action";
		String path = uri.substring(uri.lastIndexOf("/") + 1);
		System.out.println(path); // emplist.action
	}
}

4 说出trim方法一般用在何处

参考答案

trim方法一般用于去除用户输入信息中的前后空白以及处理文件内容时,去除文件中的空白。

5 检测一个字符串是否为回文

回文字符串是指正着读和反着读该字符串都是相同拼写,比如“radar”、“level“。

本案例要求编写程序判断字符串“able was i ere i saw elba”是否为回文。

在课后案例“获取一个字符串中最后一个"/"后的字符序列”的基础上完成当前案例。

参考答案

首先,使用循环,在循环中,使用String类的charAt方法获取i位置的字符与(str.length() - i – 1)位置的字符是否相等,如果有一对不等的情况,则说明不是回文。循环的代码如下所示:

for (int i = 0; i < str.length() / 2; i++) {
			if (str.charAt(i) != str.charAt(str.length() - i - 1)) {
				flag = false;
				break;
			}
		}

实现此案例需要按照如下步骤进行。

步骤一:重构TestString类,添加palindrome方法

在课后案例“获取一个字符串中最后一个"/"后的字符序列”的基础上,在TestString类中添加palindrome方法,代码如下所示:

package day01;

import org.junit.Test;

public class TestString {
	//...(之前案例的代码,略)

#cold_bold	/**
#cold_bold	 * 检测一个字符串是否为回文
#cold_bold	 */
#cold_bold	@Test
#cold_bold	public void palindrome() {
#cold_bold	}
}

步骤二:使用String类的charAt方法

使用循环,在循环中,使用String类的charAt方法获取i位置的字符与(str.length() - i – 1)位置的字符是否相等,如果有一对不等的情况,则说明不是回文,代码如下所示:

package day01;

import org.junit.Test;

public class TestString {
	//...(之前案例的代码,略)

	/**
	 * 检测一个字符串是否为回文
	 */
	@Test
	public void palindrome() {
#cold_bold		String str = "able was i ere i saw elba";
#cold_bold
#cold_bold		boolean flag = true;
#cold_bold		for (int i = 0; i < str.length() / 2; i++) {
#cold_bold			if (str.charAt(i) != str.charAt(str.length() - i - 1)) {
#cold_bold				flag = false;
#cold_bold				break;
#cold_bold			}
#cold_bold		}
#cold_bold		if (flag) {
#cold_bold			System.out.println("是回文");
#cold_bold		} else {
#cold_bold			System.out.println("不是回文");
#cold_bold		}
	}
}

步骤三:运行

运行palindrome方法,控制台输出结果如下所示:

是回文

从输出结果可以看出,字符串"able was i ere i saw elba"为回文。

本案例中,TestString类的完整代码如下所示:

package day01;

import org.junit.Test;
public class TestString {
	//...(之前案例的代码,略)

	/**
	 * 检测一个字符串是否为回文
	 */
	@Test
	public void palindrome() {
		String str = "able was i ere i saw elba";

		boolean flag = true;
		for (int i = 0; i < str.length() / 2; i++) {
			if (str.charAt(i) != str.charAt(str.length() - i - 1)) {
				flag = false;
				break;
			}
		}
		if (flag) {
			System.out.println("是回文");
		} else {
			System.out.println("不是回文");
		}
	}
}

6 生成一个包含所有汉字的字符串

生成一个包含所有汉字的字符串,即,编写程序输出所有汉字,每生成50个汉字进行换行输出。

在课上案例“测试StringBuilder的delete方法“的基础上完成当前案例。

参考答案

在Java中,字符类型事实上是一个16位无符号整数,这个值对应字符的编码, Java字符类型采用Unicode字符集编码。Unicode是世界通用的定长字符集,所有的字符都是16位。字符直接量可以采用诸如:‘中’的形式,也可以采用16进制的表示形式,例如: ‘\u4e2d’。所有汉字的Unicode范围是U+4E00~U+9FA5。

本案例中,首先,使用循环,以Unicode汉字编码U+4E00作为循环的开始,以汉字编码U+9FA5作为循环的结束;然后,在循环中,使用StringBuilder的append方法进行字符串累加,并且计算生成的汉字个数,进行换行,代码如下所示:

for (char c = '\u4e00', i = 1; c <= '\u9fa5'; c++, i++) {
			sb.append(c);
			if (i % 50 == 0) {
				sb.append("\n");
			}
		}

实现此案例需要按照如下步骤进行。

步骤一:在类中添加测试方法

在TestStringBuilder类中添加测试方法chineseCharacters,代码如下所示:

package day01;

import org.junit.Test;

public class TestStringBuilder {
#cold_bold	/**
#cold_bold	 * 生成一个包含所有汉字的字符串
#cold_bold	 */
#cold_bold	@Test
#cold_bold	public void chineseCharacters() {
#cold_bold		
#cold_bold	}
}

步骤二:使用StringBuilder的append方法

首先,使用循环,以Unicode汉字编码U+4E00作为循环的开始,以汉字编码U+9FA5作为循环的结束;然后,在循环中,使用StringBuilder的append方法进行字符串累加,并且计算生成的汉字个数,进行换行,代码如下所示:

package day01;

import org.junit.Test;

public class TestStringBuilder {
	/**
	 * 生成一个包含所有汉字的字符串
	 */
	@Test
	public void chineseCharacters() {
#cold_bold		StringBuilder sb = new StringBuilder();
#cold_bold		// “U+4E00..U+9FA5
#cold_bold		for (char c = '\u4e00', i = 1; c <= '\u9fa5'; c++, i++) {
#cold_bold			sb.append(c);
#cold_bold			if (i % 50 == 0) {
#cold_bold				sb.append("\n");
#cold_bold			}
#cold_bold		}
#cold_bold		System.out.println(sb.length());
#cold_bold		System.out.println(sb.toString());
	}
}

步骤三:运行

运行chineseCharacters方法,控制台为输出结果的部分内容如图-1所示。

图- 1

本案例中,TestStringBuilder的完整代码如下所示:

package day01;

import org.junit.Test;

public class TestStringBuilder {
	//...(之前案例的代码,略)
	
	/**
	 * 生成一个包含所有汉字的字符串
	 */
	@Test
	public void chineseCharacters() {
		StringBuilder sb = new StringBuilder();
		// “U+4E00..U+9FA5
		for (char c = '\u4e00', i = 1; c <= '\u9fa5'; c++, i++) {
			sb.append(c);
			if (i % 50 == 0) {
				sb.append("\n");
			}
		}
		System.out.println(sb.length());
		System.out.println(sb.toString());
	}
}

7 阅读Apache Commons-lang.jar中StringUtils文档,掌握leftPad、rightPad、repeat、abbreviate、join等方法(提高题,选做)

参考答案

commons-lang是Apache Commons 项目中的一个组件,commons-lang针对JDK官方的java.lang包中的类提供了一些实用的补充,在实践中应用很广。

StringUtils是commons-lang包中提供的,针对字符串操作的工具类,该类提供了一系列静态实用方法,如表-1所示:

表-1 StringUtil类中方法介绍

下面给出以上几个方法的测试代码,请自行进行测试,代码如下所示:

package day01;

import org.apache.commons.lang3.StringUtils;
import org.junit.Test;

public class TestStringUtils {

	@Test
	public void testLeftPadAndRightPad() {
		String name = StringUtils.leftPad("goodman", 10, "*");
		System.out.println(name);

		name = StringUtils.rightPad("goodman", 10, "*");
		System.out.println(name);
	}

	@Test
	public void testRepeat() {
		String str = "Java";
		str = StringUtils.repeat(str, 10);
		System.out.println(str);
	}

	@Test
	public void testAbbreviate() {
		String line = "How long no see you";
		line = StringUtils.abbreviate(line, 15);
		System.out.println(line);
	}

	@Test
	public void testJoin() {
		String[] strArr = { "Java", "C++", "C#", "PHP", "Objective-C" };
		String str = StringUtils.join(strArr, " ");
		System.out.println(str);
	}
}