我是靠谱客的博主 知性蛋挞,最近开发中收集的这篇文章主要介绍for循环里面不要进行remove操作,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

7. 【强制】不要在 foreach 循环里进行元素的 remove / add 操作。 remove 元素请使用 Iterator
方式,如果并发操作,需要对 Iterator 对象加锁。
正例:
Iterator<String> iterator = list.iterator();
while (iterator.hasNext()) {
String item = iterator.next();
if (删除元素的条件) {
iterator.remove();
}
}
反例:
List<String> list = new ArrayList<String>();
list.add("1");
list.add("2");
for (String item : list) {
if ("1".equals(item)) {
list.remove(item);
}
}
说明:以上代码的执行结果肯定会出乎大家的意料,那么试一下把“1”换成“2”,会是同样的
结果吗?

--摘自阿里巴巴开发手册

package com.kunaly.domain;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

//不要在 foreach 循环里进行元素的 remove / add 操作

public class Test {

	public static void main(String[] args) {
		// TODO Auto-generated method stub

		List<String> list = new ArrayList<String>();
		list.add("1");
		list.add("2");
		/*for (String item : list) {
			if ("2".equals(item)) {
				list.remove(item);
			}
		}*/
		
		Iterator<String> iterator = list.iterator();
		while(iterator.hasNext()){
			String item = iterator.next();
			if("2".equals(item)){
				iterator.remove();
			}
		}
		
		System.out.println(list);

	}

}


1,不要在 foreach 循环里进行元素的 remove/add 操作

remove 元素请使用 Iterator方式,如果并发操作,需要对 Iterator 对象加锁。

正例:

1
2
3
4
5
Iterator<String> iterator = list.iterator(); <br> while  (iterator.hasNext()) {
String item = iterator.next(); <br>    if  (删除元素的条件) {
        iterator.remove();
    }
}

反例:

1
2
3
4
5
6
7
8
9
public  static  void  main(String args[]){
         List<String> list =  new  ArrayList<String>();
         list.add( "1" );
         list.add( "1" );
         for  (String item : list) {
             if  ( "1" .equals(item)) { list.remove(item);
         } }
         System.out.println(list.toString());
     }<br> //output: [1]

for循环里remove元素后,list的下标会减小,导致遍历不完全。

2,asList 的返回对象是一个 Arrays 内部类,并没有实现集合的修改方法。Arrays.asList 体现的是适配器模式,只是转换接口,后台的数据仍是数组。

1
2
3
4
5
6
7
String[] str =  new  String[] {  "you" "wu"  };
List list = Arrays.asList(str);
str[ 0 ] =  "yy" ;
System.out.println(list.toString());
//output: [yy, wu]
list.add( "yangguanbao" );
//运行时异常

3,集合类型转换为数组, 要防止数组下标越界的问题。用以下方式转化

1
2
3
4
List<String> list =  new  ArrayList<String>( 2 );
list.add( "guan" );
list.add( "bao" );
String[] array =  new  String[list.size()];  

4, try{} catch{}语句块中:

 

finally的代码块一定会被执行,即使finally代码块之前函数有return语句,finally代码块也会执行

除以下一种特例: System.exit(0);这条语句后的finally将不再执行

finally的作用是无论是否有异常发生,都要对资源进行释放;资源释放在finally里面

5,同一个类的每个对象有不同成员变量存储空间

同一个类的每个对象共享方法

 

6,java比较对象时,“==”比较的是对象在内存堆内的地址

String重写了Object的equals方法,因而两个相同的字符串,equal返回是true

public boolean equals(Object anObject)

Compares this string to the specified object. 

The result is true if and only if the argument is not null and is a String object 

that represents the same sequence of characters as this object.

 

5,instanceof 判断前面那个类是否属于后面的那个类保护后面列的子类

 

6,LIst,Set,Map集合不能添加基本数据类型(放基本类型能自动装箱成引用类型),必须装object

 

7,  enctype="multipart/form-data"

 form表单在提交图片的文件时要设定enctype类型

不然会报

org.springframework.web.multipart.MultipartException: The current request is not a multipart request

at org.springframework.web.method.annotation.RequestParamMethodArgumentResolver.assertIsMulti


更多详情参照大牛博客:点击打开链接

最后

以上就是知性蛋挞为你收集整理的for循环里面不要进行remove操作的全部内容,希望文章能够帮你解决for循环里面不要进行remove操作所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(30)

评论列表共有 0 条评论

立即
投稿
返回
顶部