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 {
- //...(之前案例的代码,略)
- /**
- * 获取一个字符串中最后一个"/"后的字符序列
- */
- @Test
- public void getPath() {
- }
- }
步骤二:使用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() {
- String uri = "someapp/manager/emplist.action";
- String path = uri.substring(uri.lastIndexOf("/") + 1);
- System.out.println(path); // emplist.action
- }
- }
步骤三:运行
运行getPath方法,控制台输出结果如下所示:
- emplist.action
从输出结果可以看出,与预期结果相符。
本案例中,TestString类的完整代码如下所示:
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 {
- //...(之前案例的代码,略)
- /**
- * 检测一个字符串是否为回文
- */
- @Test
- public void palindrome() {
- }
- }
步骤二:使用String类的charAt方法
使用循环,在循环中,使用String类的charAt方法获取i位置的字符与(str.length() - i – 1)位置的字符是否相等,如果有一对不等的情况,则说明不是回文,代码如下所示:
- 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("不是回文");
- }
- }
- }
步骤三:运行
运行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 {
- /**
- * 生成一个包含所有汉字的字符串
- */
- @Test
- public void chineseCharacters() {
- }
- }
步骤二:使用StringBuilder的append方法
首先,使用循环,以Unicode汉字编码U+4E00作为循环的开始,以汉字编码U+9FA5作为循环的结束;然后,在循环中,使用StringBuilder的append方法进行字符串累加,并且计算生成的汉字个数,进行换行,代码如下所示:
- 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());
- }
- }
步骤三:运行
运行chineseCharacters方法,控制台为输出结果的部分内容如图-1所示。
![](https://i-blog.csdnimg.cn/blog_migrate/49bd9dfb053bc70d01cc46a831df2ba6.png)
图- 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类中方法介绍
![](https://i-blog.csdnimg.cn/blog_migrate/7665aefff864a2cd3ae6a0a3b878944a.png)
下面给出以上几个方法的测试代码,请自行进行测试,代码如下所示:
- 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);
- }
- }