第六周动手动脑问题

请运行以下示例代码StringPool.java,查看其输出结果。如何解释这样的输出结果?从中你能总结出什么?

Java中,内容相同的字串常量(“Hello”)只保存一份以节约内存,所以s0s1s2实际上引用的是同一个对象。编译器在编译s2一句时,会去掉“+”号,直接把两个字串连接起来得一个字串(“Hello”)。这种优化工作由Java编译器自动完成。当直接使用new关键字创建字符串对象时,虽然值一致(都是“Hello”),但仍然是两个独立的对象。

 

 

为什么会有上述的输出结果?从中你又能总结出什么?

给字串变量赋值意味着:两个变量(s1s2)现在引用同一个字符串对象“a”!String对象的内容是只读的,使用“+”修改s1变量的值,实际上是得到了一个新的字符串对象,其内容为“ab”,它与原先s1所引用的对象”a”无关,所以,s1==s2返回false;代码中的“ab”字符串是一个常量,它所引用的字符串与s1所引用的“ab”对象无关。String.equals()方法可以比较两个字符串的内容。

 

使用equals()equalsIgnoreCase()方法比较两字串内容是否相同,使用==比较两字串变量是否引用同一字串对象。compareTo:使用字典法进行比较,返回0表两字串相等,小于返回负值,大于返回正值。egionMatches:比较两字串中的某一部分是否相等

 

 

 

结果:

 

 

字符串查找方法:

查询字串是否以某字串开头和结尾:startsWithendWith方法

在字串查找字符或子串,调用indexOflastIndexOf方法即可。

 

请阅读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);
}
}

 

posted @ 2017-10-27 14:07  芬芳指法  阅读(106)  评论(0编辑  收藏  举报