目录
一、两种创建方式:
1.直接赋值:
创建0/1个对象,存储位置在常量池(String pool)
原理过程:常量池中还没有某字符串则创建,并返回其引用地址;常量池中已经有该字符串则不在创建,直接返回其地址。
2.new创建:
创建1/2个对象,存储位置在常量池和堆(Heap)
原理过程:常量池中还没有某字符串则创建,然后再在堆中创建某字符串,并返回堆中的地址;
常量池中已经有该字符串则不在创建,但堆中仍会创建某字符串,并返回堆中的地址。
解释:常量池只能有一个某字符串,堆中可以有任意个。
二、两种比较方式:
1.==:
比较 基础数据类型 或 引用类型
基础数据类型:比较值
基础数据类型有:byte1 short2 int4 long8 float4 double8 boolean? char2
引用类型(对象):比较地址
2.equals():
只能用于比较 引用类型
方法未被重写:equals方法最开始定义在超类Object中,比较的是引用的地址。
方法被重写:对于String类,equals方法比较的是字符串的内容。
三、补充知识点:
1.字符串常量池
(String类型为什么可以直接赋值?就和它有关)
String类是我们平常项目中使用频率非常高的一种对象类型,jvm为了提升性能和减少内存开销,避免字符的重复创建,其维护了一块特殊的内存空间,即字符串池,当需要使用字符串时,先去字符串池中查看该字符串是否已经存在,如果存在,则可以直接使用,如果不存在,初始化,并将该字符串放入字符创常量池中。
使用new String赋值不可以吗?可以,但是我们不开发中不建议用new String()的方式去创建字符串,原因如下:
两种创建方法的区别:
1. String str1= “abc”; 在编译期,JVM会去常量池来查找是否存在“abc”,如果不存在,就在常量池中开辟一个空间来存储“abc”;如果存在,就不用新开辟空间。然后在栈内存中开辟一个名字为str1的空间,来存储“abc”在常量池中的地址值。
2. String str2 = new String("abc") ;在编译阶段JVM先去常量池中查找是否存在“abc”,如果过不存在,则在常量池中开辟一个空间存储“abc”。在运行时期,通过String类的构造器在堆内存中new了一个空间,然后将String池中的“abc”复制一份存放到该堆空间中,在栈中开辟名字为str2的空间,存放堆中new出来的这个String对象的地址值。
也就是说,前者在初始化的时候可能创建了一个对象,也可能一个对象也没有创建;后者因为new关键字,至少在内存中创建了一个对象,也有可能是两个对象。
四、文章参考:
Java字符串池(String Pool)深度解析 - 风中程序猿 - 博客园 (cnblogs.com)
(1条消息) java中String new和直接赋值的区别_liuhmmjj的博客-CSDN博客_java string 赋值
(1条消息) Java:String类型为什么可以直接赋值?使用new String赋值不可以吗?_@阿证1024的博客-CSDN博客_string为什么可以直接赋值