关系运算符==
在介绍String之前,我们先来对关系运算符==进行一些探讨。
int a=12;
int b=12;
system.out.println(a==b);
最后输出的结果是ture。
如果是在基本数据类型之中,变量与值同在栈中,比较的是值是否相等。
Object object1=new Object();
Object object2=new Object();
System.out.println(object1==object2);
输出的结果是false。
原因:是引用类型的话,变量中存的是对象的地址,所以==比较的是地址是否相等。
如下图所示——对象的名称是naddre,地址是ox220,保存的值在栈中,是“河南郑州高新区”。
String对象
•String类是引用数据类型,该类实例化方式有两种:
直接赋值,其语法格式如下:
构造方法实现其实例化,其语法格式如下:
.
两种方式区别
•String类实例化的两种方式是有区别的:
直接赋值,对象存入常量池中;当JVM创建字符串对象前会先去常量池中找有没有一个字符串内容与当前字符串相同,有:将已有的地址赋值给变量;无,创建新的对象。
执行“String str1 = ”abc“;”后,JVM在常量池中开辟空间存放一个abc字符串空间并让str1指向该对象;
这种方式会出现常量池数据共享的现象:
1、执行“String str1 = ”abc“;”后,JVM在常量池中开辟空间存放一个abc字符串空间并让str1指向该对象;
2、执行“String str2 = ”abc“;”时,JVM会先检查常量池中是否已经存在了一个内容为abc的空间,如果存在就直接让str2指向该空间,否则就会在开辟一个新的空间存放该字符串;
3、执行“String str3 = ”def“;”时,JVM会先检查常量池中是否已经存在了一个内容为def的空间,由于不存在,所以JVM在常量池中新开辟一个空间存放def并让str3指向该空间;
实例化:直接存入堆内存;每new一次就会创建一个新的对象。
1、执行“String str1 = ”abc“;”后,JVM在常量池中开辟空间存放一个abc字符串空间并让str1指向该对象;
2、执行“String str2 = ”abc“;”时,JVM会先检查常量池中是否已经存在了一内容为abc的空间,如果存在就直接让str2指向该空间,否则就会在开辟一个新的空间存放该字符串,上面的代码等同于下面代码:
构造方法实现其实例化,这种方式每new一次就会创建新的对象:
1、执行“String str = ”abc“;”后,JVM在常量池中开辟存放abc的空间并让str指向该空间;
2、执行“String str1 = new String(str);”时,JVM直接创建一个新的对象并让str1指向该对象;
3、执行“String str2 = new String(str);”时,JVM再次创建一个新的对象并让str2指向该对象;