方法结果未保存在内存中,这是如何工作的?

Method result not save in memory how does that work?

我正在构建一个计算器应用程序,其中 backspace/deleting 最后一个字符的代码为:

JButton btnBackspace = new JButton("\uF0E7");
    btnBackspace.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            String backspace = null;
            if (textField.getText().length() > 0) {
                StringBuilder str = new StringBuilder(textField.getText());
                backspace = str.deleteCharAt(textField.getText().length()-1).toString();
                textField.setText(backspace);
            }
        }
    });

上面的第 7 行代码很长,想把它们分成两条语句。

JButton btnBackspace = new JButton("\uF0E7");
    btnBackspace.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            String backspace = null;
            if (textField.getText().length() > 0) {
                StringBuilder str = new StringBuilder(textField.getText());
                backspace = str.deleteCharAt(textField.getText().length()-1);
                backspace = backspace.toString();
                textField.setText(backspace);
            }
        }
    });

上面的代码给了我一堆错误,但是当我尝试下一个代码时:

JButton btnBackspace = new JButton("\uF0E7");
    btnBackspace.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            String backspace = null;
            if (textField.getText().length() > 0) {
                StringBuilder str = new StringBuilder(textField.getText());
                str.deleteCharAt(textField.getText().length()-1);
                backspace = str.toString();
                
                textField.setText(backspace);
            }
        }
    });

以上代码有效。怎么可能删除一个字符的结果不需要保存到内存就成功转换成字符串?

deleteCharAt 是一种变异方法,尽管它也是 returns 一个 StringBuilder 对象。这可以用下面的代码很容易地证明

String text = "abcde";
StringBuilder builder1 = new StringBuilder(text);
StringBuilder builder2 = builder1.deleteCharAt(text.length() - 1);
  
System.out.println(builder1.toString() + " - " + builder2.toString());

输出

abcd - abcd

存储结果的逻辑在deleteCharAt()里面,所以deleteCharAt给你保存了内存中的变化,

如果你阅读 deleteCharAt() 的代码,你会看到 deleteCharAt 调用了另一个方法,即 super.deleteCharAt() 这个方法在 class AbstractStringBuilder 中,如果你阅读那里的代码,你会看到该方法调用一个名为 shift() 的私有方法,如果您查看 shift() 的代码,您会看到它调用此方法 System.arraycopy(),这是一个本地方法,其中包含存储结果存入内存