代码之家  ›  专栏  ›  技术社区  ›  Greg B

为什么琴弦如此昂贵

  •  2
  • Greg B  · 技术社区  · 16 年前

    是什么让字符串的实现方式如此昂贵?

    不可能实现“廉价”的字符串实现吗?

    还是我的理解完全错了?

    9 回复  |  直到 16 年前
        1
  •  22
  •   ryeguy    16 年前

    哪种语言?

    字符串通常是不可变的,这意味着对数据的任何更改都会导致创建字符串的新副本。这可能会对大型字符串的性能产生影响。

    然而,这是一个重要的特性,因为它允许优化,比如实习。通过将相同的字符串指向相同的数据副本,Interning减少了文本数据的大小。

    如果您关心字符串的性能,请使用StringBuilder(在C#和Java中提供)或其他可用于可变文本数据的构造。

    如果您正在处理大量文本数据,并且需要一个功能强大的字符串解决方案,同时仍然可以节省空间, look into using ropes .

        2
  •  2
  •   luiscubal    16 年前

    字符串的问题在于它们不是基元类型。它们是数组。 因此,它们与阵列面临相同的速度和内存问题(可能需要进行一些优化)。

    现在,“便宜”的实现需要很多东西:连接、索引等等。 可以

        3
  •  2
  •   Harish    16 年前

    由于每次在java中都会创建对象的新副本,因此建议使用StringBuffer

    StringBuffer strBuff=new StringBuffer();
    strBuff.append("StringBuffer");
    strBuff.append("is");
    strBuff.append("more");
    strBuff.append("economical");
    strBuff.append("than");
    strBuff.append("String");
    String string=strBuff.tostring();
    
        4
  •  2
  •   NoMoreZealots    16 年前

    i、 e.串联=>获取字符串1的长度,获取字符串2的长度,分配内存,复制字符串1,复制字符串2。在字符串库中使用DMA控制器可以执行类似的操作,但是为小字符串设置DMA控制器的开销将超过其好处。

    皮特

        5
  •  1
  •   McAden    16 年前

    这完全取决于你想用它做什么。大多数情况下,它通常需要至少1个新的数组分配,除非它在直接搜索中替换单个字符。在最简单的级别上,字符串是字符数组。所以,您想要做的任何事情都包括迭代、删除或向数组中插入新内容。

        6
  •  1
  •   Imagist    16 年前

    ropes ,并考虑如何用低级语言(比如C)实现常见操作。考虑:

    1. 在索引处获取字符。
    2. 遍历字符串。

    针对这些情况提出算法将让您了解每种类型的存储何时合适。

        7
  •  0
  •   liori    16 年前

    如果您想要一个通用字符串在任何情况下都能工作,那么在某些情况下您必须牺牲效率。这是在快速完成一件事和另一件事之间的一个经典权衡。所以要么使用正常工作的“标准”字符串(但不是以最佳方式),要么使用在某些情况下非常快而在另一些情况下非常麻烦的字符串实现。

    有时您需要不变性,有时需要随机访问,有时需要快速插入/删除。。。

        8
  •  0
  •   Laserallan    16 年前

    字符串的更改和复制往往涉及内存管理。

    内存管理不利于性能,因为它往往需要某种全局互斥,这会使代码很难扩展到多个核心。

        9
  •  0
  •   JCCyC    16 年前

    您想阅读Joel Spolsky的这篇文章:

    http://www.joelonsoftware.com/articles/fog0000000319.html

    F***edString