Java CharAt()和deleteCharAt()性能。
|
我一直想知道java中String / StringBuilder / StringBuffer的charAt函数的实现
它的复杂性是什么?
还有StringBuffer / StringBuilder中的deleteCharAt()呢?
没有找到相关结果
已邀请:
5 个回复
导力疵谜
,
和and2ѭ,
是恒定时间操作。 对于
和
,
是线性时间运算。
和
具有非常相似的性能特征。主要区别在于前者是
(因此是线程安全的),而后者则不是。
窃誓额
如我们所见,这只是一个单一数组访问,这是一个恒定时间的操作。 StringBuffer.charAt:
同样,单阵列访问,因此是恒定时间的操作。 StringBuilder.charAt:
同样,单阵列访问,因此是恒定时间的操作。即使这三种方法看起来都一样,也存在一些细微的差异。例如,仅StringBuffer.charAt方法被同步,而其他方法则不同步。同样,如果检查String.charAt是否稍有不同(猜为什么)。仔细研究这些方法实现本身会给我们它们之间的其他细微差别。 现在,让我们看一下deleteCharAt的实现。 字符串没有deleteCharAt方法。原因可能是它是一个不变的对象。因此,公开一个明确指示该方法修改对象的API可能不是一个好主意。 StringBuffer和StringBuilder都是AbstractStringBuilder的子类。这两个类的deleteCharAt方法将实现委托给其父类本身。 StringBuffer.deleteCharAt:
StringBuilder.deleteCharAt:
AbstractStringBuilder.deleteCharAt:
仔细研究AbstractStringBuilder.deleteCharAt方法可以发现它实际上是在调用System.arraycopy。在最坏的情况下,该值为O(N)。因此deleteChatAt方法的时间复杂度为O(N)。
禽兢玫坞劲
方法为
。 假设您要从
字符
/
中删除随机字符,则
和
上的
方法平均为
。 (它必须平均移动剩余字符的一半,以填充已删除字符留下的\“ hole \”。没有对多个操作的摊销;请参见下文。)但是,如果删除最后一个字符,费用是
。
没有
方法。 从理论上讲,
和
可以针对通过缓冲区在“ pass”中插入或删除多个字符的情况进行优化。他们可以通过在缓冲区中保留一个可选的“ gap”并在其中移动字符来做到这一点。 (IIRC,emacs以这种方式实现其文本缓冲区。)这种方法的问题是: 它需要更多的空间,用于表示间隙在哪里的属性以及间隙本身。 它使代码复杂得多,并且减慢了其他操作的速度。例如,
必须将the31ѭ与间隙的起点和终点进行比较,并在获取字符数组元素之前对实际的索引值进行相应的调整。 如果应用程序在同一缓冲区上执行多次插入/删除操作,这只会有所帮助。 毫不奇怪,这种“优化”没有在标准的“ 2” /“ 1”类中实现。但是,自定义“ 34”类可以使用此方法。
亲奋漏
超级快(并且可以将内部函数用于String),它是数组的简单索引。
需要arraycopy,因此删除char不会很快。
坝胺绣敝