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

 

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

设计思想:编写一个类,调用这个类的静态方法,两个静态方法编入字符串,一个用来翻译原文,另一个用来翻译密码。利用循环对字符串中每个字符作+3的操作(在这里需要用到强制类型转换,对于字母表结尾的xyz和开头的abc分别在转为密码和转为原文中特殊处理,即a---x,b---y,c---z),同时把这些字符加到一个准备输出的空字符串的后面

程序流程图:

 

源代码:

import java.util.Scanner;

public class JiaMi

{

public static void main(String[]args)

{

Scanner s = new Scanner(System.in);

System.out.print("输入一串原始字符串:");

String str = s.next();

System.out.println("对应密码为:"+Psw.lock(str));

System.out.print("输入一串密码字符串:");

str = s.next();

System.out.println("对应原文为:"+Psw.unlock(str));

s.close();

}

}

class Psw

{
private String original = "";

private String psw = "";

public Psw(String original)

{

this.original = original;

}

public void lock()

{

int len = original.length();

for(int i = 0;i<len;++i)

{

if(original.charAt(i)>='a'&&original.charAt(i)<='w')

psw+=(char)(original.charAt(i)+3);

else if(original.charAt(i)=='x')psw+='a';

else if(original.charAt(i)=='y')psw+='b';

else if(original.charAt(i)=='z')psw+='c';

else if(original.charAt(i)>='A'&&original.charAt(i)<='W')psw+=(char)(original.charAt(i)+3);

else if(original.charAt(i)=='X')psw+='A';

else if(original.charAt(i)=='Y')psw+='B';

else if(original.charAt(i)=='Z')psw+='C';

else

{

System.out.println("有异常字符,直接退出");

break;

}

}

}

public String getPsw()

{

return psw;

}

public static String lock(String str)

{

String str1 = "";

int len = str.length();

for(int i = 0;i<len;++i)

{

if(str.charAt(i)>='a'&&str.charAt(i)<='w')

str1+=(char)(str.charAt(i)+3);

else if(str.charAt(i)=='x')str1+='a';

else if(str.charAt(i)=='y')str1+='b';

else if(str.charAt(i)=='z')str1+='c';

else if(str.charAt(i)>='A'&&str.charAt(i)<='W')str1+=(char)(str.charAt(i)+3);

else if(str.charAt(i)=='X')str1+='A';

else if(str.charAt(i)=='Y')str1+='B';

else if(str.charAt(i)=='Z')str1+='C';

else

{

System.out.println("有异常字符,直接退出");

break;

}

}

return str1;

}

public static String unlock(String str)

{

String str1 = "";

int len = str.length();

for(int i = 0;i<len;++i)

{

if(str.charAt(i)>='d'&&str.charAt(i)<='z')

str1+=(char)(str.charAt(i)-3);

else if(str.charAt(i)=='a')str1+='x';

else if(str.charAt(i)=='b')str1+='y';

else if(str.charAt(i)=='c')str1+='z';

else if(str.charAt(i)>='D'&&str.charAt(i)<='Z')str1+=(char)(str.charAt(i)-3);

else if(str.charAt(i)=='A')str1+='X';

else if(str.charAt(i)=='B')str1+='Y';

else if(str.charAt(i)=='C')str1+='Z';

else

{

System.out.println("有异常字符,直接退出");

break;

}

}

return str1;

}

}

结果截图:

动手动脑:

请运行以下示例代码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()方法的实现代码,注意学习其实现方法。

代码:

public boolean equals(Object anObject)

{
if (this == anObject) {
return true;
}
if (anObject instanceof String) {
String anotherString = (String) anObject;
int n = value.length;
if (n == anotherString.value.length) {
char v1[] = value;
char v2[] = anotherString.value;
int i = 0;
while (n-- != 0) {
if (v1[i] != v2[i])
return false;
i++;
}
return true;
}
}
return false;
}

(1)String类中的equals首先比较地址,如果是同一个对象的引用,可知对象相等,返回true。

 (2)若果不是同一个对象,equals方法挨个比较两个字符串对象内的字符,只有完全相等才返回true,否则返回false

 

动手动脑之Stringequals()方法:

String类型当比较不同对象内容是否相同时,应该用equals,因为“==”用于比较引用类型和比较基本数据类型时具有不同的功能。

1:当对象不同,内容相同,"=="返回false,equals返回true

String s1=new String(“java”);

String s2=new String(“java”);

System.out.println(s1==s2);//false

System.out.println(s1.equals(s2));//true

2:当同一对象,"=="和equals结果相同

String s1=new String(“java”);

String s2=s1;

System.out.println(s1==s2);//true

System.out.println(s1.equals(s2));//true

3:如果值不相同,对象就不相同,所以"==" 和equals结果一样

String s1=”java”;

String s2=”java”;

System.out.println(s1==s2);//true

System.out.println(s1.equals(s2));//true

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

length():public int length()//求字符串长度

         String s=”dwfsdfwfsadf”;

         System.out.println(s.length());

charAt():public charAt(int index)//index 是字符下标,返回字符串中指定位置的字符

        String s=”Hello”;

        System.out.println(s.charAt(3));

getChars():public int getChars()//将字符从此字符串复制到目标字符数组

        String str = "abcdefghikl";

        Char[] ch = new char[8];

        str.getChars(2,5,ch,0);

replace():public int replace()//替换字符串

        String s=”\\\”;

        System.out.println(s.replace(“\\\”,”///”));

        结果///;

toUpperase():public String toUpperCase()//将字符串全部转换成大写

         System.out.println(new String(“hello”).toUpperCase());

toLowerCse():public String toLowerCase()//将字符串全部转换成小写

         System.out.println(new String(“HELLO”).toLowerCase());

trim():public String trim()

         String x=”ax  c”;

         System.out.println(x.trim());//是去两边空格的方法

toCharArray(): String x=”abcd”;// 将字符串对象中的字符转换为一个字符数组

           char myChar[]=x.toCharArray();

          System.out.println(“myChar[1]”+myChar[1]);