一、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.运行结果截图
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"。因此在用==对str1和str2进行第一次比较时,得到的结果是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()
子串替换,replace(oldstring,newstring);用新字符串代替旧字符串。
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语句判断是大写还是小写字母,接着判断如果该元素是X(x)、Y(y)、Z(z)则分别替换为A(a)、B(b)、C(c),否则字母向后移动3位,最后输出结果。public void jie()用于对字符串进行解密,方法与加密类似。程序起始类Caesar主要用于调用方法,
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("\n继续,输入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("\n继续,输入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、运行结果截图