- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
所以我们被告知,当您对字符串执行多个操作时(我听说低至三个),应该使用 StringBuilder。因此我们应该替换它:
string s = "";
foreach (var item in items) // where items is IEnumerable<string>
s += item;
这样:
string s = new StringBuilder(items).ToString();
我假设 StringBuilder 在内部保存对每个附加字符串的引用,然后根据请求进行组合。让我们将其与 HybridDictionary 进行比较,HybridDictionary 对前 10 个元素使用 LinkedList,然后当列表增长超过 10 时交换到 HashTable。正如我们所看到的,这里有相同类型的模式,少量引用 = linkedList,否则制作不断增加的数组 block 。
让我们看看列表是如何工作的。从列表大小开始(内部默认值为 4)。向内部数组添加元素,如果数组已满,则创建一个两倍于当前数组大小的新数组,复制当前数组的元素,然后添加新元素并将新数组设为当前数组。
您能看到我对性能优势的困惑吗?对于除字符串之外的所有元素,我们创建新数组,复制旧值并添加新值。但对于字符串来说这很糟糕吗?因为我们知道“a”+“b”从两个旧引用“a”和“b”创建了一个新的字符串引用。
希望我的问题不会太令人困惑。为什么字符串连接和数组连接之间似乎存在双重标准(我知道字符串是字符数组)?
字符串:创建新引用是不好的!
T :其中 T != String:创建新引用很好!
编辑:也许我在这里真正要问的是,创建新的、更大的数组并复制旧值什么时候开始比在堆上随机放置对象的引用更快?
双重编辑:我所说的更快是指读取、写入和查找变量,而不是插入或删除(例如,LinkedList 在插入时会很有效,但我不关心这一点)。
最终编辑:我不关心 StringBuilder,我感兴趣的是为了缓存对齐而将数据从堆的一部分复制到另一部分所花费的时间,而不是仅仅采取cpu 缓存未命中,并且在整个堆上都有引用。什么时候一个会变得比另一个更快?*
最佳答案
Therefore we should replace this:
不,你不应该。第一个案例展示了可以在编译时发生的字符串连接,并将其替换为在运行时发生的字符串连接。前者更更可取,并且执行速度比后者更快。
当编译时连接的字符串数量未知时,使用字符串生成器非常重要。通常(但并非总是)这意味着在循环中连接字符串。
早期版本的 String Builder(4.0 之前的版本,如果没记错的话),内部看起来或多或少像 List<char>
,并且 4.0 后它看起来更像是 LinkedList<char[]>
是正确的。然而,使用 StringBuilder
之间的主要区别在循环中使用常规字符串连接并不是链表样式(其中对象包含对“链”中下一个对象的引用)和基于数组的样式(其中内部缓冲区过度分配空间并根据需要偶尔重新分配)之间的区别,而是可变对象和不可变对象(immutable对象)之间的区别。传统字符串连接的问题在于,由于字符串是不可变的,因此每次连接都必须将两个字符串中的所有内存复制到一个新字符串中。当使用StringBuilder
时新字符串只需复制到某种类型的数据结构的末尾,保留所有现有内存不变。什么类型的数据结构在这里并不是非常重要;我们可以信赖 Microsoft 使用的结构/算法已被证明在最常见的情况下具有最佳性能特征。
关于c# - 为什么 StringBuilder 比字符串操作快,但 List<T> 比 LinkedList<T> 快?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21438503/
我想添加 LinkedList (我们称之为列表 A)到 LinkedList> (称之为列表 B)。执行此操作后,我需要更改列表 A 的值并将其再次添加到列表 B,但不更改已存储在列表 B 中的值。
更新:感谢所有的回答。我发现的最干净的解决方案是这个: if ( k(Arrays.asList(new LinkedList<>())); 我有一个递归方法,可以从列表中生成所有“n 选 k”组合。
在我的 Java 应用程序中,以下两个都将编译和运行,并产生所需的结果。 //"Rotate" the list items one place to the left. myLinkedList.a
我写了一个LinkedList接受 Nodes 的类存储 Integers . 然后我创建了一个 LinkedList stack = new LinkedList() ,并添加了 Node s 如果
这个问题在这里已经有了答案: What does it mean to "program to an interface"? (33 个答案) 关闭 9 年前。 新手 Java 问题: 谁能解释一下
我有一个问题。我无法并排输出我的 LinkedList。我问了这个问题,但遗憾的是我的老师告诉我不要更改方法头或使用 java 库(如日历)。我得到了很多关于使用它或更改方法头的建议。我是根据年级而定
这里有什么问题?。我正在尝试使用邻接列表,通过利用 util 包中的集合来实现图形数据结构。这里 LinkedList array which holds some integer. Each ele
这个问题已经有答案了: Reversing a linked list in Java, recursively (33 个回答) 已关闭10 年前。 如何使用 linkedList 类中的方法以相反
我需要实现一个 LinkedList,到目前为止,我已经编写了在列表中按顺序插入值的方法。我有我的节点 front 作为我的类的实例数据,当创建我的第一个值并尝试将 front 的 next 值设置为
目前,我的 LinkedList(不是 Java 的)类中有一个方法,可以将单个节点添加到 LinkedList 中,如下所示: public void add(int index, T v) {
我正在编写一个读取 XML 文件的类,该 XML 使用“sax”类进行解析。在我的 XML 文件中,我创建了“for”标签和“宏”,使 for 循环能够写入 XML,例如: Th
我正在处理一个 C++ 作业,我将在一个链表的链表上创建一个搜索引擎。根据要求,我不能使用其他库和 STL。 基本上它会是这样的(我从小列表中删除了变量,因为它们是不相关的): 我的结构是这些: st
老实说,我现在真的很困惑这个问题,并且真的不知道如何解决这个问题。我需要编写一个方法,其中给定一个字符链接列表(例如:{'a','A','d','X'})并返回仅包含大写字符的列表(返回:{'A','
我正在尝试获取可执行文件中的两个链表,并在交替位置将它们合并到一起。前任。 ListOne 1,2,3 和 ListTwo 4,5 新的 ListOne 应该是 1,4,2,5,3。 链表.h文件:
这个问题在这里已经有了答案: Is List a subclass of List? Why are Java generics not implicitly polymorphic? (19 个回答
在尝试了解如何将哈希表插入LinkedLists时,我遇到了麻烦。我失去了尝试过的不同事物的数量。我知道我可以使用ArrayList或其他东西,但是我想使它与LinkedLists一起工作,以便可以对
我一直在尝试编写一种方法,不仅可以从 LinkedList(allUsers) 中删除对象(User),还可以从所有用户拥有的单个 LinkedList 中删除。谁能向我解释为什么这是错误的?我已经包
我有一个列表结构和一个名为树的递归函数。在下面的代码中,它永远不会到达 current == null 语句,因此它将永远运行。 如果我无法使用null,解决方案是什么? private void t
这个问题在这里已经有了答案: How does one add a LinkedList to a LinkedList in C#? (3 个答案) 关闭 9 年前。 假设我有以下内容: Link
我正在尝试为 LinkedList 创建一个反向 ListIterator,并且打算将其实现为 linkedList.listIterator(linkedList. size()) 交换了 next
我是一名优秀的程序员,十分优秀!