记一次操作List的异常、迭代器的使用和Array.toArray方法使用异常(强转报错)

今天项目需要操作一个字符串数组,分别分三种情况,A情况需要字符串数组为完整的 如 { "aa" , "bb" , "cc" },B情况需要删掉字符串数组里的 "aa" ,C情况需要删除"aa"和"bb"。

public class testT {
	public static void main(String[] args) {
		String[] a = { "aa", "bb", "cc"};
		List<String> asList = Arrays.asList(a);  //先把字符串数组转为List
		for (int i = 0, len = list.size(); i < len; i++) { //然后遍历List,删除对应下标
                if (list.get(i).equals("aa")) {
                    list.remove(i);
                    len--;
                    i--;
                }
            }
	}
}

但是代码在list.remove这行报错了,java.lang.UnsupportedOperationException ,我对List做list.add操作也不行。

原因:查了一些资料,发现调用Arrays.asList()出来的List是Arrays的内部类ArrayList,而不是java.util.ArrayList。 

Arrays的内部类ArrayList和java.util.ArrayList都是继承AbstractList,remove、add等方法AbstractList中是默认throw UnsupportedOperationException而且不作任何操作。java.util.ArrayList重写了这些方法而Arrays的内部类ArrayList没有重写,所以会抛出异常。

解决后:对list遍历remove删除时会将list的数据都往前一位,所以下标索引在remove之后要减一,这种遍历个人认为有点复杂臃肿,所以改用迭代器来删除。

public class testT {
	public static void main(String[] args) {
		String[] a = { "aa", "bb", "cc"};
		List<String> asList = Arrays.asList(a);
		List<String> list = new ArrayList(asList); //这里要再new一个真正的java.util.ArrayList
		Iterator<String> iterator = list.iterator();

		while(iterator.hasNext()) {
			String name = iterator.next();
			if(iterator.next().equals("aa") || iterator.next().equals("bb")) {
				iterator.remove();
			}
		}
	}
}

这里 iterator.next().equals("aa") 这行又报错了,这次是迭代器的错误,因为本人很少用迭代器,有点生疏,查了一下相关迭代器的使用,发现应该是调用了两次iterator.next()的错误,这样会造成迭代器的指针向下移动了两次,指向的对象就不是我们要删除的对象了,所以也会抛出NoSuchElement的异常,所以要判断只能调用一次next方法。

解决后:

public class testT {
	public static void main(String[] args) {
		String[] a = { "aa", "bb", "cc"};
		List<String> asList = Arrays.asList(a);
		List<String> list = new ArrayList(asList);
		Iterator<String> iterator = list.iterator();

		while(iterator.hasNext()) {
			String name = iterator.next();
			if( name.equals("aa") || name.equals("bb") ) {
				iterator.remove();
			}
		}
	}
}

这样就没有问题了,完美删除需要删除String数组里的某个元素。

但是问题又来了,操作完List我需要继续把它转换回原先的字符串数组

String[] titleAry = (String[]) list.toArray();

这里我进行强转成我要的字符串数组,但是报错了,后面发现toArry方法返回的是Object [],查了一些资料,发现要返回一个特定的类型,需要toArray(T[] a)这个方法,并引入数组长度。

String[] titleAry = (String[]) list.toArray(new String[list.size()]);

这样即可正确转换回字符串数组。

猜你喜欢

转载自blog.csdn.net/qq_41737716/article/details/80454154