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

原创 2016年05月31日 09:23:03

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

我这里用一维比较了下:


import java.util.Scanner ;

public class test {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner 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 stub
		Scanner 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];
    }

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

版权声明:本文为博主原创文章,转载时请附上本博文源链接及博文内引用其他博文链接。

相关文章推荐

求浮点数数组A={A1,A2,A3,…,An}中,Aj-Ai(j>i)的最大值。要求时间复杂度越小越好

求浮点数数组A={A1,A2,A3,…,An}中,Aj-Ai(j>i)的最大值。要求时间复杂度越小越好。 1、问题分析: 如果没有时间现在,那么直接使用两层for循环,就能搞定问题。其代码大致如下...
  • csalp
  • csalp
  • 2011年10月13日 15:10
  • 1680

逻辑判断:A、B、C、D、E、F、G、H、I、J 共10名学生有可能参加本次计算机竞赛,也可能不参加。因为某种原因,他们是否参赛受到下列条件的约束 1. 如果A参加,B也参加;

/** * A、B、C、D、E、F、G、H、I、J 共10名学生有可能参加本次计算机竞赛,也可能不参加。因为某种原因,他们是否参赛受到下列条件的约束 0:1 2 3 4 5 6 7 ...

由矩阵元素的下标值i,j求矩阵元素

三元组表的一种变型是,从三元组表中去掉行下标域得到二元组表,另设一个行起始向量,其每个分量是二元组表的一个下标值,指示该行中第一个非零元素在二元组表中的起始位置。试编写一个算法, 由矩阵元素的下标值...

电脑键盘M J K L U I O P按键变成0 1 2 3 4 5 6 解决方法

笔记本的小键盘区一般是在右手边的字母区,是蓝色字的。  和台式机一样,笔记本也是有一个NUM LOCK键的。  就是小键盘区的开关(一般也是蓝色字的)。 使用方法是, 按住FN键(左下角)+N...
  • qinglu
  • qinglu
  • 2013年04月09日 17:53
  • 19699

[计算机组成原理][R-I-J型指令CPU设计实验总结]

总算解决一大心头之患了,比想象中容易,通宵两夜,刷完了十个实验,这个实验就是最后的了。感慨颇多。特地写篇总结。 想做一件事,就立马去做把。你会发现没那么困难,往往最大的困难,是心里的困难。 培养了HD...

2014 ACM 上海现场赛B,I,J && UVALive7146 7147 7139

2014最难赛区7146 贪心这道题是考验STL的. 我们按照一个顺序排序(我方攻击力升序,敌方防御力升序), 此时因为要全部歼灭,优先考虑如何干掉敌方防御力最高的,此时将所有攻击力比它高的我方都...

Array[0] 利用i,j简化代码

1. Remove Element 走一遍A[],把符合要求的元素写到j class Solution { public: int removeElement(int A[], int n,...

ACdream 群赛11.10 Problem J: I can't describe the problem

Problem J: I can't describe the problem Time Limit: 10 Sec  Memory Limit: 128 MB Submit: 38  Solve...

参赛约束 A、B、C、D、E、F、G、H、I、J 共10名学生有可能参加本次计算机竞赛,也可能不参加。

我实在没有想到更好的方法了,只好老老实实的,枚举了,十个for,是个人...package org.bluebridge.topics; /*参赛约束 A、B、C、D、E、F、G、H、I、J 共1...

dom4j的使用(I)

DOM4J是dom4j.org出品的一个开源XML解析包,它的网站中这样定义: Dom4j is an easy to use, open source library for working wi...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:比较String[i].charAt(j)与char[i][j]的运行时间
举报原因:
原因补充:

(最多只允许输入30个字)