今天学习了一些String的方法;结合看了一些JDK的String的源码,对于equals与==有了比较深刻的理解,在这里分享一下学习心得,也可以让我们后来回顾。-----------------------------------------------------------------------人生没有白走的路,每一步都算数。
这里贴上演示用代码;
package test1;
import java.util.Scanner;
public class testequals {
public static void main(String[] args) {
/**
* 测试新建的两个str赋值如果相同
* equals方法与==究竟有什么差异
*/
Scanner input = new Scanner(System.in);
String str2 = new String();
String str1 = input.next();//接收从控制台输入的abcde赋值给str1
str2 = "abcde";
System.out.println(str1.equals(str2));
System.out.println(str1==str2);
String str3 = "abcde";
String str4 = "abcde";
System.out.println(str3.equals(str4));
System.out.println(str3==str4);
}
}
运行结果截图:
结果分析:
可以看出,从控制台输入abcde后,虽然str1与str2内容相等,但是由于二者不是从同一个类而来,在用==判断时,依然返回false。在java中,会有常量池的概念,通俗的说,就是常量待的地方,str3与str4就是常量,equals与==都是 相等的。
总结:
二,关于equals与==比较
1 ,equals比较的是字符串是否相等,JDK首先判断比较的二者是否是同一个对象,若是,返回true,若不是,建立数组将二者字符一一存放进去,从第一个字符开始,一 一比较,若所有字符均相同,则返回true,否则,返回false。
2, == 比较的是二者是否是同一个对象,若是,返回true,否则,返回false。ESP:若比较的二者是常量定义,而不是通过新建对象,由于在java里面有常量池,所以也是返回true。
3 定义字符串可以这样:
String s1 =new String(“Hello World!”);
也可以
String s1 =“Hello World!”;//用双引号括住的一串字符
Java编译器自动为每个字符串常量生成一个String类的实例
String s1=“Hello World!”;
String s2=“Hello World!”;
此时:s1==s2;两个字符串在内存空间中的存放如下:
但是如果按照下面形式:
String s1=new String(“Hello World!”);
String s2=new String(“Hello World!”);
java就会为s1,s2,对应两个内存地址,二者不相等。
内存地址如下: