java课后思考题(四)
1.
请运行以下示例代码StringPool.java,查看其输出结果。如何解释这样的输出结果?从中你能总结出什么?
输出结果:
结论:
在Java中,内容相同的字串常量(“Hello”)只保存一份以节约内存,所以s0,s1,s2实际上引用的是同一个对象。
编译器在编译s2一句时,会去掉“+”号,直接把两个字串连接起来得一个字串(“Hello”)。这种优化工作由Java编译器自动完成。
当直接使用new关键字创建字符串对象时,虽然值一致(都是“Hello”),但仍然是两个独立的对象。
java在用“=="比较两个对象时,是比较的这两个对象的地址,不是他们的内容。
2.为什么会有这样的输出结果?从中你又能总结出什么?
.
结论:
java对于简单类型变量的赋值是按值传递。就是说直接把数值存放到变量的存储单元里。对于引用类型的变量,赋值是把原对象的引用(可以理解为入口地址),存放在变量的存储单元里。
equals()是比较内容的函数。
String对象的内容是只读的,使用“+”修改s1变量的值,实际上是得到了一个新的字符串对象,其内容为“ab”,它与原先s1所引用的对象”a”无关,所以,s1==s2返回false。
代码中的“ab”字符串是一个常量,它所引用的字符串与s1所引用的“ab”对象无关。
3.请查看String.equals()方法的实现代码,注意学习其实现方法。
public boolean equals(Object anObject){
if(this==anObject){
return true;
}
if(anObject instanceof String){
String anotherString =(String)anObject;
int n=value.length;
if(n==anotherString.value.length){
char v1[]=value;
char v2[]=anotherString .value;
int i=0;
while(n-- !=0){
if(v1[i] !=v2[i])
return false;
i++
}
return true;
}
}
return false;
}
(1)判定传入的对象和当前对象是否为同一个对象,如果是就直接返回true.
(2) 判定传入的类型值是否为String,若不是则返回false;
(3)判定传入的String与当前的String的长度都是否一致,若不一致就返回false;
(4)循环对比两个字符串的char[]数组,逐个对比字符是否一致,若存在不一致的情况,则直接返回false;
(5)循环结束都没有找到不匹配的,所以最后返回true;
4.String类的方法可以连续调用:
String str="abc"; String result=str.trim().toUpperCase().concat("defg");
请阅读JDK中String类上述方法的源码,模仿其编程方式,编写一个MyCounter类,它的方法也支持上述的“级联”调用特性,其调用示例为: MyCounter counter1=new MyCounter(1); MyCounter counter2=counter1.increase(100).decrease(2).increase(3);
toUpperCase():大小写转换
trim():去除头尾空格:
concat():可以将2个字符串拼接到一块
public class MyCounter {
int i;
MyCounter(int n){
i=n;
}
public MyCounter increase(int n) {
this.i=this.i+n;
return this;
}
public MyCounter decrease(int n) {
this.i=this.i-n;
return this;
}
public static void main(String[] args) {
MyCounter counter1=new MyCounter(1);
MyCounter counter2=counter1.increase(100).decrease(2).increase(3);
System.out.println("counter2.i="+counter2.i);
}
}
结果截图:
5.整理String类的Length()、charAt()、 getChars()、replace()、toLowerCase()、toCharArray()
Length():用于获取字符串长度。如:String str =
"Hello World Java"
;
int
lenStr = str.length();
//此处lenStr=16
charAt():返回指定位置的字符。如:String s ="abc";System.out.println(s.charAt(1));//输出b
getChars(int start,int end,char c[],int offset): 将当前字符串从start到end-1位置上的字符复制到字符数组c中,并从c的offset处开始存放。如: String s=new String("巴西 足球队击败德国足球队";char[] c=new char[s.length()];s.getChars(7,12,c,0);System.out.println(c);//输出结果是德国足球队。
replace(char oldChar,char newChar):替换后生成的新字符串。如:String str=new String("hello");System.out.println(str.replace('o','T'));//输出hellT
toLowerCase():大写的换小写,小写的换大写。如:String cc = “aBc123”.toUpperCase();//cc是:ABC123。
toCharArray():字符串转换为字符数组。如:String s1=new String("我是中国人");char[] c=s1.toCharArray();
6.请编写一个程序,使用上述算法加密或解密用户输入的英文字串要求设计思想、程序流程图、源代码、结果截图。
(1)设计思想:
输入一个String型字符串,用toCharArray()转化成字符数组,利用循环字符数组中的每个字符ASSCII值加3,然后再转换成String型字符串。输出字符串。
(2)程序流程图
(3)程序源代码
import java.util.Scanner;
public class Jiami {
public static void main(String[] args) {
System.out.print("请输入邮件内容:");
Scanner scanner=new Scanner(System.in);
String s=scanner.nextLine();
char[] l=s.toCharArray();
System.out.print("加密后的邮件内容为:");
for(int i=0;i<l.length;i++) {
int temp=l[i];
temp=temp+3;
l[i]=(char)temp;
System.out.print(l[i]);
}
}
}
结果截图: