字符串比较

3

可能是重复问题:
如何在Java中比较字符串?

我是否以错误的方式比较字符串?请展示正确的比较方法。 谢谢。

private void deleteButtonActionPerformed(java.awt.event.ActionEvent evt) {                                             
        String selectedVal = (String) jList1.getSelectedValue();
        AbstractListModel model = (AbstractListModel) jList1.getModel();
        int numberElements = model.getSize();
        final String[] allElements = new String[numberElements + 1];
        for (int i = 0; i < numberElements - 1; i++) {
            String val = (String) model.getElementAt(i);
            ***if (selectedVal != val)*** {
                allElements[i] = (String) model.getElementAt(i);
            }
        }
            controller.deleteButtonClicked(selectedVal);

            jList1.setModel(new javax.swing.AbstractListModel() {

            String[] strings = allElements;

            public int getSize() {
                return strings.length;
            }

            public Object getElementAt(int i) {
                return strings[i];
            }
        });
2个回答

7

您需要使用:

selectedVal.equals( val )

!= / == 只检查引用。


1

请记住,字符串构造"foo"是一种语法便利,但实际上等价于:

char[] foo = {'f', 'o', 'o'}
new String(foo)

第一次输入“foo”时,我会得到一个新的(匿名)String类对象,第二次输入“foo”时,我会得到一个新的(匿名)String类对象。只要你记住这一点,你就会记住user968951所解释的,也就是“==”只会告诉你“foo”和“foo”是两个不同的对象。String类重载了“equals”,使其在构造两个不同的String对象的字符相同时返回true。
“foo” == “foo”返回false,因为这些是两个不同的对象(它们是字符串对“==”没有影响)
“foo”.equals(“foo”)返回true,因为这些是两个不同的String对象,但具有相同的字符序列
还要记住,String类的对象(包括像String字面量这样的匿名对象)是不可变的,也就是说,一旦创建就无法更改。每次更改String都意味着丢弃它并创建一个新的。
所以表达式“foo”+“bar”不是把“bar”添加到“foo”,而是创建一个“foo”字符串对象,创建一个“bar”字符串对象,然后创建一个第三个字符串对象,存储连接“foo”和“bar”的结果,最后将“foo”和“bar”交给垃圾收集器。如果你被迫输入新的String “foo”和new String “bar”和new String result等等,那么你可能会考虑一下你的代码在对象创建方面的开销有多大。字符串字面值有点具有欺骗性。
您可以查看StringBuffer和StringBuilder类,这些类操作类似于String的对象,可以进行更改,而不是被丢弃并用每个操作替换为新对象。但是,老实说,大多数人只使用字符串字面值,并让垃圾收集器运转起来。
希望能对您有所帮助。

这是一个学习的机会。 - Steve J

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接