- 1.请运行以下示例代码StringPool.java,查看其输出结果。如何解释这样的输出结果?从中你能总结出什么?
答:在Java中内容相同的只保存在一个字节中因此s0,s1,s2是指的相同对象,在判断相等时结果为true,但是当新开辟空间建立新对象时比较的是两个对象,对象不能直接判等,则不相等。
2.
为什么会有上述的输出结果?从中你又能总结出什么?
答:在第一句判断s1=s2时由于赋值语句s2=s1则结果为true;执行s1+=b后s1与s2不再相等,则第二句判断结果为false;第三句中虽然s1中的内容为ab但是字符串ab是一个常量它所引用的字符串ab与s1对象无关,因此判断结果为false;第四句中由于s1内容为ab则利用函数可以判断得到与字符串ab相等,则结果为true。
3.请查看String.equals()方法的实现代码,注意学习其实现方法。
String.equals()实现代码:
public boolean equals(Object anObject)
{
//如果是同一个对象
if
(this == anObject)
{
return
true;
}
//如果传递进来的参数是String类的实例
if
(anObject instanceof String)
{
String
anotherString = (String)anObject;
int
n = count;//字符串长度
if
(n == anotherString.count) //如果长度相等就进行比较
{
char
v1[] = value;//取每一个位置的字符
char
v2[] = anotherString.value;
int
i = offset;
int
j = anotherString.offset;
while
(n-- != 0) //对于每一位置逐一比较
{
if
(v1[i++] != v2[j++])
return
false;
}
return
true;
}
}
return
false;
}
程序代码是先判断是否为同一个对象,如果是则结果直接为true,若不是则判断其长度是否相等,然后定义字符数组判断数组中是否两个对象的每一个字符相等。
动手动脑:
- 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);
package test;
public class MyCounter {
int counter=0;
public MyCounter(int i) {
counter=i;
}
public MyCounter increase(int add) {
counter=counter+add;
return this;
}
public MyCounter decrease(int minus) {
counter=counter-minus;
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.counter);
}
}
动手动脑二:
String.equals()方法、整理String类的Length()、charAt()、 getChars()、replace()、 toUpperCase()、 toLowerCase()、trim()、toCharArray()使用说明、阅读笔记。
String.equals()方法使用时直接在两个对象比较即可,如A.equals(B);
String类方法应用:
Length():这个函数是用来计算字符串长度的;使用时创建对象,然后对象直接调用Length()即可;如:
public int length()
String s=”asfsdfwfsadf”;
System.out.println(s.length());
结果:12
charAt():这个函数是用来提取字符串中的字符,将字符的位置作为参数利用函数便可以提取中字符;如:
public charAt(int index)//index 是字符下标,返回字符串中指定位置的字符
String s=”Hello”;
System.out.println(s.charAt(3));
结果:l
getChars():该函数的功能是将字符串中的几个连续字符复制到数组当中;括号内应有4个参数
四个参数的含义
//1.被拷贝字符在字串中的起始位置
//2.被拷贝的最后一个字符在字串中的下标再加1
//3.目标字符数组
//4.拷贝的字符放在字符数组中的起始下标
然后用字符串对象直接调用即可。
replace():该函数功能为替换字符串,如
public int replace()
String s=”\”;
System.out.println(s.replace(“\”,”///”));
结果///;
toUpperCase():该函数功能为将字符串中的字符全部换为大写;如public String toUpperCase()
System.out.println(new String(“hello”).toUpperCase());
toLowerCase():该函数功能为将字符串中的字符全部换为小写;如:
public String toLowerCase()//将字符串全部转换成小写
System.out.println(new String(“HELLO”).toLowerCase());
trim():该函数功能为去除两边的空格;如:
public String trim()
String x=”ax c”;
System.out.println(x.trim());//是去两边空格的方法
toCharArraay():该函数功能为将字符串中的一个字符转化成一个字符串数组;如:
String x=”abcd”;
char myChar[]=x.toCharArray();
System.out.println(“myChar[1]”+myChar[1]);
结果:b
课后作业1:
- 古罗马皇帝凯撒在打仗时曾经使用过以下方法加密军事情报:
请编写一个程序,使用上述算法加密或解密用户输入的英文字串要求设计思想、程序流程图、源代码、结果截图。
程序设计思想:
编写两个函数解密和加密,根据规则进行字母的转换,并输出。在主函数中输入是要加密还是解密然后分别调用不同的函数。
程序流程图:
源代码:
package test;
import java.util.*;
public class Code {
String str;
static Scanner sc=new Scanner(System.in);
void jiami()
{
str=sc.next();
int length=str.length();
char c[]=str.toCharArray();
for(int i=0;i<length;i++)
{
if(c[i]>='A'&&c[i]<='W'||c[i]>='a'&&c[i]<='w')
c[i]=(char) (c[i]+3);
else if(c[i]>='X'&&c[i]<='Z'||c[i]>='x'&&c[i]<='z')
c[i]=(char)(c[i]-23);
}
System.out.println("加密后为:");
for(int i=0;i<length;i++)
System.out.print(c[i]);
}
void jiemi()
{
str=sc.next();
char a[]=str.toCharArray();
int length=str.length();
for(int i=0;i<length;i++)
{
if(a[i]>='d'&&a[i]<='z'||a[i]>='D'&&a[i]<='Z')
a[i]=(char)(a[i]-3);
else if(a[i]>='a'&&a[i]<='c'||a[i]>='A'&&a[i]<='Z')
a[i]=(char)(a[i]+23);
}
System.out.println("解密后为:");
for(int i=0;i<length;i++)
{
System.out.print(a[i]);
}
}
public static void main(String[] args) {
// TODO 自动生成的方法存根
Code code=new Code();
System.out.println("请输入您是要加密还是解密:1加密;2解密");
int n=sc.nextInt();
if(n==1)
code.jiami();
else if(n==2)
code.jiemi();
}
}
验证结果截图: