思考问题一:
请运行以下示例代码StringPool.Java,查看其输出结果。如何释这种输出结果?从中你能总结出什么?
运行结果:
true
true
false
原因:
1)在java中,内容相同的字符串常量只保存一份以节约内存,所以s0,s1,s2实际上引用的是同一个对象。
2)编译器在编译s2一句时,会去掉“+”号,直接把两个字串连接起来得一个字串。这种优化工作由编译器自动完成。
3)当直接使用new关键字创建字符串对象时,虽然值一致,但仍然是两个独立的对象。
为什么会有上述的输出结果? 从中你又能总结什么?
1)给字串变量赋值意味着:两个变量()现在引用同一个字符串对象“a”!
2)String对象的内容是只读的,使用“+”修改s1变量的值,实际上是得到了一个新的字符串对象,其内容为“ab”,它与原先s1所引用的对象“a”无关,所以,返回false。
3)代码中的“ab”字符串是一个常量,它所引用的字符串与s1所引用的“ab”对象无关。
4)String.equals()方法可以比较两个字符串的内容。
思考问题2:
请查看String.equals()方法,学习其实现方法。
public boolean equals(Object anObject) {
if (this
== anObject) {
return
true;
}
if
(anObject instanceof String) { //判断anObject是不是String类的一个实例
String
anotherString = (String)anObject; //把anObject赋值给anotherString
int n =
count; //count是String的成员代表原始字符串长度
if (n ==
anotherString.count) {
char v1[]
= value; //把原来的字符串和要比较的字符串以字符形式存入数组
char v2[]
= anotherString.value;
int i =
offset; //分别取数组下标
int j =
anotherString.offset;
while
(n-- != 0) { //遍历数组,比较 数组元素是否相同
if
(v1[i++] != v2[j++]) //在遍历的过程中如果有不同的就返回false
return
false;
}
return
true; //相等返回true
}
}
return
false; //不是String实例返回false
}
思考问题3:
整理String类的length()、charAt()、getChars()、replace()、toUpperCase()、toLowerCase()、trim()、toCharArray()使用说明。
length():求字符串长度
public int length()
String s=”asfsdfwfsadf”;
System.out.println(s.length());
结果:12
charAt():
public charAt(int index)//index 是字符下标,返回字符串中指定位置的字符
String s=”Hello”;
System.out.println(s.charAt(3));
结果:l
getChars()获取从指定位置起的字串复制到字符数组中。
四个参数的含义
1.被拷贝字符在字串中的起始位置
2.被拷贝的最后一个字符在字串中的下标再加1
3.目标字符数组
4.拷贝的字符放在字符数组中的起始下标
getChars():public int getChars()//将字符从此字符串复制到目标字符数组
String str = "abcdefghikl";
Char[] ch = new char[8];
str.getChars(2,5,ch,0);
for(int=0;i<ch.length;i++)
System.out.print(ch[i]);
结果:cd
replace():替换字符串
public int replace()
String s=”\\\”;
System.out.println(s.replace(“\\\”,”///”));
结果///;
toUpperase():将字符串全部转换成大写
public String toUpperCase()
System.out.println(new String(“hello”).toUpperCase());
toLowerCse():将字符串全部转换成小写
public String toLowerCase()//将字符串全部转换成小写
System.out.println(new String(“HELLO”).toLowerCase());
trim():去两边空格
public String trim()
String x=”ax c”;
System.out.println(x.trim());//是去两边空格的方法
toCharArray():将字符串对象中的字符转换为一个字符数组
String x=”abcd”;
char myChar[]=x.toCharArray();
System.out.println(“myChar[1]”+myChar[1]);
结果:b
程序题
古罗马皇帝凯撒在打仗时曾经使用过以下方法加密军事情报:请编写一个程序,使用上述算法加密或解密用户输入的英文字串。
1 程序设计思想
1)定义BufferedReader的对象reader并初始化;
2)输入字符串给aa;
3)字符串转化为字符数组给arr;
4)分情况加密:(1)字符是英文字母中的最后三个时,减23并赋值给字符数组;
(2)不是最后三个时加3并赋值给字符数组;
5)输出字符数组
2 流程图
3 源代码:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Jiami {
@SuppressWarnings("null")
public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
int i=0,n=0;
BufferedReader reader=new BufferedReader(new InputStreamReader(System.in));//定义BufferedReader对象
System.out.println("请输入一个字符串:");
String aa=reader.readLine();//输入字符串
n=aa.length();
char arr[]=aa.toCharArray();//转化为字符数组
for( i=0;i<n;i++)
{
if((arr[i]>=88&&arr[i]<=90)||(arr[i]>=120&&arr[i]<=122)) //如果是 x,y,z时,减23
arr[i]=(char) (arr[i]-23);
else
arr[i]=(char)(arr[i]+3); //加3
}
for( i=0;i<n;i++) //输出
System.out.print(arr[i]);
}
}
4结果截图