面试常问的String字符串常量池

创建字符串对象有两种方式
一种是通过初始化的方式创建

String str="Hello";

另一种是使用new关键字创建

String str = new String("Hello");

Java为了避免产生大量的字符串对象,设计了一个字符串池(String Pool),通过初始化方式创建的字符串对象都会存在于字符串池中,且字符串池中的字符串不会重复,以便可以被共享使用,提高存储效率。

 

其工作原理是:

当使用初始化的方式创建对象时,JVM会首先检查字符串池中是否存在值相等的字符串,如果存在,则不进行创建,而是直接返回字符串池中该字符串的引用地址。如果不存在,则创建该对象,并放入字符串池中,返回新创建的字符串的引用地址。

当使用new关键字创建对象时,JVM仍然首先检查字符串池中是否存在要创建的字符串,如果不存在,则在字符串池中创建一个字符串对象,然后在堆内存中继续创建一个字符串对象,返回堆对象的引用地址。如果存在,则只在堆内存中创建一个字符串对象,返回堆对象的引用地址。

 

字符串常量池存于堆内存中(1.8之前是方法区)。

example:

String str1 ="abc";
String str2 ="abc";
String str3 ="abc";
String str4 =new String("abc");
String str5 =new String("abc");
String str6 =new String("abc");

 

 

String str7 = new String("abc");

上面代码创建多少对象:(两个对象一个引用或者一个对象一个引用)

1、常量池中有“abc”,直接返回实例。否则,创建一个对象“abc”;

2、在堆内存创建对象new String (“abc”);

3、将对象地址赋给str7,创建一个引用。

 

String str8 = new String ("a"+"b");
String str9 = new String ("a")+"b";

上面代码创建多少对象:

str8:

常量池:a b  ab  三个

new String(“ab”) 一个

赋给str8 引用一个

 

str9:

常量池 b 一个

new String("a")一个

引用一个

 

 

其他类似图解:

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值