栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

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

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

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

首先,会在栈区创建 str引用,然后在字符串常量池中寻找是否存在指向其内容为helloworld的对象。如果有,则str的引用直接指向它;如果没有,则创建一个新的,然后将str的引用指向字符串Q常量池中的对象。
如果后来又用string定义了一个strl的字符串常量String strl = "helloworld",则直接将strl指向字符串常量池中已经存在的对象helloworld,不会再去创建新的对象。
当对str = "hello"进行新的赋值,则str 会指向字符常量池的hello。
这时如果定义string str3 = "hello"则str ==str3返回true。因为它们地址一样,值也一样。
进行字符串连接操作:令str = str + "world",此时str指向的是在堆中新建的内容"helloworld"对象,所以str =a strl返回的是 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 strl = new String( "helloworld"),则str1不会指向之前创建的对象,而是重新创建一个对象并指向它。所以两
个对象的地址也就不—样
·而equals ()在String中被重写,比较的是内容

补充

下面的语句中创建了多少个字符串对象:

String str = new string( "cat" );

在上面的语句中,可能创建1或2个字符串对象。如果池中已经有一个字符串Cat’,那么池中只会创建一个字符串’str”。如果池中没有字符串字面量"Cat",那么它将首先在池中创建,然后在堆空间中创建,因此将创建总共2个字符串对象。

String str = “cat” ;
创建总共1个字符串对象。

堆和常量池参考
链接

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/939806.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号