古罗马皇帝凯撒在打仗时曾经使用过以下方法加密军事情报:
请编写一个程序,使用上述算法加密或解密用户输入的英文字串要求设计思想、程序流程图、源代码、结果截图。
设计思想:编写一个类,调用这个类的静态方法,两个静态方法编入字符串,一个用来翻译原文,另一个用来翻译密码。利用循环对字符串中每个字符作+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]);