/*
* equals和==区别
* 功能不同
"=="是判断两个变量或实例是不是指向同一个内存空间。
"equals"是判断两个变量或实例所指向的内存空间的值是不是相同。
定义不同
"equals"在JAVA中是一个方法,在Object中定义的。
"=="在JAVA中只是一个运算符合。
* */
/**
* 测试equals和==的异同
*/
public class Demo {
public static void main(String[] args) {
String s2=new String("equals");
String s1="equals";
boolean b2 = s1.equals(s2);
boolean b1 = s1 == s2;
System.out.println("使用==:"+b1 );
System.out.println("使用equals:"+ b2);
System.out.println("====================================");
/*
补充一:new String()与直接定义的区别
1、java字符串池:
和所有池的概念一样,字符串池为一块特殊的内存空间,存放已经定义过的字符串.当需要使用字符串时,先去字符串池中查看该字符串是否已经存在,如果存在,则可以直接使用,如果不存在,初始化,并将该字符串放入字符创常量池中
以上边操作为例:String s1 = "equals";创建了一个字符串常量,值为equals
此时字符串池中为空,创建一个s1时会把"equals"放入字符串池中。
再次创建String s2 = "equals";
字符串池中已有,直接使用,s1==s2为true
2.new String("equals");创建了一个字符串对象,值为equals
new关键字的作用:
内存(堆)中开辟一块空间
在开辟的空间中创建对象
调用对象的构造函数初始化对象
String s2=new String("equals");
此时由于new了一个对象,所以在堆中中一定会创建一个String对象
但检查字符串池时发现其中已经有了"equals",就不在创建了,否则会创建两个对象,但此时==的结果仍为false,因为一个地址在堆中一个在字符串池中
3.字符串常量是在再编译时确定的,字符串对象的值是在执行的时候确定的
*/
String s3 = "equals";
System.out.println(s1==s3);//ture
System.out.println("==================================");
/*
补充二:字符串拼接
str1、str2、str3是常量,编译时就确定了,str4中有一个str1,我们知道String是引用类型,
每一个变量名都是一个引用,所以str4不会在编译时确定,而String是final的,
所以在运行时确定就相当于创建了一个String对象,然后在把新创建对象的引用传给str4
所以在项目中还是不要使用new String去创建字符串,最好使用String直接赋值;
因为str4和str3值是一样的,但却存了两遍;但是str5和str3值一样并且指向的都是字符串池里的"ab"
*/
String str1 ="a";
String str2 = "b";
String str3 = "ab";
String str4 =str1+"b";
String str5 = "a"+"b";
String str6 = str1+str2;
System.out.println(str3==str4);//false
System.out.println(str3==str5);//ture
System.out.println(str3==str6);//false
/*
补充三:面试题
String s = new String(“xyz”); 产生几个对象?
一个或两个。如果常量池中原来没有 ”xyz”, 就是两个。
如果原来的常量池中存在“xyz”时,就是一个。
对于基础类型的变量和常量:变量和引用存储在栈中,常量存储在常量池中。
java中String new和直接赋值的区别
对于字符串:其对象的引用都是存储在栈中的,如果是编译期已经创建好(直接用双引号定义的)的就存储在常量池中,
如果是运行期(new出来的)才能确定的就存储在堆中。
对于equals相等的字符串,在常量池中永远只有一份,在堆中有多份(new几个有几个)。
*/
}
}
java中equals和==区别
于 2020-06-05 22:20:32 首次发布