我是以错误的方式比较字符串吗?请告诉我如何正确比较? 谢谢。
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];
}
});
答案 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文字,让垃圾收集器得到锻炼。
希望有所帮助。