比如: String text = abcd;
现在要 将text变成长度为1MB的 字符串,在abcd前补零.我试过用IF语句 :
protected String addZeroLeft(String str, int length)
{
if(str == null) {
str = "";
}
if(str.length()>length){
str = str.substring(0,length);
}
int iSize = length - str.length();

if(iSize <= 0) {
return str;
}
for(int i = 0; i < iSize; i++) {
str = "0" + str;
}
return str;
}结果效率很低,耗时太长时间才循环完.
而用 java.text.DecimalFormat 却要先给定 1MB的零,也是相当头疼的问题.
问高手有没有类似问题的解决方案. 急~~ 在线等.

解决方案 »

  1.   

    不要用String 要用 StringBuffer
      

  2.   

    string是不可修改的对象,楼主的做法将会产生非常多的对象,当然效率低,改用stringbuffer就不会了
      

  3.   

    public class Test {
        public static void main(String[] args) {
            String str = "abc";
            String newStr = addZeroLeft(str, 1024 * 1024);
            // 输出最后十位
            System.out.println(newStr.substring(1024*1024 - 10));
        }    public static String addZeroLeft(String str, int length) {
            if (str.length() >= length) {
                return str;
            }
            char[] c = new char[length - str.length()];
            for (int i = 0, k = c.length; i < k; i++) {
                c[i] = '0';
            }
            return new String(c) + str;
        }
    }
      

  4.   

    import java.math.BigDecimal;public class TestZero {
    private void addZero() {
    double start = System.currentTimeMillis();
    StringBuffer sb = new StringBuffer("");
    for(int i = 0; i< 10000; i++){
    sb.append("0");
    }
    double end = System.currentTimeMillis();
    System.out.println("Times:"+(end - start));
    } public static void main(String[] args) {
    new TestZero().addZero();
    }
    }
    控制台:
    Times:15.0
      

  5.   

    太谢谢楼上的几位了,谢谢 
    li_kewei 
    ProvidenceZY 
    bao110908 
    li_kewei 
    我这就试试看 ^_^ 
      

  6.   

    嘿嘿,这个题没有必要去使用StringBuffer,使用StringBuffer也要比使用char数组慢得多!
      

  7.   

    还有更好的办法吗? char[] 写法给个例子吧 .我试试 ^_^
      

  8.   

    我在3楼的例子就是使用char[]数组的啊
      

  9.   

    char数组是直接在内存中操作数的,是基本类型,实际上StringBuffer的内部也是以char[]实现的,
    但是它为什么会慢呢?这主要在于StringBuffer的长度是不定的,在容量不够时需要对数组进行扩容
    这样的操作就使效率明显降低了。这个题目由于事先知道长度的,可以使char数组定长,再者类的方法调用总要比操作基本类型数据来得
    慢,所以速度就快很多了,我试了一下,运行速度是StringBuffer的十分之一以下!
      

  10.   

    恩,受教了.
    还有个问题要问一下,给的定长是 length = 1024*1024 
    但是用sysout.println.out(newStr) 时,看不见 "0000..." 的输出 ,只看见"abcd".
    是不是println的长度受限制了呢? 当长度在 1024*31时候 ,"00.."能打出发行,1024*33 时,就打不出了.
    为什么呢? 
      

  11.   

    String newStr = addZeroLeft(str, 1024 * 1024);
            // 输出最后十位
    不是用 System.out.println(newStr.substring(1024*1024 - 10));
    而是用 Sysout.println.out(newStr) ; 
      

  12.   

    太多了,你是在什么地方运行的?是控制台下还是IDE中?
    你可以将这个字符串写到文件中就可以看到了。
      

  13.   

    IDE,
    恩 写到文件中就可以看见了. 
    吃饭咯,太谢谢拉. 学到不少东西.
      

  14.   

    不客气的啦,如果你用的是Eclipse的话,可以在Console上右击,选Preferences...
    修改Console buffer size的值就可以了。
      

  15.   

    在J2SE版上怎么还有个相同的帖子?
      

  16.   

    "
      --------在J2SE版上怎么还有个相同的帖子? "
       这个我就不知道了.火龙果 
    你有没有MSN,或是其它联系方式呢.
    以后向你提问题 ^_^