Java遍歷String字符的效率問題

其實(shí)這事是源自解一道LeetCode 208. Implement Trie (Prefix Tree)。
題目本身并不難,就是構(gòu)造一個(gè)多叉樹。我第一次提交代碼,AC了,但是效率不高,結(jié)果如下:
Runtime: 56 ms, faster than 11.64% of Java online submissions。
Memory Usage: 64.4 MB, less than 5.6% of Java online submissions for Implement Trie (Prefix Tree).
效率竟然這么低,那我得學(xué)習(xí)下各路大神的高效方案。但是看了幾個(gè),和我的方法并無區(qū)別,他們的效率肯定比較高的,不然不會(huì)把答案貼上來。那問題出在哪兒呢?我想了下,想起曾經(jīng)遇到String的toCharArray和charAt方法效率似乎有差別,難道是這里的原因。
我第一次提交的代碼(一部分):

/** Inserts a word into the trie. */
public void insert(String word) {
Node node=head;
for(char c:word.toCharArray()){
if(node.next==null){
node.next=new Node[26];
}
Node tNode=node.next[c-'a'];
if(tNode==null){
tNode=new Node(c);
node.next[c-'a']=tNode;
}
node=tNode;
}
if(node!=null){
node.isLeaf=true;
}
}

然后我修改了遍歷String字符那兒,變成了下面這樣:

/** Inserts a word into the trie. */
public void insert(String word) {
Node node=head;
for(int i=0;i<word.length();i++){
char c=word.charAt(i);
if(node.next==null){
node.next=new Node[26];
}
Node tNode=node.next[c-'a'];
if(tNode==null){
tNode=new Node(c);
node.next[c-'a']=tNode;
}
node=tNode;
}
if(node!=null){
node.isLeaf=true;
}
}

一提交,差別可不小:
Runtime: 29 ms, faster than 99.37% of Java online submissions.
Memory Usage: 48.9 MB, less than 100.00% of Java online submissions.

然后去閱讀了一下源碼:
public char charAt(int index) {
if ((index < 0) || (index >= value.length)) {
throw new StringIndexOutOfBoundsException(index);
}
return value[index];
}

public char[] toCharArray() {
// Cannot use Arrays.copyOf because of class initialization order issues
char result[] = new char[value.length];
System.arraycopy(value, 0, result, 0, value.length);
return result;
}

其實(shí)看源碼就很明顯了,charAt本身內(nèi)部也是數(shù)組操作,而toCharArray要copy一遍,既花時(shí)間又耗空間,如果只是讀取功能,顯然應(yīng)該使用charAt。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • "use strict";function _classCallCheck(e,t){if(!(e instanc...
    久些閱讀 2,142評(píng)論 0 2
  • /*【程序21】 * 作者 南楓題目:求1+2!+3!+...+20!的和 1. 程序分析:此程序只是把累加變成了...
    HUC南楓閱讀 500評(píng)論 0 0
  • pyspark.sql模塊 模塊上下文 Spark SQL和DataFrames的重要類: pyspark.sql...
    mpro閱讀 9,920評(píng)論 0 13
  • 一. Java基礎(chǔ)部分.................................................
    wy_sure閱讀 4,017評(píng)論 0 11
  • 目錄 1. 棧和隊(duì)列1.用兩個(gè)隊(duì)列實(shí)現(xiàn)棧2.用兩個(gè)棧實(shí)現(xiàn)隊(duì)列3.實(shí)現(xiàn)一個(gè)棧,可以用常數(shù)級(jí)時(shí)間找出棧中的最小值4.判...
    MigrationUK閱讀 3,133評(píng)論 4 20

友情鏈接更多精彩內(nèi)容