您的位置:首页 > 编程语言 > Java开发

Java编程:List.remove()、equals() 方法解惑

2016-11-28 19:25 507 查看
下午写了一段代码,大致的处理的业务是这样的:

有一个 TreeNode 类型的 List,TreeNode 有一个 nodeId 属性, 如果 nodeId 字符串的第 index 索引位置的字符不等于1,则从 List 中删除该对象,代码演变如下:

代码一:

public static void filterMenu(List<TreeNode> allList, String userType){
for(TreeNode item : allList){
int index = Integer.valueOf(userType) - 1;
if(!"1".equals(item.getNodeId().charAt(index))){
allList.remove(item);
}
}
}


错误的原因:这种for-each写法会报出著名的并发修改异常:java.util.ConcurrentModificationException。

代码二:

public static void filterMenu(List<TreeNode> allList, String userType){
Iterator<TreeNode> iter = allList.iterator();
while(iter.hasNext()){
int index = Integer.valueOf(userType) - 1;
TreeNode item = iter.next();
if(!"1".equals(item.getNodeId().charAt(index))){
iter.remove();
}
}
}


错误的原因:将字符串与 char 进行equals比较,String(1)、char(1)进行equals比较返回 false。

代码三(正确代码):

public static void filterMenu(List<TreeNode> allList, String userType){
Iterator<TreeNode> iter = allList.iterator();
while(iter.hasNext()){
int index = Integer.valueOf(userType) - 1;
TreeNode item = iter.next();
if(!"1".equals(String.valueOf(item.getNodeId().charAt(index)))){
iter.remove();
}
}
}


分析:Iterator.remove()进行 List 数据删除。

代码四(正确代码):

public static void filterMenu(List<TreeNode> allList, String userType){
final CopyOnWriteArrayList<String> cowList = new CopyOnWriteArrayList<String>(allList);
for(TreeNode item : cowList ){
int index = Integer.valueOf(userType) - 1;
if(!"1".equals(String.valueOf(item.getNodeId().charAt(index)))){
allList.remove(item);
}
}
}


分析:使用了CopyOnWriteArrayList,避免产生java.util.ConcurrentModificationException异常。

equals 示例代码:

public static void main(String[] args) {
// TODO Auto-generated method stub
String strVal = "1";
Integer intVal = 1;
char charVal = 1;

System.out.println("字符串与 Integer 进行 equals 比较:" + strVal.equals(intVal));
System.out.println("字符串与 char 进行equals比较:" + strVal.equals(charVal));
System.out.println("字符串与 String 进行equals比较:" + strVal.equals("1"));
}


执行结果:

字符串与 Integer 进行 equals 比较:false
字符串与 char 进行equals比较:false
字符串与 String 进行equals比较:true
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息