Java课堂练习5

动手动脑1:

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

结果:

true
true
false

结论:

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()方法可以比较两个字符串的内容。

动手动脑2:

请查看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));
}

}

结果:

false
true
true
true

     首先为s1寻找String缓冲池内是否有与"Hello"相同值的String对象存在,此时String缓冲池内是空的,没有相同值的String对象存在,所以虚拟机会在String缓冲池内创建此String对象,其动作就是new String("Hello");。然后把此String对象的引用赋值给s1。
     接着为s2寻找String缓冲池内是否有与"Hello"相同值的String对象存在,此时虚拟机找到了一个与其相同值的String对象,这个String对象其实就是为s1所创建的String对象。既然找到了一个相同值的对象,那么虚拟机就不在为此创建一个新的String对象,而是直接把存在的String对象的引用赋值给s2。
 
针对String作为一个基本类型来使用:
 
1。如果String作为一个基本类型来使用,那么我们视此String对象是String缓冲池所拥有的。
2。如果String作为一个基本类型来使用,并且此时String缓冲池内不存在与其指定值相同的String对象,那么此时虚拟机将为此创建新的String对象,并存放在String缓冲池内。
3。如果String作为一个基本类型来使用,并且此时String缓冲池内存在与其指定值相同的String对象,那么此时虚拟机将不为此创建新的String对象,而直接返回已存在的String对象的引用。
 
针对String作为一个对象来使用:
 
1。如果String作为一个对象来使用,那么虚拟机将为此创建一个新的String对象,即为此对象分配一块新的内存堆,并且它并不是String缓冲池所拥有的,即它是独立的。

动手动脑3:

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 Stringlianxi {

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);
}

}

结果:

ABCdefg

package text3;

public class Stringpool {

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,否选择输出结果为哈希值


}

}
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;
}
}

结果:

102

整理String类的Length()、charAt()、 getChars()、replace()、 toUpperCase()、 toLowerCase()、trim()、toCharArray()使用说明。

Length():获取字串长度,字符串是一个对象,在这个对象中包含length属性,它是该字符串的长度,使用String类中的length()方法可以获取该属性值。

charAt():获取指定位置的字符

getChars():获取从指定位置起的子串复制到字符数组中(它有四个参数,1.被拷贝字符在字串中的起始位置 2.被拷贝的最后一个字符在字串中的下标再加1 3.目标字符数组 4.拷贝的字符放在字符数组中的起始下标)

replace():子串替换,通过String类的replace()方法,可以将原字符串中的某个字符替换为指定的字符,并得到一个新的字符串,该方法的具体定义如下:public String replace(char oldChar,char newChar)

toUpperCase()、 toLowerCase():大小写转换,在String类中提供了两个用来实现字母大小写转换的方法,它们的返回值均为转换后的字符串,其中toLowerCase()用来将字符串中的所有大写字母改为小写字母,,方法toUpperCase()用来将字符串中的所有小写字母改为大写字母。

trim():去除头尾空格,通过String类的trim()方法,可以通过去掉字符串的首尾空格得到一个新的字符串,该方法的具体定义如下:public String trim()

toCharArray():将字符串对象转换为字符数组

古罗马皇帝凯撒在打仗时曾经使用过以下方法加密军事情报:

请编写一个程序,使用上述算法加密或解密用户输入的英文字串要求设计思想、程序流程图、源代码、结果截图。

程序设计思想:

输入要加密的子串str,定义字符串长度,将字符串转化为单个字符,每个字符+3,向后移3个,每个字符-3,向前移3个,定义str1,将新得到的每个字符加到str1后,得到加密后的英文子串str1,输出加密后的子串str1。

程序流程图:

源代码:

package text3;
import java.util.Scanner;
public class Stringpool {

public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner input=new Scanner(System.in);
System.out.println("请输入英文子串:");
String str;
int n=0;
str=input.nextLine();//nextLine接受一行数据
n=str.length();
char a;
int n1=0;
String str1=new String();

for(int i=0;i<n;i++)
{
a=str.charAt(i);//获取指定位置的字符串


a=(char)(a+3);

str1=str1+a;



}
System.out.println("加密后的子串是: "+str1);


}

}

结果截图:

原文地址:https://www.cnblogs.com/xxdcxy/p/6006993.html