栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

Java字符串不变性和使用相同的字符串值创建新的字符串

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

Java字符串不变性和使用相同的字符串值创建新的字符串

字符串是内部char数组,具有一些与基础char数组一起使用的固有功能。例如。subString(int),split(String)方法。

字符串是不可变的,这意味着更改字符串引用所做的任何努力都会创建一个新的字符串并为此分配内存。如下

line 1. String a = new String("SomeString");line 2. a = "SomeStringChanged";

第1行使用变量a引用的“ SomeString”分配内存,并将“ SomeString ” 添加到 字符串池

第2行在 字符串池中 使用“ SomeStringChanged” 分配内存,并被aie a引用,现在不指向“ SomeString”,并且“
SomeString”占用的内存现在可用于 gc

这里没有重复使用

line 3. String  b =  "SomeStringChanged";

现在,文字“ SomeStringChanged* ”被变量 ab 重用 。也就是说,它们指的是 相同的内存位置
,实际上是指称为“ 字符串池 ”的位置。
***

line 4. a = new String("SomeStringChanged");

现在,新的分配完成包含“ SomeStringChanged ”,并引用 一个

没有再使用 ,现在发生的事情。(字符数组 SomeStringChanged的 字符串池中已经存在。因此,没有字符串池分配发生)

line 5. a = new String("SomeStringChanged").intern();

现在,在第4行中创建的分配将被丢弃,变量 ab 指向包含“
SomeStringChanged”的字符串池中的相同位置。这里重复使用相同的char数组。功劳归于 intern() 方法

line 6. String x = new String("SomeX");line 7. String y = "SomeX";

第6 行将 在堆和字符串池中为 SomeX 创建一个分配。char数组已重复。

第7行不会为 SomeX 分配任何内存,因为它已经在字符串池中了

Line 8 String s = new String(someStringVariable);

第8行将仅在堆中分配单个内存位置,而不在字符串池中分配单个内存位置。

总之,只有在将String引用声明为文字或将String对象插入的情况下,才可以重用字符串的char数组,即只有这两个可以使用String池(这实际上是char数组重用的思想)。



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

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

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