学习笔记——String a=""和String a=new String("")的的关系和异同

这只是笔者自己的学习笔记,可能不全和有错,欢迎指出

在说二者之前,必须先引入一个概念***常量池***
Java中的常量池分为两类:静态常量池和运行时常量池。

静态常量池,即*.class文件中的常量池,class文件中的常量池不仅仅包含字符串(数字)字面量,还包含类、方法的信息,占用class文件绝大部分空间。这种常量池主要用于存放两大类常量:字面量(Literal)和符号引用量(Symbolic References),字面量相当于Java语言层面常量的概念,如文本字符串,声明为final的常量值等,符号引用则属于编译原理方面的概念,包括了如下三种类型的常量:

类和接口的全限定名
字段名称和描述符
方法名称和描述符

运行时常量池,是jvm虚拟机在完成类装载操作后,将class文件中的常量池载入到内存中,并保存在方法区中,我们常说的常量池,就是指方法区中的运行时常量池。记住常用方法:String的intern()方法会查找在常量池中是否存在一份equal相等的字符串,如果有则返回该字符串的引用,如果没有则添加自己的字符串进入常量池。

这里主义,我们今天的重点就是方法区中的常量池。

String a = " hello";

以这种形式进行的字符串直接赋值,我们叫做直接量,它是将“ ”,里面的内容放在了常量池中,这种形式的字符串,在JVM内部发生字符串拘留,即当声明这样的字符串之后,JVM会在常量池中先查找有没有一个值 与" “内的值相等的对象,如果,就直接把他赋给当前的引用,即原来的那个引用和现在这个引用指向了同一对象,如果没有,则在常量池中新创建一个” ",下一次如果又同样的声明,有将会把该引用指向同样的对象,即以这样的形式声明的字符串,只要值相等,任何多个引用都指向同一对象。常量池中相同的对象只会有一个。

String a = new String(" hello");

不管内存中是不是已经有“ ”,就创建一个新的对象保存“hello”,String a = new String(“hello”);是在堆中创建一个新的对象 a 和”hello“,

总结

String str = “a”; 这个只是一个引用,内存中如果有“a"的话,str就指向它;如果没有,才创建它;如果你以后还用到"a"这个字符串的话并且是这样用:
String str1 = "a"; String str2 = "a"; String str3 = "a";
这4个变量都共享一个字符串"a"。
而String str = new String(“a”);是根据"a"这个String对象再次构造一个String对象,将新构造出来的String对象的引用赋给str。
JVM会使用常量池来管理形如”hello“的字符串直接量(包括在编译时就计算出来的字符串值),当使用new String(“hello”) 时,JVM会先使用常量池来管理”hello“直接量,再调用String的构造器来创建一个新的String对象,新创建的String对象被保存在堆内存中。即new String(”hello“)一共产生了两个字符串对象。

资料来源:
常量池

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值