字符串的比较

时间:2011-10-02 11:19:30

标签: java swing list

  

可能重复:
  How do I compare strings in 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 个答案:

答案 0 :(得分:7)

您需要使用:

selectedVal.equals( val )

!= / ==仅检查参考。

答案 1 :(得分: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文字这样的匿名对象)是不可变的,也就是说,一旦创建它们就无法更改。更改字符串意味着每次都将其丢弃并创建一个新字符串。

因此表达式“foo”+“bar”不会将“bar”添加到“foo”,而是创建一个“foo”String对象,创建一个“bar”String对象,然后创建第三个String对象来存储连接“foo”和“bar”的结果,然后将“foo”和“bar”交给垃圾收集。如果您被迫键入新的String“foo”和新的String“bar”以及新的String结果,依此类推,您可能会考虑代码在对象创建方面的代价。字符串文字有点欺骗。

您可以查看StringBuffer和StringBuilder,以了解操作类似于String的对象的类,这些对象可以被修改而不是被抛弃,并且每次操作都会替换为新对象。但老实说,大多数人只是使用String文字,让垃圾收集器得到锻炼。

希望有所帮助。