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

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

2017-09-20 16:17 351 查看
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(
4000
){
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");	// 此处就不会报错,因为下面没有迭代器的使用了,即迭代器使用结束了;
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: