首页 > 其他分享 >String

String

时间:2023-04-19 11:11:08浏览次数:29  
标签:abc String 对象 内存 str new

1、创建的字符串变量在内存中的区别。

两者看似都是创建了一个字符串对象,但在内存中确是各有各的想法。

String str1= “abc”; 在编译期,JVM会去常量池来查找是否存在“abc”,如果不存在,就在常量池中开辟一个空间来存储“abc”;如果存在,就不用新开辟空间。然后在栈内存中开辟一个名字为str1的空间,来存储“abc”在常量池中的地址值。

String str2 = new String("abc") ;在编译阶段JVM先去常量池中查找是否存在“abc”,如果过不存在,则在常量池中开辟一个空间存储“abc”。

在运行时期,通过String类的构造器在堆内存中new了一个空间,然后将String池中的“abc”复制一份存放到该堆空间中,在栈中开辟名字为str2的空间,存放堆中new出来的这个String对象的地址值。

也就是说,前者在初始化的时候可能创建了一个对象,也可能一个对象也没有创建;后者因为new关键字,至少在内存中创建了一个对象,也有可能是两个对象。

2、特性不同:

String类 是final修饰的,不可以被继承。

String类的底层是基于char数组的。

3、性能效率不同:

String类被设计成不可变(immutable)类,所以它的所有对象都是不可变对象。例如:

String str = “hello";

str = str + "world“;

所以当上文str指向了一个String对象(内容为“hello”),然后对str进行“+”操作,str原来指向的对象并没有变,而是str又指向了另外一个对象(“hello world”),原来的对象还在内存中。

由此也可以看出,频繁的对String对象进行修改,会造成很大的内存开销。此时应该用StringBuffer或StringBuilder来代替String。

而new String()更加不适合,因为每一次创建对象都会调用构造器在堆中产生新的对象,性能低下且内存更加浪费。

标签:abc,String,对象,内存,str,new
From: https://www.cnblogs.com/mtx-1/p/17332647.html

相关文章

  • Java入门6(String和封装类)
    使用第三方jar包,完成get/set操作Lombok,结合特殊的注解,实现setter和getter的自动生成导入jar包使用插件Lombok在类里import即可使用importlombok.AllArgsConstructor;importlombok.Data;importlombok.NoArgsConstructor;//使用注解@Data,在类编译的时候,自动给class......
  • Java中实现String字符串用逗号隔开
    publicstaticvoidmain(String[]args)throwsException{ StringstrText="421542"; Stringinformation=""; intstart=0; intend=1; Stringdigit=""; intcount=strText.length(); for(inti=......
  • invalid comparison: java.util.ArrayList and java.lang.String 异常分析及解决方法
    nvalidcomparison:java.util.ArrayListandjava.lang.String异常解决方法异常原因首先我们可以确定是在mybatis的xml中的list操作出现错误然后发现在接收list的时候加了判断list!=’’,导致list(数组集合类型)和空字符串(字符串类型)进行比较,故报错解决办法,对于list类型进......
  • 告别StringUtil:使用Java 11的全新String API优化你的代码
    前言  Java11是Java编程语言的一次主要更新,引入了许多新功能和改进。并且在String类中引入了一些新的方法,能够更好地满足开发的需求,提高编程效率。repeat(intcount):返回一个新的字符串,该字符串是由原字符串重复指定次数形成的。isBlank():检查字符串是否为空白字符序......
  • 将map对象参数转换成String=String&方式
    *将map对象参数转换成String=String&方式*@paramparams*@paramcharset*@return*@throwsUnsupportedEncodingException*/publicstaticStringgenerateParams(Map<String,String>params,Stringcharset)throwsUnsupportedEn......
  • HttpRuntime.Cache[key] as List<string>竟然会引用转值改变Cache的值
    HttpRuntime.Cache[key]asList<string>竟然会引用转值改变Cache的值此时HttpRuntime.Cache[key]的值会发生改变 ......
  • TStringList分割字符串
    beginTmpStrList:=TStringList.Create;tryTmpStrList.Delimiter:='-';TmpStrList.StrictDelimiter:=True;TmpStrList.NameValueSeparator:=#0;TmpStrList.Duplicates:=dupAccept;TmpStrList.QuoteChar:=#0;DoSomething;finallyTmpStrList.Fr......
  • Delphi的字节对齐和简单string结构
    procedureTForm1.Button1Click(Sender:TObject);typeTTest=recordsAccount:string[31];//如果不加Packed30和31是相同的大小虽然是相同的,如果网络编程,传递后转换,Delphi是识别不出来的,会出现越界问题。sChrName:string[15];sUserAddr:string[15];nSessionID:......
  • random模块&string模块谈python中随机数
    一、概述随机数在程序设计中的属于比较基础的内容,主要用于验证场景(如验证码,生成账号对应的密码等),今天结合random模块和string模块来谈谈python中随机数那些事儿。二、随机数实现相关模块2.1random模块random.random()返回一个随机浮点数。>>>importrandom>>>print(ran......
  • WPF中Binding使用StringFormat格式化字符串方法
    https://blog.csdn.net/weixin_34040079/article/details/89587412 原文: WPF中Binding使用StringFormat格式化字符串方法 货币格式<TextBlockText="{BindingPrice,StringFormat={}{0:C}}"/>//$123.46货币格式,一位小数<TextBoxText="{BindingPrice,Str......