4动手动脑,总结及凯撒加密

一、StringEquals.java

  1.源代码

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

}

}

  2.运行结果截图

 4动手动脑,总结及凯撒加密

3.分析Java中的equals和==

n==m结果为true,变量n和m存储的值都为3,所以是相等的。但str1和str2两次比较的结果不同,这是因为基本数据类型变量和非基本数据类型变量存在区别。Java里的8种基本数据类型:整型(byte,short,int,long)、浮点型(float,double)、字符型(char)、布尔型(boolean),对于这8种基本数据类型的变量,变量直接存储的是值,因此在用关系操作符==来进行比较时,比较的就是值本身。要注意浮点型和整型都是有符号类型的,而char是无符号类型的(char类型取值范围为0~2^16-1)。

例:

    Int n=3;

    Int m=3;

变量n和m都是直接存储的“3”数值,所以用==比较的时候输出结果为true.

而对于非基本数据类型的变量,比如源代码里的str1就是引用类型的变量,引用类型的变量存储的并不是 “值”本身,而是于其关联的对象在内存中的地址。

例:

     String str1;

这句话声明了一个引用类型的变量,此时它并没有和任何对象关联。而 通过new String("hello")来产生一个对象(也称作为类String的一个实例),并将这个对象和str1进行绑定:str1= new String("hello");那么str1指向了一个对象(很多地方也把str1称作为对象的引用),此时变量str1中存储的是它指向的对象在内存中的存储地址,并不是“值”本身,也就是说并不是直接存储的字符串"hello"。因此在用==str1str2进行第一次比较时,得到的结果是false。因此它们分别指向的是不同的对象,也就是说它们实际存储的内存地址不同。而在第二次比较时,都让str1和str2指向了str指向的对象,那么得到的结果毫无疑问是true。

而第三个输出结果为true,是因为String类对equals方法进行了重写,用来比较指向的字符串对象所存储的字符串是否相等。

4.总结

1)对于==,如果作用于基本数据类型的变量,则直接比较其存储的 “值”是否相等;如果作用于引用类型的变量,则比较的是所指向的对象的地址

2)对于equals方法,注意:equals方法不能作用于基本数据类型的变量如果没有对equals方法进行重写,则比较的是引用类型的变量所指向的对象的地址;诸如String、Date等类对equals方法进行了重写的话,比较的是所指向的对象的内容。

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

1.Length()

   计算字符串长度。

2.charAt()

  获取指定位置的字符

3.getChars()

获取从指定位置起的子串复制到字符数组中,比如 s1.getChars( 0, 5, charArray, 0 );四个参数的含义:

1)被拷贝字符在字串中的起始位置。

     2)被拷贝的最后一个字符在字串中的下标再加1

     3)目标字符数组。

     4)拷贝的字符放在字符数组中的起始下标。

4.replace()

   子串替换,replaceoldstringnewstring);用新字符串代替旧字符串。

5.toUpperCase()toLowerCase()

  大小写转换,比如str.toUpperCase();str中所有小写转换成大写。

6.trim()

   去除头尾空格,比如str=” abc ”,str.trim();abc头尾的空格去掉。

7.toCharArray()将字符串对象转换为字符数组,str.toCharArray();str转换成char数组。

三、程序题(课后作业之字串加密)

1、实验题目

   使用上述算法加密或解密用户输入的英文字串

2、需求分析

     加密的基本思路是:通过把字母移动3位数来实现加密解密。例如原码字母A变成密码的D,依次类推,原码B变成密码E。如果有一个原码字符串为“Hello”,其密码为“Khoor”,那么要加密的话,就将字母向相反方向移动同样位数即可。即密码“Khoor”的每个字母向左移动三位变成“Hello”,由此看来位数3为加密解密的密钥。

3、思路

      程序中包含两个类,程序起始类Caesar和类JiaJie。类JiaJie中包含两个方法,public void jia()用于对字符串进行加密,从控制台获得待加密的字符串,定义key=3,利用for循环,将字符串的每一个元素都存入数组中,然后对数组的每一个元素进行加密,再使用两个if...else语句判断是大写还是小写字母,接着判断如果该元素是Xx)、Yy)、Zz)则分别替换为A(a)B(b)C(c),否则字母向后移动3,最后输出结果。public void jie()用于对字符串进行解密,方法与加密类似。程序起始类Caesar主要用于调用方法,

4、程序流程图

 4动手动脑,总结及凯撒加密

5、源代码

import java.util.*;

 

public class Caesar {  

void mj(){

Scanner in = new Scanner(System.in); 

        System.out.print("1.加密;2.解密。请选择:");          

        int n=in.nextInt(); //键盘输入操作序号    

        

        //加密

        if(n == 1){ 

            System.out.print("输入待加密的字符串:");              

            String str = in.next();//键盘输入字符串         

            String jm="";              

            int key = 3; //密钥

            for(int i = 0;i < str.length();i++)

            {                  

             char c = str.charAt(i);                  

             if(c >= 'a'&&c <= 'z')

             {                   

             if(c>='x'&&c<='z')

             {                    

             c-=26;                    

             c+=key; 

                 }                  

             else{                    

             c+=key;                   

             } 

                } 

                else if(c >= 'A'&&c <= 'Z')

                {                   

                 if(c>='X'&&c<='Z')

                 {                    

                 c-=26;                    

                 c+=key; 

                 }                   

                 else{                    

                 c+=key;                   

                 } 

                }                                   

             jm += c;              

             } 

            System.out.print("加密后的字符串是:"+jm); 

            System.out.print("
继续,输入1;结束,输入0。请选择:");              

            n=in.nextInt();             

          

            if(n==1){ 

             this.mj();              

             }  

            if(n==0){ 

                System.out.print("程序结束!");              

                }    

            } 

        

        //解密

        else if(n == 2){ 

            System.out.print("请输入待解密的字符串:");             

            String str = in.next();              

            String jm="";              

            int key = -3; 

            for(int i = 0;i < str.length();i++){                  

             char c = str.charAt(i);                  

             if(c >= 'a'&&c <= 'z'){                   

             if(c>='a'&&c<='c'){                    

             c+=26;                    

             c+=key; 

                 }                   

             else{                    

             c+=key;                   

             } 

                } 

                else if(c >= 'A'&&c <= 'Z'){                   

                 if(c>='A'&&c<='C'){                    

                 c+=26;                    

                 c+=key; 

                 }                   

                 else{                    

                 c+=key;                   

                 } 

                }                                   

             jm += c;              } 

          System.out.println("解密后的字符串:"+jm); 

          System.out.print("
继续,输入1;结束,输入0。请选择:");            

          n=in.nextInt(); 

          if(n==0)

          {          

           System.out.print("结束程序!"); 

          }            

          else

          {          

           this.mj(); 

          }        

          } 

        } 

 

 

    public static void main(String[] args) {     

     Caesar mj=new Caesar();   

        mj.mj();          

        }  

} 

6、运行结果截图