Java定义字符串:String 和 new String()的区别

先了解三个不同存储区:

  • 栈区:存放基本类型和引用类型的引用地址。
  • 堆区:存放对象
  • 字符串常量池:
    1. 直接使用双引号声明出来的 String 对象会直接存储在常量池中。
    2. 如果不是用双引号声明的 String 对象,可以使用 String 提供的 intern 方String.intern()。它的作用是:如果运行时常量池中已经包含一个等于此 String 对象内容的字符串,则返回常量池中该字符串的引用;如果没有,则在常量池中创建与此 String 内容相同的字符串,并返回常量池中创建的字符串的引用。

分别区分以下它们:

String str = "helloworld"

首先,会在栈区创建str引用,然后在字符串常量池中寻找是否存在指向其内容为helloworld的对象。如果有,则str的引用直接指向它;如果没有,则创建一个新的,然后将str的引用指向字符串常量池中的对象。

  • 如果后来又用String定义了一个str1的字符串常量String str1 = "helloworld",则直接将str1指向字符串常量池中已经存在的对象helloworld,不会再去创建新的对象。
  • 当对str = "hello"进行新的赋值,则str会指向字符常量池的hello
  • 这时如果定义String str3 = "hello"str == str3返回true。因为它们地址一样,值也一样。
  • 进行字符串连接操作:令str = str + "world",此时str指向的是在堆中新建的内容"helloworld"对象,所以str == str1返回的是false,因为它们地址不一样。
String的字符串拼接

根据下图,尽量避免多个字符串拼接,因为这样会重新创建对象。如果需要改变字符串的花,可以使用 StringBuilder 或者 StringBuffer。

		  String str1 = "str";
		  String str2 = "ing";
		  
		  String str3 = "str" + "ing";//常量池中的对象
		  String str4 = str1 + str2; //在堆上创建的新的对象	  
		  String str5 = "string";//常量池中的对象
		  System.out.println(str3 == str4);//false
		  System.out.println(str3 == str5);//true
		  System.out.println(str4 == str5);//false

在这里插入图片描述

String str = new String("helloworld")

直接在堆中创建对象

  • 如果有String str1 = new String("helloworld"),则str1不会指向之前创建的对象,而是重新创建一个对象并指向它。所以两个对象的地址也就不一样
  • equals()在String中被重写,比较的是内容

参考文章:

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值