【问题标题】:Returning StringBuilder as a String JAVA将 StringBuilder 作为字符串返回 JAVA
【发布时间】:2013-10-01 14:01:44
【问题描述】:

我可能会走很长一段路,希望我可以在没有代码的情况下解释这一点,因为现在代码到处都是。

我想要的是一个字符串

static String locationOneStr = new String ("res/.png");
static StringBuilder locationOneStrBuilder = new StringBuilder(locationOneStr);

其中包含我稍后要调用的 URL 的基本形式。

稍后出现的代码找到位于位置 0 或“locationOne”的数字,然后开关选择要使用的代码:如果是 0,则在 .png 之前插入 0;如果是 1,则插入 1,依此类推。

public static StringBuilder locationOneNumber(StringBuilder forCharConv,  StringBuilder locationOneStrBuilder) {
    char localChar = forCharConv.charAt(0);
    switch (localChar) {
        case '0':
            BpmCalcFrame.locationOneStrBuilder.insert(3,"0");
            System.out.println("Zero");
            break;

        /*
        *
        * Other Cases Omitted 
        */

        default:
            System.out.println("There is no valid input!");
            break;
        }
    return;

}

我遇到的问题是开关必须返回一些东西。但是,我用作测试环境的 jframe 需要一个字符串作为 URL。

JLabel locationOne = new JLabel("Image 1");
    locationOne.setBackground(Color.WHITE);
    locationOne.setIcon(new ImageIcon(ArrayComparison.locationOneNumber(forCharConv, locationOneStrBuilder)));
    locationOne.setBounds(172, 45, 36, 68);
    contentPane.add(locationOne);

我正在使用 StringBuilder,因为字符串会占用内存,但如果我必须将 StringBuilder 转换为 String,那么它就失去了使用 StringBuilder 的意义

我是不是走错了路,还是真的必须转换回字符串?这意味着我将在整个程序生命周期内平均每秒创建 2 个新对象。

有没有办法在不创建新对象的情况下将 StringBuilder 的实例作为字符串?

【问题讨论】:

  • 每秒 2 个新对象?如果您每秒创建 1E7 或 1E9(或更多)个对象,您可能会考虑优化,但 2?
  • 如果它困扰你,我只是测量了在我的机器上调用 StringBuilder.toString 的时间大约为 14 nano-秒!
  • 我不想告诉你,但是更新屏幕的成本是创建 String 对象的 1000 倍。我建议您分析您的应用程序并处理使您的应用程序变慢的事情,而不是担心每一行代码。
  • @StackOverflowException 看起来您已经过期了升级 :)
  • 如果你想避免创建 String 对象,我不会复制字符串文字,它只会浪费代码和时间。

标签: java string object stringbuilder


【解决方案1】:

担心一秒钟有两个新对象是过早的优化。

您的 JVM 可能会花费不到十分之一毫秒的时间来执行此操作。

先编写清晰明了的代码,然后再优化性能。

【讨论】:

  • 好的,我对 java 还很陌生,该应用程序涉及您单击一个按钮,每次单击它都会生成 4 或 5 个字符串以图形方式表示数字。每个字符串都将被分配内存,因此这意味着我的应用程序将一直在创建垃圾。这不是问题,我也没有遇到错误,我只是想知道是否有办法解决所有垃圾问题。
  • @gcoulby:垃圾比你想象的要便宜得多。 (四到五个中等大小的字符串产生的垃圾量,乘以任何人可以点击鼠标的最快速度,是很小。
  • @LouisWasserman 这正是我的问题。我只是在学习 Java,在这样做的过程中,我总是听到有人说你不能手动管理内存,创建新对象会创建新的内存分配等等。所以我很担心。但是,我认为对于我的应用程序的大小我没有什么可担心的。我的对象是根据用户输入创建的,而我预期的问题是,如果这些对象是在计算机控制的循环中创建的,其中许多可能会及时导致问题。垃圾很难理解。 eclipse有没有监控垃圾的工具?
【解决方案2】:

您应该在完成字符串构建后将StringBuilder 转换为String。这正是它应该被使用的方式。

【讨论】:

    【解决方案3】:

    怎么样:

    static String locationOneStrTemplate = "res{number}.png";
    
    //...
    
    public static StringBuilder locationOneNumber(StringBuilder forCharConv,  String locationOneStrTemplate) {
        //...
        String actualURL = locationOneStrTemplate.replace("{number}", forCharConv);
        //...
    }
    

    【讨论】:

    • 你为什么要用new String(复制一个字符串文字?
    • 只是从作者的代码中复制粘贴-尽管如此,你是对的,我会编辑。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-15
    相关资源
    最近更新 更多