比较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];
    }

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

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

Java.toCharArray()和charAt()效率比较

LeetCode中的一道算法题,使用toCharArray()时间超时,换成charAt()之后通过,所以测试一下两者的运行效率: public static void test() { St...
  • Yiigel
  • Yiigel
  • 2017年01月18日 22:44
  • 920

十六进制字符串、char数组的转换: c c++ java

1.c版 int hexcharToInt(char c) {         if (c >= '0' && c         if (c >= 'A' && c        ...
  • yuanyuan_186
  • yuanyuan_186
  • 2014年06月15日 23:05
  • 516

String类常用方法之charAt()、codePointAt()示例

1、chatAt()——提取指定字符串 2、codePointAt()——提取索引字符代码点   Java代码 public class StringDemo {        ...
  • NilesHQ
  • NilesHQ
  • 2015年08月02日 11:36
  • 1534

【程序员面试金典】数组与字符串

今天开始看《程序员面试金典》这本书,这本书里面的算法题还是挺好的,能学到很多新的思想,解决问题的方式。我会针对里面的内容,总结下算法题的解题方法和代码的实现,有些题我会加上自己的思考,提供不止一种解法...
  • eson_15
  • eson_15
  • 2016年04月17日 17:55
  • 2576

Java编程优化之旅(二) String类型知多少

String 类大概是Java编程中用到最多的类。一段文本,一个URL,一个Email,甚至一串电话号码都是字符串。然而正是由于如此常用,所以关于String类中的一些低效率的使用方法更应该引起大家的...
  • guodongxiaren
  • guodongxiaren
  • 2014年04月05日 20:03
  • 2497

char数组 、char指针与字符串常量的比较

数组不是基本类型,不能直接参与比较,数组与字符串及字符指针与字符串比较其实比较的是二者的地址。 例: int isequiv(char *t) { if (t == "char") return 1;...
  • zz460833359
  • zz460833359
  • 2015年09月30日 18:48
  • 2700

android String.charAt的使用

今天,简单讲讲String里的  charAt()的使用。 描述 java.lang.String.charAt() 方法返回指定索引处的char值。索引范围是从0到leng...
  • bzlj2912009596
  • bzlj2912009596
  • 2017年10月13日 08:26
  • 240

Java字符串分割与高效的charAt方法

说明:本文是阅读《Java程序性能优化》(作者:葛一明)一书中关于字符串分割与查找一节的笔记。 一、字符串分割 1、采用split方法分割字符串 如下代码所示,对原始字符串进行了10000次分割,...
  • cdu09
  • cdu09
  • 2014年04月03日 00:43
  • 2999

逆波兰表达式

逆波兰表达式,也叫后缀表达式,比如,表达式”(56-20)/(4+2)”的逆波兰表达式为“56 20 - 4 2 + /”。将算术表达式用一颗二叉树表示,然后后序遍历该二叉树,即可得到它的逆波兰表达式...
  • sanqima
  • sanqima
  • 2015年09月30日 19:18
  • 458

相机校正(实现)

关于相机校正,opencv自带了程序,隐藏在calibration.cpp文件里,期初没有在意,后来才恍然大悟。我先贴出这段程序;#include #include #include "ope...
  • Jasmine_shine
  • Jasmine_shine
  • 2015年12月14日 10:41
  • 871
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:比较String[i].charAt(j)与char[i][j]的运行时间
举报原因:
原因补充:

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