05-String动手动脑问题及课后实验性问题总结
一.请运行以下实例代码StringPool.java,查看其输出结果。如何解释这样的输出结果?从中你能总结出什么?
(1)在Java中,内容相同的字符常量(“Hello”)只保存一份以节约内存,所以s0,s1,s2实际上引用的同一个对象。
(2)编译器在编译s2一句时,会去掉“+”号,直接把两个字符串连接起来得一个字符串(“Hello”)。这种优化工作由Java编译器自动完成。
(3)当直接使用new关键字创建字符串对象时,虽然值一致(都是“Hello”),但仍然是两个独立的对象。
再看......
为什么会有上述的输出结果?从中你又能总结出什么?
(1)给字符串变量赋值意味着:两个变量(s1,s2)现在引用同一个字符串对象“a”!
(2)String对象的内容是只读的,使用“+”修改s1变量的值,实际上是得到了一个新的字符串对象,其内容为“ab”,它与原先s1所引用的对象“a”无关,所以,s1==s2返回false;
(3)代码中的“ab”字符串是一个常量,它所引用的字符串与s1所引用的“ab”对象无关。
(4)String.equals()方法可以比较两个字符串的内容。
二.请查看String.equals()方法的实现代码,注意学习其实现方法。
public class StringEquals { /** * @param args the command line arguments */ public static void main(String[] args) { String s1=new String("Hello"); String s2=new String("Hello"); System.out.println(s1==s2); System.out.println(s1.equals(s2)); String s3="Hello"; String s4="Hello"; System.out.println(s3==s4); System.out.println(s3.equals(s4)); } }
由此程序可得:因为一开始是使用new关键字创建字符串对象,虽然值一致(都是“Hello”),但仍然是两个独立的对象。使用“==”来判断两个对象,不仅对象的值要相等,而且对象的地址也要是同一个,所以第一个判断为错误;使用“a.equals(b)”来判断两个对象时,只需要判断两个对象的值是否相等即可,所以第二个结果为true;之后两个因为赋值时,给两个对象赋值为“Hello”,所以两个对象的值与地址都相等。都为true。
(1)在String类里面是这样重写equals()方法的实现的:用当前的这个字符串对象和指定的字符串对象比较,指定的字符串对象不能为空并且这个对象的字符序列和当前这个字符串对象的字符串序列一样,如果这些条件都满足,那么这两个字符串对象就是相等的。
(2)如果String缓冲池内不存在与其指定值相同的String对象,那么此时虚拟机将为此创建新的String对象,并存放在String缓冲池内;如果String缓冲池内存在与其指定值相同的String对象,那么此时虚拟机将不为此创建新的String对象,而直接返回已存在的String对象的引用。
三.动手动脑: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);
......
public class StringXunHuan { public static void main(String[] args) { // TODO Auto-generated method stub String str="abc"; String result=str.trim().toUpperCase().concat("defg"); System.out.println(result); } }
class MyCounter { int data; public void set(int d) { data=d; } public MyCounter increase(int i) { MyCounter a=new MyCounter(); a.data=data+i; return a; } public MyCounter decrease(int d) { MyCounter a=new MyCounter(); a.data=data-d; return a; } } public class Counter { public static void main(String[] args) { // TODO Auto-generated method stub MyCounter counter1=new MyCounter(); MyCounter counter2=new MyCounter(); counter1.set(1); counter2=counter1.increase(100).decrease(2).increase(3); System.out.println(counter2.data);//注意此处不能写成counter2,否选择输出结果为哈希值 } }
四.课后作业1:字串加密
古罗马皇帝凯撒在打仗时曾经使用过以下方法加密军事情报:
请编写一个程序,使用上述算法加密或解密用户输入的英文字串要求设计思想,程序流程图,源代码,结果截图。
1.程序设计思想:
(1)首先编写一个ZhuanHuan函数,在函数中运用charAt函数来读取各个字符,将非x,y,z的字母的ASCII码值都加上三,并输出改变后的字符;x,y,z便是用ASCII码减去23即可得到a,b,c。
(2)在主函数中调用此函数,输出结果即可。
2.程序流程图:
3.源代码:
import java.util.Scanner; public class CodeString { public static void main(String[] args) { // TODO Auto-generated method stub System.out.println("请输入英文字符串:"); Scanner sc= new Scanner(System.in); String S=sc.next(); sc.close(); ZhuanHuan(S); } public static void ZhuanHuan(String a) { char code; for(int i=0;i<a.length();i++) { if((a.charAt(i))<88) code=(char)(a.charAt(i)+3);//注意:charAt的下标也是从0开始 else code=(char)(a.charAt(i)-23); System.out.print(code + " "); } } }
4.结果截图:
五.课后作业之字串加密、动手动脑之String.equals()方法、整理String类的Length()、charAt()、 getChars()、replace()、 toUpperCase()、 toLowerCase()、trim()、toCharArray()使用说明、阅读笔记发表到博客园
1.String.equals()方法:比较的是两个字符串的内容,与之区分的是“==”(判断对象的值和地址)。
2.Length():获取字符串的长度。
3.charAt():获取指定位置的字符(其中下标从0开始)。
4. getChars():获取从指定位置起的子串复制到字符数组中。
5.replace():子串替换。
6.toUpperCase():全部字符变为大写,返回新字符串。
7. toLowerCase():全部字符变为小写,返回新字符串。
8.trim():去除头尾空格。
9.toCharArray():将字符串对象转换为字符数组。