String 字符串缓冲区如何帮助避免浪费资源

String 字符串缓冲区如何帮助避免浪费资源,string,function,dart,String,Function,Dart,因此,基本上,添加和处理字符串的方法正在被其他方法所取代,因为它会导致混乱和资源浪费。 我同意,但我想知道到底是什么导致了资源的浪费……正如这里所说的 “…而您运行的实现没有 用于处理字符串的复杂代码,最终可以执行很多操作 浪费的分配……” 字符串缓冲区方法如何避免这种浪费 我对这一点的解释来自Java/.NET背景,但同样的逻辑也适用 1。您必须学习可变和不可变对象的概念… 像Int32/Integer这样的对象是可变对象,这意味着它们可以在实例化后在当前内存位置进行更改。这是因为无论对象的值

因此,基本上,添加和处理字符串的方法正在被其他方法所取代,因为它会导致混乱和资源浪费。 我同意,但我想知道到底是什么导致了资源的浪费……正如这里所说的

“…而您运行的实现没有 用于处理字符串的复杂代码,最终可以执行很多操作 浪费的分配……” 字符串缓冲区方法如何避免这种浪费


我对这一点的解释来自Java/.NET背景,但同样的逻辑也适用

1。您必须学习可变和不可变对象的概念…

像Int32/Integer这样的对象是可变对象,这意味着它们可以在实例化后在当前内存位置进行更改。这是因为无论对象的值是多少,它在内存中的大小都不需要更改

字符串是不可变的对象,这意味着一旦分配它们,就不能在当前内存位置更改它们。这是因为从本质上讲,字符串可以是任意长度的,因此,每次字符串更改长度时,系统/运行时都必须在内存中找到一个新位置来存储字符串

2。串联与StringBuilder/StringBuffer的比较

由于字符串是不可变的,所以每次连接都会强制重新分配内存。假设以下示例使用ASCII编码(每个字符1字节)

此时,系统已经分配了11个字节的内存来存储字符串

message += "Hello Universe";
此时,系统必须为原始字符串再分配14个字节。您现有的11字节内存无法再存储新字符串

为什么“处理字符串的复杂代码”(
StringBuffer
/
StringBuilder
)可以帮助您

每次将字符串附加到缓冲区/生成器时,它都会分配一次内存,并在内存中保留指向该字符串的指针。下次分配字符串时,它将在新位置执行,而不会影响最后一个位置。一旦您完成了字符串的构建,缓冲区/构建器就会将一次性传递中的所有内容连接到一个字符串中,因此您的字符串分配将大大减少,因为您不是每次在缓冲区/构建器中添加内容时都这样做

例如:

StringBuilder builder = new StringBuilder();

builder.Append("Hello World");
此时,构建器已分配了11个字节,并保持该分配不变

builder.Append("Hello Universe");
此时,构建器又分配了14个字节,将最后一个字符串保留在tact中

builder.ToString();
此时,生成器将内存中的所有字符串连接成一个字符串

摘要:

串联是一种资源浪费,因为:

  • 系统/运行时必须清除旧的、取消引用的内存位置,这需要一些CPU时间。在Java/.NET中,它被称为垃圾收集

  • 每次重新分配内存都是一种浪费,直到垃圾回收器能够将其清除


  • 因此,级联降低了CPU性能和内存使用率

    我对这一点的解释来自Java/.NET背景,但同样的逻辑也适用

    1。您必须学习可变和不可变对象的概念…

    像Int32/Integer这样的对象是可变对象,这意味着它们可以在实例化后在当前内存位置进行更改。这是因为无论对象的值是多少,它在内存中的大小都不需要更改

    字符串是不可变的对象,这意味着一旦分配它们,就不能在当前内存位置更改它们。这是因为从本质上讲,字符串可以是任意长度的,因此,每次字符串更改长度时,系统/运行时都必须在内存中找到一个新位置来存储字符串

    2。串联与StringBuilder/StringBuffer的比较

    由于字符串是不可变的,所以每次连接都会强制重新分配内存。假设以下示例使用ASCII编码(每个字符1字节)

    此时,系统已经分配了11个字节的内存来存储字符串

    message += "Hello Universe";
    
    此时,系统必须为原始字符串再分配14个字节。您现有的11字节内存无法再存储新字符串

    为什么“处理字符串的复杂代码”(
    StringBuffer
    /
    StringBuilder
    )可以帮助您

    每次将字符串附加到缓冲区/生成器时,它都会分配一次内存,并在内存中保留指向该字符串的指针。下次分配字符串时,它将在新位置执行,而不会影响最后一个位置。一旦您完成了字符串的构建,缓冲区/构建器就会将一次性传递中的所有内容连接到一个字符串中,因此您的字符串分配将大大减少,因为您不是每次在缓冲区/构建器中添加内容时都这样做

    例如:

    StringBuilder builder = new StringBuilder();
    
    builder.Append("Hello World");
    
    此时,构建器已分配了11个字节,并保持该分配不变

    builder.Append("Hello Universe");
    
    此时,构建器又分配了14个字节,将最后一个字符串保留在tact中

    builder.ToString();
    
    此时,生成器将内存中的所有字符串连接成一个字符串

    摘要:

    串联是一种资源浪费,因为:

  • 系统/运行时必须清除旧的、取消引用的内存位置,这需要一些CPU时间。在Java/.NET中,它被称为垃圾收集

  • 每次重新分配内存都是一种浪费,直到垃圾回收器能够将其清除


  • 因此,级联降低了CPU性能和内存使用率

    我明白了,如果你了解内存管理,这是显而易见的……请注意,所有新程序员都了解初始化、声明、赋值和二进制代码我明白了,如果你了解内存管理,这是显而易见的……请注意,所有新程序员都了解初始化、声明、赋值和二进制代码