永发信息网

Java中多次更改一个String的值是否会让内存吃力?还是说只是改变String的值的指向?

答案:3  悬赏:80  手机版
解决时间 2021-02-16 05:08
  • 提问者网友:泪痣哥哥
  • 2021-02-15 08:24
Java中多次更改一个String的值是否会让内存吃力?还是说只是改变String的值的指向?
最佳答案
  • 五星知识达人网友:第幾種人
  • 2021-02-15 09:10
您好,提问者:
String确实是一个引用类型,如果改变指向的值大于改变之前的,那么内存肯定是多出一点的。
StringBuffer的效率比较高点、
全部回答
  • 1楼网友:青尢
  • 2021-02-15 10:36
String存的是一个引用类型(相当于C的指针),其中数据的改变,只是同一内存地址中存储内容变更,但他的地址没变,楼主可不必太担心,再说现在的软件对效率的考虑没有以前那么太深纠了,必竟不可能用java做什么实时系统
  • 2楼网友:舍身薄凉客
  • 2021-02-15 10:07
首先你要知道string是怎么分配内存的,如果使用字符串直接赋值,比如str="abc",那么它会先去常量区找,如果常量区已经有abc,那就直接把str指向abc,如果没有,它就在常量区再分配一个abc。使用new string("abc")的话,不管常量区有没有,它都会在堆里分配一个新的"abc"。 现在回答你的问题。 第一个问题,java的常量字符串+,编译器会自动优化,str3="ab"+"c",经过编译器优化后,实际上等于str3="abc",而常量区已经有一个str分配的"abc",因此str3直接指向str指向的"abc",因此str==str3。 substring(0,2)返回的也是一个string,它的分配也符合上述的规则,substring(0,2)返回"ab",ab在常量区没有对应的值,因此它会另外开辟内存,所以str2 != str。 第二个问题,substring的工作方式是,如果截取的是整个字符串,那它不会新new一个返回,而是直接返回原字符串。因此str.substring(0,3)实际上返回的就是str,所以它们是相等的。str.substring(0,1)截取的是第一个字符"a",这时候返回的也不是你想象的常量区的字符,而是一个新new出来的地址。 我们可以试试: string str = "abc"; string str2 = "a"; system.out.println(str.substring(0,1) == str2); system.out.println(str.substring(0,1).equals(str2)); 第一个输出false,第二个输出true。因为虽然前面str2初始化后常量区已经有一个"a",但substring截取的字串是新new出来的,不是直接指向常量区的"a“的。
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯