第六周10.24
1.字符串加密解密工作
古罗马皇帝凯撒在打仗时曾经使用过以下方法加密军事情报
程序设计思想:设计类进行方法的定义,定义两个带参数的方法分别为解密和加密。在测试类中判断要进行的工作,是加密还解密,定义对象,引用类的方法
程序流程图:
程序源代码:
package kehoua; import java.util.Scanner; class Test { public void jiami(String n)//对输入的字符串进行加密 { String k=" "; for(int i=0;i<n.length();i++) { char b=n.charAt(i); if(b>='A'&&b<='Z') { if(b>='X'&&b<='Z') { b=(char) (b-23); } b=(char) (b+3); } k=k+b;//将加密之后的字符串赋值给k } System.out.println("加密之后的字符串为"+k); } public void jiemi(String n)//对输入的字符串进行解密 { String k=" "; for(int i=0;i<n.length();i++) { char b=n.charAt(i); if(b>='A'&&b<='Z') { if(b>='A'&&b<='C') { b=(char) (b+23); } b=(char) (b-3); } k=k+b;//将解密之后的字符串赋值给k } System.out.println("解密之后的字符串为"+k); } } public class Jiami { public static void main(String[] args) { Test h=new Test(); Scanner in=new Scanner(System.in); String x=null;//初始化要输入的字符串 int i=0; System.out.println("进行加密请输入1,解密输入2"); System.out.println("请输入你想进行的操作:"); i=in.nextInt(); if(i==1) { System.out.println("请输入要进行加密的字符串:"); x=in.next(); h.jiami(x);//调用Test中的加密方法 } else if(i==2) { System.out.println("请输入要进行解密的字符串:"); x=in.next(); h.jiemi(x);//调用Test中的解密方法 } else //异常字符的处理 { System.out.println("输入的字符不合法"); } } }
程序执行结果截图:
试验后总结
本次编写在字符串的变化中出现问题,ASCII值的加减出现问题,以及字符串与ASCII值之间的相互转换
2.动手动脑
(1)源代码
package kepool; public class StringPool { public static void main(String args[]) { String s0="Hello"; String s1="Hello"; String s2="He"+"llo"; System.out.println(s0==s1);//true System.out.println(s0==s2);//true System.out.println(new String("Hello")==new String("Hello"));//false } }
结果截图
原因分析:在Java中,内容相同的字串常量“Hello”只保存一份,以节约内存,所以s0,s1,s2实际上引用的是同一个对象,所以在进行判断的时候输出结果为true;而当直接使用new关键字创建字符串对象时,虽然值一都是“Hello”,但仍然是两个独立的对象,在进行判别的时候地址不同,系统输出false
(2)
package kepool; public class StringPool1 { public static void main(String[] args) { String s1="a"; String s2=s1; System.out.println("s1==s2");//true s1+="b"; System.out.println("s1==s2");//false System.out.println(s1=="ab");//false System.out.println(s1.equals("ab"));//true } }
执行结果截图
原因分析:第一个true,因为给字串变量赋值意味着:两个变量(s1,s2)现在引用同一个字符串对象“a”!
第二个false因为String对象的内容是只读的,使用“+”修改s1变量的值,实际上是得到了一个新的字符串对象,其内容为“ab”,它与原先s1所引用的对象”a”无关,所以,s1==s2返回false;
第三个false因为代码中的“ab”字符串是一个常量,它所引用的字符串与s1所引用的“ab”对象无关。
第四个true的输出是因为String.equals()方法可以比较两个字符串的内容,而内容都是ab,所以输出true
(3)String.equals()方法的实现代码
package kepool; 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因为新建了两个s1,s2字符串对象地址不同,所以判别为false,当时用String.equals()方法后,s1.equals(s2)比较的是s1s2之内的字符串的内容,都为hello所以true
内容相同的字串常量“Hello”只保存一份,以节约内存,所以s3s4直接对比为true
3.整理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]);