比较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
- 比较String[i].charAt(j)与char[i][j]的运行时间
- i += j ;与 i = i + j ; 的区别
- i+++j
- java i+=j 与 i = i+j 区别
- 数组a[i++]=j 与 a[i]++ 的区别
- 程序性能优化:a[i][j]与a[j][i]
- Z检验第i年j月与历史比较
- (i++)+(++i)+(++i)+(++j)+(j++)问题
- i = i++, i = ++i, j = i++, j = ++i 的区别
- a[i][j]与a[j][i]性能差别的原因
- i ^= (j ^= (i ^= j))的IL代码
- 交换i,j的值
- i++和++j的区别
- 动态规划中的最优二叉搜素树的介绍与理解(包含c源代码打印相关数据:e[i][j],root[i][j],w[i][j])
- n[i][j] <= n[i][j+1] n[i][j] <= n[i+1][j]
- main() {int i,j;
- for i,j
- SubString(i,j)体悟
- 关于返回局部变量的内存
- java学习、java教程:5种Java数据计算层的解决方法
- 七种可视化python工具
- 成功的秘诀
- JVM理解其实并不难!
- 比较String[i].charAt(j)与char[i][j]的运行时间
- LCA问题
- C程序的基础系统代码
- 关于Eclipse 自动重写某父类或者接口的方法@override
- java html javascript SQL 单双引号总结
- 解决使用valiform和同时上传多张图片问题
- 解决Mysql ERROR 1045 (28000): Access denied for user 'root'@'localhost'问题
- 二级联动菜单
- R中访问数据框的几种方式