每日一练7:java String使用解析

String是java中常见的引用类型,String是不可变类,String具有自己的一些特征。本文试图从String对象的创建、String方法参数传递、String的intern()方法。

一、String对象的创建

创建String对象有三种形式:一是通过双引号““字符串的方式。二是通过构造函数创建。三是通过连接符“+”方式创建。如下图1所示:

图1创建字符串的两种形式

字符串对象一旦创建就不可改变。如图2所示:首先创建了字符串s3,然后又将字符串指向了新创建的字符串对象。看上去这与“字符串对象一旦创建就不可改变”相矛盾。s3创建的过程如下:s3首先在编译期中在字符串常量池中判断是否存在hello字符串,如果不存在就直接创建该字符串对象,如果字符串常量池中有该字符串就直接返回该字符串的引用。在该例的s3中字符串常量池中没有hello字符串,所以直接创建一个新的字符串对象,接下来又将该s3栈变量的地址指向了另一个堆中新创建的字符串”world”。因此,此时字符串常量池中有字符串“hello”,还在堆中创建了一个”world”字符串对象。字符串对象“hello”创建后并没有改变,发生改变的是栈中字符串变量s3指向的引用地址。

图2 s3字符串对象的创建过程分析

图3 字符串常量池创建字符串过程分析

图4字符串常量池中的对象引用地址与堆中对象引用地址比较结果

图5 程序编译期确定的字符串对象

图6 程序运行期确定的字符串对象

二、String方法参数传递

如下图在main函数中,在字符串常量池中创建了字符串对象”hello”,调用f1方法后,栈变量s1一开始和s12指向同一个字符串对象,进入f1方法后,f1指向了另一个字符串对象,s12还是指向了原来的hello字符串,因此输出结果为hello。

图7 s12的值没有改变

三、String的intern()方法

调用 intern 方法时,如果常量池中已经存在该字符串,则返回常量池中的字符串;否则将此字符串添加到字符串常量池中,并返回该字符串的引用。在JDK7和JDK8中的运行结果如下图8所示:

图8 String的intern()方法使用示例

感谢阅读,动一动您的手指,分享给身边的朋友吧!谢谢!

长按识别二维码关注本文公众号

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值