JAVA字符串的两种定义方式的区别

关于JAVA中两种字符串定义方式的区别

第一次写,就当复习总结一下,希望能帮到需要的人吧= =

我们知道在JAVA中,对于字符串的实例化方式有两种:

  • 直接赋值:String str = “Hello World”;
  • 构造方法实例化:String str = new String(“Hello World”);
    对于这两种实例化有何区别,首先我们先来聊一聊直接赋值的方式
    观察下面的例子:
public class StringDemo{
	public static void main(String[] args) {
		String str1 = "Hello qty";
		String str2 = "Hello qty";
		String str3 = "Hello qty";
		String str4 = "Hello ytq";
		System.out.println(str1==str2);
		System.out.println(str1==str3);
		System.out.println(str2==str3);
		System.out.println(str1==str4);
	}
}

对于以上的输出结果
true
true
true
false

“==”虽然是一种字符串的比较,但是它实际上比较的并不是字符串的内容,而比较的是它们所在的内存地址的数值。可能会有疑惑,字符串的直接赋值,会产生一个新的堆内存空间,那么这里应该产生了三块堆内存空间,并且有不同的三个内存地址才对,但这里为什么会出现str1和str2和str3的内存地址是相同的呢?
先来个内存图简单说明一下,在这里字符串的直接赋值方式,会给字符串赋予一个“名字”(其实就是堆内存的地址),并且开辟一段新的堆内存(存数据)。
在这里插入图片描述
画图水平一般,将就看吧,为什么这里会出现str1,str2,str3同时指向同一块堆内存?

因为这里JAVA存在着共享设计池(常量池)的概念

什么是共享设计模式?
在JVM底层实际会存在一个对象池,在用户通过直接赋值的方式定义了字符串时,这时候该字符串对应的匿名对象(在上述案例中就是Hello qty和Hello ytq,字符串常量就是对应的String类的匿名对象- -)自动“入池保存”,倘若后续过程中用户再次直接赋值定义了字符串并且还使用了相同的内容,那么将不再开辟新的堆内存,而是令其指向原来已经入池的对象进行引用。
因为字符串的值一旦设定将无法改变,因此,JAVA的设计者认为共享的设计方式,可以带来更高的效率。

  • 接下来说说构造方法实例化字符串的方式
    String str = new String(“Hello qty”);
    在这里插入图片描述

看到这里就已经很清楚构造方法实例化这种方式比较于直接赋值的缺陷所在,多开辟了一块堆内存,存在垃圾问题。
再来观察一段构造方法实例化字符串的代码:

public class StringDemo{
	public static void main(String[] args) {
	String str1 = new String("Hello qty");
	String str2 = "Hello qty";
	System.out.println(str1==str2);
	}
}

对于以上输出结果:
false
先来张图片说说,在此画上常量池:
在这里插入图片描述
s1先去常量池寻找是否有“Hello qty”的字符串,若有则不创建新的,仅仅在堆内存中创建字符串(因为new关键字存在,就一定会去堆内存中开辟空间存放字符串),接着s2直接赋值定义字符串时,由于常量池存在,故不会创建新的字符串。我们说过==符号在用于引用数据类型时,比较的是两者的地址值,前者在堆内存中有指向,后者没有,因此结果会得到false。

构造方法实例化字符串会存在一部分垃圾空间,便是堆内存中重复创建的字符串字段,因此直接赋值的方式确实优于构造方法的方式,因此字符串在使用时都使用的是直接赋值的方法。

  • 17
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值