如果程序中有如下方法,该方法调用率非常非常的高,如果改写此方法,让程序执行效率高些?只要达到目的,什么方法都行谢谢public boolean test(String target)
{
if(target == null)
return false;
String source = "substr1;substr2;substr3;substr4;substr5...";

String [] strs = source.split(";");

for(int i = 0; i < strs.length; i++)
{
if(target.startsWith(strs[i]))
return true;
}
return false;
}

解决方案 »

  1.   

    String source = "substr1;substr2;substr3;substr4;substr5...";String [] strs = source.split(";");至少这个是没必要的,都是固定的,没必要放在方法里面,要么作为类成员,要么作为参数直接传进去,split用到了正则式,效率比较低
      

  2.   

    就是阿,可以传参数进来阿,或者改成indexof();不知道你的String source;是不是一个常量呢?
      

  3.   


    String source是个常量,可以先不考虑这个。下面这个循环,有没有办法转化为非String的比较,有没有方法很高效地找出target是不是以strs[i]开始的字符串?for(int i = 0; i < strs.length; i++)
    {
    if(target.startsWith(strs[i]))
    return true;
    }
      

  4.   

    不知到hashtable、Vector、Arraylist等的contains方法的效率如何?因为target并不是随意的字符串,而是一个相对固定的几十至上百个。
    将每次比较的结果放在hashtable 或者vector里面,每次先从先前的结果里面找,如果找不到再用startsWith比较,效率是不是会高些呢?
    谢谢
      

  5.   


    关键要从source的特征入手,比如source的长度,source子串的模式特征。只有知道这些特征才能更好下手。你可以考虑有几种常见的方式:对strs排序,二分匹配;使用搜索树;自定义一个hash函数。这几种方法只适用于strs数量比较大的时候。另外强调三点:一、对strs使用缓存,不要每次都计算。既然你在意性能,有必要修改。
    二、顺序匹配是最通用也最简单直观的方式,如果你想放弃这种算法,请确认确实有性能问题,并且性能问题确实出现在这里。
    三、重新了解source特征和目标特征。
      

  6.   

    谢谢楼上的,以及楼上的楼上的那些朋友们的回答。
    1、strs已使用缓存
    2、如果整个应用程序每个操作都涉及此方法的话,我想这个匹配操作也是性能的障碍。
    3、待我重新审视一下
    其实我只是在意朋友说的一句话 “字符串匹配其实效率不高的”,而整个应该程序的正常运行需要时刻运行类似这个的方法!网上也查到调用String API其实不是明智的做法。所以我想到,现把匹配的结果保存在一个比从source里面查找更高效的对象里面,然后再用这个对象查找。所以我想问:保存先前匹配结果是不是个好办法?有什么类能满足更高效的要求?hashtable、vector还是其他?
    谢谢