我想遍历String中的每个字符,并将String中的每个字符作为String传递给另一个函数。
String s = "abcdefg";
for(int i = 0; i < s.length(); i++){
newFunction(s.substring(i, i+1));}
或
String s = "abcdefg";
for(int i = 0; i < s.length(); i++){
newFunction(Character.toString(s.charAt(i)));}
最后的结果必须是一个String。
那么,有什么想法会更快或更有效吗?
6条答案
按热度按时间xriantvc1#
像往常一样:这没关系,但如果你坚持花时间在微优化上,或者如果你真的喜欢为你的非常特殊的用例进行优化,试试这个:
sigwle7e2#
答案是:it doesn't matter。
分析你的代码。这是你的瓶颈吗?
epggiuax3#
newFunction
真的需要取一个String
吗?如果你能让newFunction
取一个char
并这样调用它会更好:这样,就避免了创建临时String对象。
回答你的问题:很难说哪一个更有效率。在这两个例子中,必须创建一个只包含一个字符的
String
对象。哪个更有效取决于String.substring(...)
和Character.toString(...)
在特定Java实现中的实现方式。唯一的方法是通过分析器运行程序,看看哪个版本使用更多的CPU和/或更多的内存。通常,您不应该担心像这样的微优化-只有当您发现这是性能和/或内存问题的原因时,才应该在这方面花费时间。6mw9ycah4#
我同意Will的观点,它几乎肯定与代码的整体性能无关-如果不是,你可以自己做些改变,并确定在硬件上使用JVM时哪一个对数据来说是最快的。
也就是说,如果首先将String转换为char数组,然后对数组执行迭代,那么第二个代码片段可能会更好(转换成数组)而不是每次调用。另外,你可以直接把数组和一些索引一起传递给String构造函数,这比从数组中取出一个char out 来单独传递它(然后变成一个字符数组)更有效:
但是为了强调我的第一点,当你看到你在每次调用
String.charAt()
时实际上避免了什么-它是两个边界检查,一个(惰性)布尔OR和一个加法。这不会产生任何明显的差异。String构造函数的差异也是如此。从本质上讲,这两种习惯用法在性能方面都很好(两者都不是立即明显低效的),所以你不应该花更多的时间来处理它们,除非分析器显示这占用了你应用程序的大量运行时。即使这样,你几乎可以肯定通过在这方面重新构造你的支持代码来获得更多的性能提升(例如,让
newFunction
自己处理整个字符串);String在这一点上得到了很好的优化。pokxtpni5#
我首先使用String.toCharArray()从源String获取底层char[],然后继续调用newFunction。
但我同意Jesper的观点,如果你能只处理字符,避免所有的字符串函数,那将是最好的。
1sbrub3j6#
Leetcode似乎更喜欢子字符串选项here。
我是这样解决这个问题的:
}
这是他们给予的最优解:
}
说实话我不知道这有什么关系