第六周动手动脑问题
请运行以下示例代码StringPool.java,查看其输出结果。如何解释这样的输出结果?从中你能总结出什么?
在Java中,内容相同的字串常量(“Hello”)只保存一份以节约内存,所以s0,s1,s2实际上引用的是同一个对象。编译器在编译s2一句时,会去掉“+”号,直接把两个字串连接起来得一个字串(“Hello”)。这种优化工作由Java编译器自动完成。当直接使用new关键字创建字符串对象时,虽然值一致(都是“Hello”),但仍然是两个独立的对象。
为什么会有上述的输出结果?从中你又能总结出什么?
给字串变量赋值意味着:两个变量(s1,s2)现在引用同一个字符串对象“a”!String对象的内容是只读的,使用“+”修改s1变量的值,实际上是得到了一个新的字符串对象,其内容为“ab”,它与原先s1所引用的对象”a”无关,所以,s1==s2返回false;代码中的“ab”字符串是一个常量,它所引用的字符串与s1所引用的“ab”对象无关。String.equals()方法可以比较两个字符串的内容。
使用equals()或equalsIgnoreCase()方法比较两字串内容是否相同,使用==比较两字串变量是否引用同一字串对象。compareTo:使用字典法进行比较,返回0表两字串相等,小于返回负值,大于返回正值。egionMatches:比较两字串中的某一部分是否相等
结果:
字符串查找方法:
查询字串是否以某字串开头和结尾:startsWith和endWith方法
在字串查找字符或子串,调用indexOf和lastIndexOf方法即可。
请阅读JDK中String类上述方法的源码,模仿其编程方式,编写一个MyCounter类,它的方法也支持上述的“级联”调用特性,其调用示例为:
MyCounter counter1=new MyCounter(1);
MyCounter counter2=counter1.increase(100).decrease(2).increase(3);
public class MyCounter {
private int c;
public int getC() {
return c;
}
public void setC(int c) {
this.c = c;
}
MyCounter(int c)
{
this.c = c;
}
public static void main(String[] args) {
MyCounter counter1=new MyCounter(1);
MyCounter counter2=counter1.increase(100).decrease(2).increase(3);
System.out.println(counter2.c);
}
public MyCounter increase(int c)
{
this.c=this.c+c;
return this;
}
public MyCounter decrease(int c)
{
this.c=this.c-c;
return this;
}
}
结果:
java中length()用来获取String字符串的长度
public class TestS {
public static void main(String[] args) {
// TODO 自动生成的方法存根
int a;
char[] b,d;
char c;
String e,f,g,h;
String s="abcde";
a=s.length();//获取字符串长度
b=s.toCharArray();//换成字符数组
c=s.charAt(1);//获取特定位置的字符
d=s.toCharArray();//换成字符数组
s.getChars(0, 0, d, 0);
e=s.replace("a", "e");//将a替换成e
f=s.toUpperCase();//换成大写
g=s.toLowerCase();//换成小写
h=s.trim();//赋值
System.out.println(a+"\n"+c+"\n"+e+"\n"+f+"\n"+g+"\n"+h);
}
}