List集合概述和特点

List集合概述

  • 有序集合。用户可以精确控制列表中的每一个元素的插入位置。用户可以通过整数索引访问元素,并搜索列表中的元素
  • 与Set集合不同,列表通常允许重复的元素
    List集合特点
  • 有序:存储和取出的元素顺序一致
  • 可重复:存储的元素可以重复
package List;

import java.util.List;
import java.util.ArrayList;
import java.util.Iterator;

public class ListDemo1 {
	public static void main(String[] args) {
		//创建一个集合对象
		List<String>list =new ArrayList<String>();
		
		//添加元素
		list.add("hello");
		list.add("world");
		list.add("java");
		list.add("world");//可重复的
		//输出集合对象
	//	System.out.println(list);
		//迭代器的方法调用
		Iterator<String> it = list.iterator();
		while(it.hasNext()) {
			String s = it.next();
			System.out.println(s);
		}
		
		
	}
}

List集合特有的方法

List集合特有的方法:
void add(int index, E element),在此集合中指定位置插入指定的元素
E remove(int index),删除指定索引处的元素,返回被修改的元素
E set(int index, E element),修改指定索引处的元素,返回被修改的元素
E get(int index)返回被修改的元素

package List;

import java.util.List;
import java.util.ArrayList;
/*
 * List集合特有的方法:
 * 			void add(int index, E element),在此集合中指定位置插入指定的元素
 * 			E remove(int index),删除指定索引处的元素,返回被修改的元素
 * 			E set(int index, E element),修改指定索引处的元素,返回被修改的元素
 * 			E get(int index)返回被修改的元素
 * 
 * 
 * 
 */


public class ListDemo02 {
	public static void main(String[] args) {
		List <String>list =new ArrayList<String>();
		
		list.add("hello");
		list.add("world");
		list.add("java");
		
		//void add(int index, E element),在此集合中指定位置插入指定的元素
		// list.add(1,"javaee");
		//IndexOutOfBoundsException
//		 list.add(11,"javaee");
		
		//E remove(int index),删除指定索引处的元素,返回被修改的元素
			//System.out.println(list.remove(1));	
		//IndexOutOfBoundsException
		//	System.out.println(list.remove(11));	
		
		//E set(int index, E element),修改指定索引处的元素,返回被修改的元素
	//	System.out.println(list.set(1, "javaee"));
	//		System.out.println(list.set(11, "javaee"));
		
		//E get(int index)返回被修改的元素
	//	System.out.println(list.get(0));
		
		//输出集合
	//	System.out.println(list);
		
		//遍历集合
//	System.out.println(list.get(0));
//	System.out.println(list.get(1));
//	System.out.println(list.get(2));
		//用for循环改进集合遍历
		for(int i=0;i<list.size();i++) {
			String s = list.get(i);
			System.out.println(s);
		}
		
		
	}

}

List集合存储学生对象并遍历

需求:创建一个存储对象的集合,存储3个学生对象,使用程序实现在控制台遍历该集合

思路:
1、创建学生类
2、创建List集合对象
3、创建学生对象
4、把学生添加到集合里
5、遍历集合(迭代器方式,for循环方式)

package List03;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

/*
 *		 需求:创建一个存储对象的集合,存储3个学生对象,使用程序实现在控制台遍历该集合
 *		思路:
 *				1、创建学生类
 *				2、创建List集合对象
 *				3、创建学生对象
 *				4、把学生添加到集合里
 *				5、遍历集合(迭代器方式,for循环方式)
 */

public class ListDemo01 {	
	public static void main(String[] args) {
		List<Student> list =new ArrayList<Student>();
		
		Student s1 = new Student("小红",30);	
		Student s2 = new Student("小明",20);	
		Student s3 = new Student("小花",10);	
		
		list.add(s1);
		list.add(s2);
		list.add(s3);
		
		//遍历集合(迭代器方式)
		Iterator<Student> it= list.iterator();
		while(it.hasNext()) {
			Student s = it.next();
			System.out.println(s.getName()+","+s.getAge());
			
			
		}
		
		System.out.println("----------------");
		//遍历集合(for循环方式)
		for(int i =0;i<list.size();i++) {
			Student s = list.get(i);
			System.out.println(s.getName()+","+s.getAge());
			
		}
		
	}
}

并发修改异常

并发修改异常

  • ConcurrentModificationException

产生原因

  • 迭代器遍历的过程中,通过集合对象修改了集合中元素的长度,造成了迭代器获取的元素中判断与其修改值和实际修改的值不一致

解决方案

  • 用for循环遍历,然后用集合对象做对应的操纵作即可。
package List04;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
/*
 * 需求:1、创建List集合对象
 * 				2、集合中有三个元素
 *  			3、遍历集合,得到每一个集合,看有没有world这个元素,如果有,我就添加一个javaee元素,请写代码实现。
 *  			ConcurrentModificationException当不允许这样的修改时,可以通过检测到对象的并发修改异常。
 */
public class ListDem01 {
	public static void main(String[] args) {
		List<String> list =new ArrayList<String>();
	
		list.add("hello");
		list.add("world");
		list.add("java");
//		//遍历集合,得到每一个集合,看有没有world这个元素,如果有,我就添加一个
//		Iterator<String> it = list.iterator();
//		while(it.hasNext()) {
//			String s = it.next();
//			if(s.equals("world")) {
//				list.add("javaee");
//			}
//		
//		}
		for(int i=0;i<list.size();i++) {
			String s = list.get(i);
			if(s.equals("world")) {
				
				list.add("javaee");
			}
			
		}

		System.out.println(list);
	
	}

}

List集合存储学生对象的三种遍历方式

思路:
1、创建学生类

package ithe;

public class Student {
		private String name;
		private int age;
		
		public Student() {
			
		}
		public Student(String name,int age) {
			this.name =name;
			this.age =age;
		}
		public String getName(){
			return name;
		}
		public void setName(String name) {
			this.name=name;
		}
		public void setAge(String age) {
			this.age=age;
		}
		public int getAge(){
			return age;
		}
}
2、创建List集合对
		象
		3、创建学生对象
		4、把学生添加到集合里
		5、遍历集合
  1. 迭代器,集合特有的遍历方式
  2. 普通for,带有索引的遍历方式
  3. 增强for:最方便的遍历方式
package ithe;


import java.lang.reflect.Array;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

public class ListDemo {
		public static void main(String[] args) {
			//创建list集合对象
			List<Student> list  = new ArrayList<>();
			//创建学生对象
			Student s1 = new Student("小红",10);
			Student s2 = new Student("小明",20);
			Student s3 = new Student("小兰",30);
			//把学生对象添加到集合
			list.add(s1);
			list.add(s2);
			list.add(s3);
			//遍历集合	
			//	一、迭代器,集合特有的遍历方式
				Iterator<Student> it = list.iterator();
				while(it.hasNext()) {
					Student s = it.next();
					System.out.println(s.getName()+","+s.getAge());
				}
				System.out.println("---------");
				//二、普通for,带有索引的遍历方式
				for(int i =0;i<list.size();i++) {
					Student s = list.get(i);
					System.out.println(s.getName()+","+s.getAge());
					
				}
				System.out.println("---------");
				//增强for:最方便的遍历方式
				for(Student s:list) {
					System.out.println(s.getName()+","+s.getAge());
				}
				
				
				
}


}