集合的遍历与List

集合的遍历是经常要做的操作,今天介绍几种集合的遍历方式。

Iterater

对 collection 进行迭代的迭代器。迭代器取代了 Java Collections Framework 中的 Enumeration,迭代器依赖于集合而存在。

boolean hasNext()
如果仍有元素可以迭代,则返回 true。
E next()
返回迭代的下一个元素。
注意:
抛出: NoSuchElementException - 没有元素可以迭代。
void remove()
返回迭代的当前元素。

迭代器原理

在获取迭代器的时候,会获取一个集合的副本,同时创建一个指针指向迭代器迭代集合的起始位置。

增强for循环

相比普通for循环的又一种遍历方式,适用于遍历数组和集合
格式:
for(元素数据类型 变量 : 数组或者集合) {
使用变量即可,该变量就是元素
}
好处:简化遍历
缺点:无法获取数组或者集合的索引,可能出现并发修改异常

并发修改异常

产生原因:在使用迭代器遍历集合元素的同时对集合元素进行了操作时抛出此异常
解决办法:
使用普通for循环遍历
使用List特有的迭代器遍历

public class CollectionDemo07 {
	public static void main(String[] args) {
		Collection c = new ArrayList();
		c.add("张飞");
		c.add("刘备");
		c.add("关羽");
		
		/*Iterator it = c.iterator();
		
		while (it.hasNext()) {
			Object obj = it.next();
			String s = (String)obj;
			
			if (s.contains("关羽")) {
				c.add("诸葛亮");
			}
		}*/
		
//		for (Object object : c) {
//			String s = (String)object;
//			
//			if (s.contains("关羽")) {
//				c.add("诸葛亮");
//			}
//		}
		
		Object[] array = c.toArray();
		for (int i = 0; i < array.length; i++) {
			String s = (String)array[i];
//			
			if (s.contains("关羽")) {
				c.add("诸葛亮");
			}
		}
		
		System.out.println(Arrays.toString(array));
		System.out.println(c);
	}
}


ListIterator

ListIterator接口是List特有的迭代器,允许程序员按任一方向遍历列表、迭代期间修改列表,并获得迭代器在列表中的当前位置。
常用方法
boolean hasNext()
以正向遍历列表时,如果列表迭代器有多个元素,则返回 true(换句话说,如果next 返回一个元素而不是抛出异常,则返回 true)。
E next()
返回列表中的下一个元素。
boolean hasPrevious()
如果以逆向遍历列表,列表迭代器有多个元素,则返回 true。
E previous()
返回列表中的前一个元素。

List

特点:
1.集合是有序的(存储有序)
2.有索引,方便查找和修改
3.List集合可重复

	public boolean add(E e) {
	        ensureCapacityInternal(size + 1);  // Increments modCount!!
	        elementData[size++] = e;
	        return true;
		}

结论:无论添加重复还是不重复的元素,结果都是返回添加成功,所以List集合是可重复的
4.允许存储null值
所有方法:
1.添加功能
boolean add(Object obj)
boolean addAll(Collection c)
void add(int index, E element)
boolean addAll(int index, Collection<? extends E> c)
2.删除功能
void clear()
boolean remove(Object o)
boolean removeAll(Collection<?> c)

Object remove(int index)
boolean remove(Object o)
3.修改功能
Object set(int index, E element)
4.遍历功能
Object[] toArray()
Iterator iterator()
T[] toArray(T[] a)

ListIterator listIterator()
ListIterator listIterator(int index)
5.判断功能
boolean contains(Object o)
boolean containsAll(Collection<?> c)
boolean isEmpty()
6.其他功能
boolean retainAll(Collection<?> c)
7.获取集合长度的功能
int size()
8.获取功能
int indexOf(Object o)
Object get(int index)
int lastIndexOf(Object o)
List subList(int fromIndex, int toIndex)

public class ListDemo01 {
	public static void main(String[] args) {
		List list = new ArrayList();
		list.add("老王");
		list.add("老李");
		list.add("老张");
		list.add("老李");
//		list.add(null);
//		list.add(null);
		
//		for (Object object : list) {
//			System.out.println(object);
//		}
		System.out.println(list);
		System.out.println("----------void add(int index, E element) ---------------");
		list.add(2, "隔壁老王");
		System.out.println(list);
		
		/*
		 * Object remove(int index) 
		 *  boolean remove(Object o) 
		 */
		System.out.println("--------------remove-----------------");
		System.out.println("boolean remove(Object o):" + list.remove("老李"));
		System.out.println(list); // [老王, 隔壁老王, 老张, 老李]
		Object obj = list.remove(3);
		System.out.println(obj); // 老李
		System.out.println(list); // [老王, 隔壁老王, 老张]
		
		System.out.println("------------Object set(int index, E element) -------------");
		Object obj2 = list.set(2, "隔壁老张");
		System.out.println(obj2);
		System.out.println(list);
		
		System.out.println("-----------------获取功能-------------------");
		/*
		 * int indexOf(Object o) 
		 *  Object get(int index) 
		 *  int lastIndexOf(Object o)
		 *  List subList(int fromIndex, int toIndex) 
		 */
		// [老王, 隔壁老王, 隔壁老张]
		list.add("老王");
		System.out.println(list); // [老王, 隔壁老王, 隔壁老张, 老王]
		int index = list.indexOf("1234老王");
		System.out.println(index);
		Object obj3 = list.get(0);
		System.out.println(obj3);

		int index2 = list.lastIndexOf("老王");
		System.out.println(index2);
		
		List subList = list.subList(1, 3);
		System.out.println(list);
		System.out.println(subList);
		
	}
}

猜你喜欢

转载自blog.csdn.net/yjn1995/article/details/89677454
今日推荐