Java学习笔记之集合(二):List集合的常用方法

package com.collection.list;
 
import java.util.ArrayList;
import java.util.List;
import java.util.ListIterator;
 
import org.junit.Test;
 
/*
集合的体系:
	--------| Collection: 单列集合的根接口
	-----------| List:实现了List接口的集合类,具备的特点:有序,可重复;
	-----------| Set:实现了Set接口的集合类,具备的特点:无序,不可重复;
 
	有序:集合的有序不是指自然顺序,而是指添加进去的顺序与元素出来的顺序是一致的;
 
 	List接口中特有方法:
	添加:
		add(int index, E element):把元素添加到集合的指定位置;
		addAll(int index, Collection<? extends E> c):把另一个集合中的所有元素插入到当前集合指定的位置上; 
	获取:
		get(int index):根据索引值查找集合中的元素; 
		indexOf(Object o): 查找指定元素第一次在集合中出现的索引值;
		lastIndexOf(Object o):查找指定元素最后一次出现在集合中的索引值; 
		subList(int fromIndex, int toIndex):根据开始和结束的索引值,截取集合中的元素; 
	修改:
		set(int index, E element):使用指定的元素替换指定索引值位置的元素;
		
	List接口中特有的方法具备的特点:操作的方法都存在索引值;	
		
	迭代:
		listIterator():返回一个ListIterator迭代器;	
		
	ListIterator特有的方法:
		hasPrevious():判断是否存在上一个元素;
		previous():获取上一个元素;当前指针先向上移动一个单位,然后再取出当前指向的元素;(先移再取)
			(next():先取出当前指针指向的元素,然后指针再向下移动一个单位;(先取再移))
		add(E e):把指定元素插入到当前指针指向的位置上;
		set(E e):用指定元素替代迭代器最后一次返回的元素;	
		
	使用迭代器注意事项:
		在迭代器迭代元素的过程中,不允许使用集合的对象改变集合中元素的个数;如果想添加或者删除,只能通过迭代器的
		方法来实现;如果使用集合对象改变集合中的元素个数,就会出现异常ConcurrentModificationException;
		
		迭代元素的过程中:是指迭代器被创建开始,到迭代器使用结束的时间内;
 */
 
public class Demo2 {
 
	// 添加方法
	@SuppressWarnings({ "rawtypes", "unchecked" })
	@Test
	public void test1(){
		List list = new ArrayList();
		list.add("张三");			// 把元素添加到集合的末尾处;
		list.add("李四");
		list.add("王五");
		list.add("赵六");
		list.add("赵六"); 		// 元素可重复;
		list.add("张三");
		
		list.add(1, "张果老");	// 把元素添加到集合中指定索引值的位置上,索引值从0开始;		
		System.out.println("集合中的元素:" + list); // 输出顺序和添加顺序一致,并且元素可重复;
		
		System.out.println("-----------------");
		
		List list2 = new ArrayList();
		list2.add("何仙姑");
		list2.add("吕洞宾");
		
//		list.addAll(list2); 	// 将list2集合中的所有元素添加到list集合的末尾处;
		list.addAll(4, list2);	// 将list2集合中的所有元素添加到list集合中指定索引值的位置; 
		System.out.println("集合中的元素:" + list);
	}
	
	// 获取方法
	@SuppressWarnings({ "rawtypes", "unchecked" })
	@Test
	public void test2(){
		List list = new ArrayList();
		list.add("张三");
		list.add("李四");
		list.add("王五");
		list.add("张三");
		System.out.println("获取集合中索引值为2的元素:" + list.get(2)); // 索引从0开始
		
		// 使用get()方法遍历集合中的元素;
		for (int i = 0; i < list.size(); i++) {
			System.out.println(list.get(i));
		}
		
		System.out.println("---------------");
		
		// 查找指定元素在集合中第一次出现的索引值;如果元素不存在,则返回-1;
		System.out.println("查找指定元素在集合中第一次出现的索引值:" + list.indexOf("张三"));// 0
		System.out.println("查找指定元素在集合中最后一次出现的索引值:" + list.lastIndexOf("张三"));// 3
 
		System.out.println("---------------");
		
		// 根据开始和结束的索引值,截取集合中的元素;
		// 注意:截取的元素包括开始索引值的元素,不包括结束索引值的元素;(包头不包尾)
		List subList = list.subList(1, 3);
		System.out.println("截取集合中的元素:" + subList);
	}
	
	// 修改方法
	@SuppressWarnings({ "rawtypes", "unchecked" })
	@Test
	public void test3(){
		List list = new ArrayList();
		list.add("张三");
		list.add("李四");
		list.add("王五");
		System.out.println("集合中的元素:" + list);
		
		// 使用指定的元素修改指定索引值位置的元素;
		list.set(1, "李世民");
		System.out.println("修改之后集合中的元素:" + list);		
	}
 
	// 迭代方法
	@SuppressWarnings({ "rawtypes", "unchecked" })
	@Test
	public void test4(){
		List list = new ArrayList();
		list.add("张三");
		list.add("李四");
		list.add("王五");
		
		ListIterator it = list.listIterator();
		System.out.println("有上一个元素吗?" + it.hasPrevious()); // false
//		System.out.println("获取上一个元素:" + it.previous()); // java.util.NoSuchElementException
		
		System.out.println("---------------");
		
//		while (it.hasNext()){
//			it.next();
//			System.out.println("元素:" + it.previous()); // 无限死循环,取出的元素是"张三";
//		}
 
		System.out.println("---------------");
		
		while (it.hasNext()){
			it.next(); 	// 循环结束指针指向最后一个元素的后面;
		}
		
		while (it.hasPrevious()){
			System.out.println("元素:" + it.previous()); // 倒着取出所有元素;
		}
 
		System.out.println("---------------");
		
		ListIterator it2 = list.listIterator();
		it2.add("冯二"); 	// 将元素插入到集合的最前面;
		System.out.println("集合中的元素:" + list);
		
		ListIterator it3 = list.listIterator();
		it3.next();
		it3.next();
		it3.add("陈一");	// 由于前面指针下移了两个位置,所以此处元素将插入到集合的第三位置上;
		System.out.println("集合中的元素:" + list);
 
		System.out.println("---------------");
		
		ListIterator it4 = list.listIterator();
//		it4.set("老铁");	// 由于此处迭代器还没有返回元素,所以不可以替代元素,会出现异常;
		it4.next();
		it4.next();		// 由于迭代器下移了两次,所以此处迭代器返回的是第二个元素;
		it4.set("老铁"); 	// 那么此处替换的就是迭代器返回的第二个元素;
		System.out.println("集合中的元素:" + list);
	}
	
	// 使用迭代器的注意事项:
	@SuppressWarnings({ "rawtypes", "unchecked" })
	@Test
	public void test5(){
		List list = new ArrayList();
		list.add("张三");
		list.add("李四");
		list.add("王五");
		
		ListIterator it = list.listIterator();
		while (it.hasNext()){
			System.out.println(it.next());
			
			/*
			此处虽然能够将元素添加到集合中,但是遍历的时候却不能遍历出来,是为什么?
			因为从add()方法的源码可以看出:
			public void add(E e) {
	            checkForComodification();	
	            try {
	                int i = cursor;
	                ArrayList.this.add(i, e);
	                cursor = i + 1;
	                lastRet = -1;
	                expectedModCount = modCount;
	            } catch (IndexOutOfBoundsException ex) {
	                throw new ConcurrentModificationException();
	            }
        	}
        	当调用迭代器的add()方法时,指针(cursor)会往下移动一个单位,所以遍历的时候会跳过新添加的元素;
			 */
			it.add("田七"); 
			
			// 此处添加元素会出现异常ConcurrentModificationException;
//			list.add("赵六");
		}
		
		System.out.println("集合中的元素:" + list);
		
		System.out.println("-------------");
		
		// 迭代器迭代元素的过程中:
		ListIterator it2 = list.listIterator();
//		list.add("aa"); // 此处同样会报错,因为下面迭代器继续在使用;
		it2.next();
		list.add("bb");	// 此处就不会报错,因为下面没有迭代器的使用了,即迭代器使用结束了;
	}
	
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值