为了账号安全,请及时绑定邮箱和手机立即绑定

一道朋友java面试的优化题 ,不得解

一道朋友java面试的优化题 ,不得解

侃侃尔雅 2019-03-21 18:19:36
优化以下代码 import java.util.ArrayList;    public class Test {            public static void main(String args[]) {            ArrayList<String> list = new ArrayList<>();                String prefix = "pre";                for (int i = 0; i < 400; i++) {                String s = prefix + i;                list.add(s);            }            System.out.println(list);        }    }不太清楚出题者的意图? String的问题?貌似是,但是不知道怎么改
查看完整描述

6 回答

?
30秒到达战场

TA贡献1828条经验 获得超6个赞

优化后代码如下:


    import java.util.List;

    import java.util.ArrayList;


    public class Test {

    

        public static void main(String args[]) {

        

            List<String> list = new ArrayList<String>();

    

            StringBuilder prefix = new StringBuilder("pre");

            int max = 400;

            for (int i = 0; i < max; i++) {

                int beforeAppLen = prefix.length();

                prefix.append(i);

                list.add(prefix.toString());

                prefix.delete(beforeAppLen, prefix.length());

            }

            System.out.println(list);

            

        }

    }

1、ArrayList 改为 List,体现继承的地方。


2、优化 String,改为使用 StringBuilder,性能优化。


3、提取局部变量400,使用有意义的变量命名,可读性问题。


查看完整回答
反对 回复 2019-04-17
?
四季花海

TA贡献1811条经验 获得超5个赞

import java.util.ArrayList;


public class Test {

    public static void main(String args[]) {

        for (int i = 0; i < 400; i++) {

            System.out.println(prefix + i);

        }

    }

}


查看完整回答
反对 回复 2019-04-17
?
叮当猫咪

TA贡献1776条经验 获得超12个赞

优化点应该是减少for循环中产生的对象


for (int i = 0; i < 400; i++) {

    list.add(prefix + i);

}


查看完整回答
反对 回复 2019-04-17
?
繁华开满天机

TA贡献1816条经验 获得超4个赞

ArrayList<String> list = new ArrayList<>(400);

        char[] chars = new char[]{'p','r','e','\0','\0','\0'};

        for (int i = 0; i < 10; i++) {

            chars[3] = (char) (i + 48);

            list.add(new String(chars, 0, 4));

        }

        for (int i = 10; i < 100; i++) {

            chars[4] = (char) ((i % 10) + 48);

            chars[3] = (char) ((i / 10) + 48);

            list.add(new String(chars, 0, 5));

        }

        for (int i = 100; i < 400; i++) {

            chars[5] = (char) ((i % 10) + 48);

            chars[4] = (char) (((i / 10) % 10) + 48);

            chars[3] = (char) ((i / 100) + 48);

            list.add(new String(chars, 0, 6));

        }

        System.out.println(list);

仅考虑性能的话 不管怎么变着花的用StringBuilder都不如亲自操作数组来的高效,不过需要手动转换数字

对于这道题来说 循环四百次 用一个长度为6的char数组即可满足要求

对于ArrayList动态扩容也是需要时间的,所以初始化时把长度写申请足了也会起一点作用。。


查看完整回答
反对 回复 2019-04-17
?
收到一只叮咚

TA贡献1821条经验 获得超4个赞

理论上以下通过以下两处更改可以优化,但我试了下指定初始化list容量,性能反倒降低。很是纳闷,还是请高手解答吧。


 import java.util.ArrayList;


    public class Test {

    

        public static void main(String args[]) {

            List<String> list = new ArrayList<String>(400);

    

            final String prefix = "pre";

    

            for (int i = 0; i < 400; i++) {

                String s = prefix + i;

                list.add(s);

            }

            System.out.println(list);

        }

    }


查看完整回答
反对 回复 2019-04-17
  • 6 回答
  • 0 关注
  • 431 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信