List集合(接口)
特点:1 是一个有序的集合(存储元素和取出元素是一致的!----先进先出)
2 该集合中的元素是可以重复的
既然是接口:通多接口多态创建对象
那么今天就在了解一下List接口
实例1 遍历集合
package org.westos_01;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
/**
* 用List集合存储字符串类型的元素并遍历---迭代器遍历
* List集合是一个有序的集合(存储元素和取出元素是一致的!)
* 该集合中的元素是可以重复的,List也有iteration()方法
* 说明:public interface List extends Collection
*
* @author Orange
*/
public class ListDemo2 {
public static void main(String[] args) {
//创建List集合对象
List list = new ArrayList() ;
//给集合中添加元素
list.add("hello") ;
list.add("world") ;
list.add("java") ;
list.add("java") ;
list.add("javaweb") ;
list.add("world") ;
//获取迭代器
Iterator it = list.iterator() ;
while(it.hasNext()){
String s = (String)it.next() ;
System.out.println(s);
}
}
}
List集合的特有成员方法
添加功能
void add(int index, Object element)
功能:在列表的指定位置(索引)插入指定元素
删除功能
Object remove(int index)
功能:移除列表中指定位置的元素,返回被删除的元素
获取功能
ListIterator listIterator()
功能:列表迭代器---List集合的专有遍历方式
Object get(int index)
功能:返回列表中指定位置的元素
替换功能
set(int index,Object element)
功能:用指定元素替换列表中指定位置的元素
实例2
package org.westos_02;
import java.util.ArrayList;
import java.util.List;
public class ListDemo {
public static void main(String[] args) {
//创建List集合对象
List list = new ArrayList() ;
//添加一些元素
//思考:如果将"1"变成1报错吗?如果不报错说明原因(jdk5后的自动拆装箱)
list.add("1") ;
list.add("3") ;
list.add("4") ;
/* 1---添加
* void add(int index, Object element)---可选操作
* 功能:在列表的指定位置插入指定元素,在指定位置前面插入一个新的元素
* 返回值类型:void
* */
list.add(1, "2") ;
System.out.println(list);
/* 2---删除
* E(Object) remove(int index)---可选操作
* 功能:移除列表中指定位置的元素
* 返回值类型:Object--返回被删除的元素(而不是删除元素后的集合)
* */
System.out.println("remove对应索引的元素:"+list.remove(2));
System.out.println("剩余的元素:"+list);
//(1)出错的原因:IndexOutOfBoundsException:角标越界了(没有索引为3的元素)
//System.out.println("remove:"+list.remove(3));(1)
/* 3---用指定元素替换列表中指定位置(索引)的元素
* E(泛型) set(int index,Object element)---可选操作
* 功能:用指定元素替换列表中指定位置的元素
* 参数类型:
* index - 要替换的元素的索引
* element - 要在指定位置存储的元素
* 返回值类型:E(泛型)以前在指定位置的元素
* */
/* 4---获取功能
* E get(int index)--
* 功能:返回列表中指定位置的元素
* 参数:集合的索引
* 返回值类型:E(泛型)--列表中指定位置的元素
* */
System.out.println("set返回的是以前在指定位置的元素 :"+list.set(1, "5")) ;
System.out.println("用set替换后用get得到新位置的元素:"+list.get(1)) ;//思考:如果集合的索引不是基本类型的封装类型,返回的是?(其实主要看集合所存取的引用类型)
System.out.println("list"+list);
}
}
编译结果:
实例3
package 测试;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
/**
* List集合的遍历方式 1)toArray() 2)Collection集合中的Iterator iterator();
* 说明1:创建集合-----添加元素---size()获取集合元素个数----对集合元素进行向下转型---得到每个元素的内容---得到所需
* 说明2:创建集合-----添加元素---hasNext()判断集合是否还有元素----next()得到集合元素的引用类型,进行向下转型---得到每个元素的内容(所需)
*
* @author Orange
*/
public class xianong {
public static void main(String[] args) {
// 创建集合对象
List list = new ArrayList();
// 从添加元素看集合存储的类型元素,为下面的向下转型做准备(重要!!!!!!!)
list.add("hello");
list.add("java");
list.add("hello");
list.add("javaweb");
list.add("hello");
list.add("python");
// 使用普通for的方法去遍历list集合,使用size()和get()相结合
for (int x = 0; x < list.size(); x++) {
// 等价------Object object = list.get(x)=new String("..") ;
// 需求:获取字符串内容同时,获取字符串长度
String s = (String) list.get(x);
System.out.println(s + "----" + s.length());
}
System.out.println("-------------------------");
// 获取迭代器对象
Iterator it = list.iterator();
while (it.hasNext()) {
String s = (String) it.next();
System.out.println(s + "----" + s.length());
}
}
}
编译结果
实例4
// listIterator方法
package org.westos_02;
import java.util.ArrayList;
import java.util.List;
import java.util.ListIterator;
/**
* List集合的列表迭代器(特有的listIterator方法)
* ListIterator listIterator()
* 列表迭代器接口中有以下几个方法:
* 正向遍历: boolean hasNext()
* 功能:判断是否有下一个可以迭代的元素()
* Object next()
* 功能:如果有可以遍历的元素,就获取这个元素
* 逆向遍历: boolean hasPrevious()
* 功能:判断是否有上一个可以迭代的元素
* Object previous()
* 功能:如果有上一个可以迭代的元素,就获取上一个元素
* 注意:要使用逆向遍历,前提必须有正向遍历存在,直接使用逆向遍历,没有意义!
* @author Orange
*/
public class ListDemo3 {
public static void main(String[] args) {
//创建集合对象
List list = new ArrayList() ;
//给集合中添加元素
list.add("我") ;
list.add("爱") ;
list.add("你") ;
//获取列表迭代器(按适当顺序)
ListIterator it = list.listIterator() ;
while(it.hasNext()){
String s = (String)it.next();
System.out.print(s+" ");
}
System.out.println();
System.out.println("-----------------------");
while(it.hasPrevious()){
String s = (String)it.previous() ;
System.out.print(s+" ");
}
}
}
编译结果
练习1
package org.westos_02;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.ListIterator;
/**
*问题?
* 我有一个集合,请问如果我想判断里面有没有"world"这个元素,
* 如果有,我就添加一个"javaee"元素,请写代码实现
*解释:并发(同一个时间点),并行(同一个时间段)
*java.util.ConcurrentModificationException
*说明:并发修改异常----当方法检测到对象的并发修改,但不允许这种修改时,抛出此异常。
*原因:当前我们用迭代器去遍历元素,使用集合添加的元素,对于迭代器是不知道集合添加了这个元素(加锁),所以会发生这个异常
*描述:使用迭代器去遍历集合,是不能直接集合添加元素!
*解决方案(一致):
* 1)使用迭代器遍历集合,使用迭代器添加元素----定义一个功能
* 2)使用集合遍历,使用集合添加元素---------定义一个功能
* @author Orange
*/
public class ListTest {
public static void main(String[] args) {
//创建List集合对象
List list = new ArrayList() ;
//给集合中添加元素
list.add("hello") ;
list.add("world") ;
list.add("java") ;
//方式1---集合
collectionTraversal(list);
//方式2---迭代器(对结果说明:当发现"world"就在其后面添加"javaee")
listIterationTraversal(list);
/*
错误的方法:
1--获取迭代器
Iterator it = list.iterator() ;
2--遍历
while(it.hasNext()){ //使用迭代器遍历
String s = (String)it.next() ;
//判断
if("world".equals(s)){
//添加一个元素
list.add("javaee") ;//使用集合添加元素
}
}
*/
}
public static void listIterationTraversal(List list){
//方案1:使用迭代器遍历集合,使用迭代器添加元素(Iteration没有add()方法,无法添加元素)
//Iterator it = list.iterator() ;
//报错解释:该迭代器中没有添加功能,而List集合中的专有遍历方式----列表迭代器有添加功能:add(Object obj)
//将指定的元素插入到列表中(指定元素后面插入)
ListIterator it = list.listIterator() ;
while(it.hasNext()){
String s = (String) it.next() ;
if("world".equals(s)){
//使用迭代器添加
it.add("javaee") ;
}
}
System.out.println("list:"+list);
}
public static void collectionTraversal(List list){
//集合遍历,集合添加元素
for(int x = 0 ; x <list.size() ; x ++){
String s = (String) list.get(x) ;
//判断是否有该元素----重写了Object类的equals方法---比较指定的对象与列表是否相等
if("world".equals(s)){
//集合添加
list.add("javaee") ;//在末尾添加元素
}
}
//输出集合
System.out.println("list:"+list);
}
}
未完待续...
相关链接:1---点击打开链接,2---点击打开链接,3---点击打开链接,4---点击打开链接(知乎:细节),5---点击打开链接,6---点击打开链接(图),7---点击打开链接(可变长度的原理)