Dart中String的内存分配机制是什么?(对比Java实现)
Dart中String的内存分配机制
Dart的字符串处理围绕不可变性和**字符串常量池(字符串驻留)**展开,和Java的内存分配规则存在差异,具体如下:
字符串字面量的分配
直接通过var str = "xxx"这种字面量赋值时,Dart会在编译期将该字符串存入全局的字符串常量池。后续若有相同内容的字面量赋值,会直接复用常量池里的同一个对象——也就是说,相同内容的字面量只会生成1个内存实例。构造方法创建字符串的分配
Dart已废弃new String("xxx")这种写法,常用构造方式如String.from("xxx")、String.fromCharCodes(...)等的内存分配规则:- 如果构造方法的输入是已驻留的字符串(比如字面量),Dart会做优化,直接返回原驻留对象,不会创建新实例;
- 如果是运行时动态生成的内容(比如从网络读取的字符串、动态拼接的非字面量字符串),会在堆内存中创建新的String对象,且不会自动存入常量池。若需要复用相同内容的对象,可手动调用
str.intern()方法将其加入常量池,后续相同内容的intern()调用会返回同一个对象。
字符串拼接的特殊情况
编译期可确定的拼接(比如"a" + "b")会被Dart直接优化为字面量"ab",存入常量池;而运行时的动态拼接(比如var a = getStr(); var b = a + "c")会生成新的String对象,不会自动驻留。
和Java的核心区别在于:Dart不存在new String("xxx")强制生成两个对象的规则,即使通过构造方法创建,只要内容对应常量池里的驻留对象,就会复用实例,不会额外占用内存。
内容的提问来源于stack exchange,提问作者Хуршид Собиров
相关产品推荐
相关产品推荐

