比较String[i].charAt(j)与char[i][j]的运行时间

来源:互联网 发布:录像软件fraps 编辑:程序博客网 时间:2024/06/18 07:04

今天,我在网上做算法题时总是提示“运行超时”,我很纳闷为什么,我一开始程序里用的String[].charAt(j),后来我开始尝试先将String ->toCharArray(),在利用char[][]进行获取字符,效果明显提升。

我这里用一维比较了下:


import java.util.Scanner ;public class test {public static void main(String[] args) {// TODO Auto-generated method stubScanner sc = new Scanner( System.in ) ;String str = new String() ;str = sc.next() ;while( !str.equals("") ) {/* 使用String[i].charAt(j)获取字符 */long t1 = (long) System.currentTimeMillis() ;for( int i = 0; i < str.length(); i ++ ) System.out.print( str.charAt(i) ) ;System.out.println();long t2 = (long) System.currentTimeMillis() ;long time1 = t2-t1 ;System.out.println(time1 + "ms");/* 先将String.toCharArray(),再利用char[i][j]获取字符 */long t3 = (long) System.currentTimeMillis() ;char[] ch = str.toCharArray() ;for( int i = 0; i < ch.length;  i ++ ) System.out.print( ch[i] ) ;System.out.println();long t4 = (long) System.currentTimeMillis() ;long time2 = t4-t3 ;System.out.println(time2 + "ms");System.out.println("--------------------------------------");str = sc.next() ;}}}



我输入几个字符串结果截图:



当输入字符串达到133333长度时运行时间 String.charAt比toCharArray后的字符数组将近要慢两倍以上!(当String.length()过长时我的eclipse结果会闪一下就没了,所以我用调试看的时间差)




我在琢磨原因,感觉时间差有两个原因:

1. String.length()与char.length计算时间有别     

2. charAt(i)与char [i] 时间有别

所以稍稍修改了一下程序,让他们都输出同样长度的字符(这里以100000长度为例),然后我输入刚才长度为133333长度的字符串

import java.util.Scanner ;public class test {public static void main(String[] args) {// TODO Auto-generated method stubScanner sc = new Scanner( System.in ) ;String str = new String() ;str = sc.next() ;while( !str.equals("") ) {/* 使用String[i].charAt(j)获取字符 */long t1 = (long) System.currentTimeMillis() ;for( int i = 0; i < 100000; i ++ ) System.out.print( str.charAt(i) ) ;System.out.println();long t2 = (long) System.currentTimeMillis() ;long time1 = t2-t1 ;System.out.println(time1 + "ms");/* 先将String.toCharArray(),再利用char[i][j]获取字符 */long t3 = (long) System.currentTimeMillis() ;char[] ch = str.toCharArray() ;for( int i = 0; i < 100000;  i ++ ) System.out.print( ch[i] ) ;System.out.println();long t4 = (long) System.currentTimeMillis() ;long time2 = t4-t3 ;System.out.println(time2 + "ms");System.out.println("--------------------------------------");str = sc.next() ;}}}


结果截图:

结果显示time1 减少了26ms,time2增加了29ms(这里好奇怪~),可见charAt(i)明显还是比toCharArray后[i]慢。


这里就有一个问题了:为什么?

我查看charAt的源码:

 public char charAt(int index) {        if ((index < 0) || (index >= value.length)) {            throw new StringIndexOutOfBoundsException(index);        }        return value[index];    }

并没有看出什么端倪。。汗。。麻烦有知道的朋友们能为我解答一下~

0 0