List接口
如图,是左边这部分
 
List:有序,可重复
Set:无序,不可重复
1 List接口
1.1 特点
1)它是一个元素存取有序的集合。
2)它是一个带有索引的集合,通过索引就可以精确的操作集合中的元素(与数组的索引是一个道理)。
3)集合中可以有重复的元素,通过元素的equals方法,来比较是否为重复的元素。
1.2常用方法
 
在指定位置添加元素add()
获取get(index)
删除remove()
替换set(index)
例:
import java.util.ArrayList;
import java.util.List;
public class ListTest1 {
	public static void main(String[] args) {
		List<String> list=new ArrayList<String>();
		list.add("a");
		list.add("b");
		
		//在指定位置添加元素
		list.add(1,"c");
		System.out.println(list);	
		
		//遍历(通过下标获取)
		for(int i=0;i<list.size();i++){
			System.out.print(list.get(i)+" ");
		}
		
		System.out.println();
		
		//删除指定位置的元素
		String str=list.remove(1);		
		System.out.println("删除:");
		System.out.println(str);
		System.out.println(list);
		
		//替换指定位置上的元素
		list.set(1, "z");
		System.out.println("替换:");
		System.out.println(list);		
	}
}

1.3 Iterator并发修改异常
在迭代过程中,使用了集合的方法对元素进行操作。导致迭代器并不知道集合中的变化,容易引发数据的不确定性。
例:
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class IteratorTest {
	public static void main(String[] args) {
		List<String> list=new ArrayList<String>();
		list.add("a");
		list.add("b");
		list.add("c");
		
		Iterator<String> it=list.iterator(); //获取迭代器对象
		//循环遍历
		while(it.hasNext()){
			String s=it.next();
			//如果有元素"b",那么再添加一个元素
			if(s.equals("b")){
				list.add("d");
			}			
		}
	}
}

所以用迭代器和增强for时,在遍历时不能对元素进行操作。想操作只能用普通for。
2集合存储数据的结构
List接口下有很多个集合,它们存储元素所采用的结构方式是不同的,这样就导致了这些集合有它们各自的特点,供给我们在不同的环境下进行使用。
数据存储的常用结构有:堆栈、队列、数组、链表。
2.1堆栈
特点:
1)先进后出
2)栈的入口、出口的都是栈的顶端位置
3)压栈:就是存元素
4)弹栈:就是取元素
2.2队列
特点:
1)先进先出
2)队列的入口、出口各占一侧。
2.3数组结构
特点:
1)查找元素快:因为有索引
2)增删元素慢:因为长度不可变,需要创建新数组
2.4链表
多个节点之间,通过地址进行连接。
有数据域和指针域,指针域中存是的下一个数据的地址。
特点:
1)查找元素慢:想查找某个元素,需要通过连接的节点,依次向后查找指定元素
2)增删元素快(如下图):
增加元素:只需要修改连接下个元素的地址即可。
删除元素:只需要修改连接下个元素的地址即可。

3 ArrayList集合数据存储结构
ArrayList集合数据存储的结构是数组结构。
由于日常开发中使用最多的功能为查询数据、遍历数据,所以ArrayList是最常用的集合。
许多程序员开发时非常随意地使用ArrayList完成任何需求,并不严谨,这种用法是不提倡的。
看需求,是查询多,还是增删多。
4 LinkedList集合
LinkedList集合数据存储的结构是链表结构。方便元素添加、删除的集合。
实际开发中对一个集合元素的添加与删除经常涉及到首尾操作,而LinkedList提供了大量首尾操作的方法。
4.1常用方法
 
1)添加
import java.util.LinkedList;
public class Test {
	public static void main(String[] args) {
		LinkedList<Integer> list=new LinkedList<Integer>();
		list.add(1);
		list.add(2);		
		list.addFirst(3);
		list.addFirst(4);
		list.addLast(5);		
		
		System.out.println(list);
	}
}
 
import java.util.LinkedList;
public class Test {
	public static void main(String[] args) {
		LinkedList<Integer> list=new LinkedList<Integer>();
		list.addLast(1);
		list.addLast(2);
		list.add(3);
		list.addFirst(4);
		list.addFirst(5);		
		
		System.out.println(list);
	}
}

2)获取首尾
import java.util.LinkedList;
public class Test {
	public static void main(String[] args) {
		LinkedList<Integer> list=new LinkedList<Integer>();
		list.addLast(1);
		list.addLast(2);
		list.add(3);
		list.addFirst(4);
		list.addFirst(5);
		
		System.out.println(list);
		
		System.out.println("第一个是"+list.getFirst());
		System.out.println("最后一个是"+list.getLast());
	}
}

3)删除首尾
import java.util.LinkedList;
public class Test {
	public static void main(String[] args) {
		LinkedList<Integer> list=new LinkedList<Integer>();
		list.addLast(1);
		list.addLast(2);
		list.add(3);
		list.addFirst(4);
		list.addFirst(5);
		
		System.out.println(list);		
		
		list.removeLast();
		list.removeFirst();
		System.out.println("删除后:");
		System.out.println(list);	
	}
}

4)堆栈顺序存取
import java.util.LinkedList;
public class Test {
	public static void main(String[] args) {
		LinkedList<Integer> list=new LinkedList<Integer>();		
		list.push(1);
		list.push(2);
		list.push(3);
		list.push(4);
		
		System.out.println(list.pop());
		System.out.println(list.pop());
		System.out.println(list.pop());
		System.out.println(list.pop());
	}
}

5)上面例子中,pop()方法,如果集合中没有元素了,再pop,就会报异常
 
所以要加个判断 list.size()!=0,也可以用isEmpty()方法
import java.util.LinkedList;
public class Test {
	public static void main(String[] args) {
		LinkedList<Integer> list=new LinkedList<Integer>();		
		list.push(1);
		list.push(2);
		list.push(3);
		list.push(4);
		
		while(!list.isEmpty()){				
			System.out.println(list.pop());
		}
	}
}

isEmpty()是从Collection继承来的
4.2 LinkedList和ArrayList的区别
1)ArrayList是基于动态数组的数据结构,LinkedList是基于链表的数据结构。 
2)对于随机访问get和set,ArrayList优于LinkedList,因为LinkedList要移动指针。 
3)对于新增和删除操作add和remove,LinedList比较占优势,因为ArrayList要移动数据。 
5 Vector集合(过时,了解即可,和Iterator和ArrayList一样的)
Vector集合数据存储的结构是数组结构,为JDK中最早提供的集合。
Vector中提供了一个独特的取出方式,就是枚举Enumeration,它其实就是早期的迭代器。此接口Enumeration的功能与 Iterator 接口的功能是类似的。
Vector集合已被ArrayList替代。枚举Enumeration已被迭代器Iterator替代。
5.1 Vector常用方法
 
对比ArrayList:
elementAt()就是ArrayList中的get()
elements() 就是Iterator中获取对象的iterator() 方法
5.2 Enumeration枚举常用方法

对比Iterator:
hasMoreElements() 就是hasNext()
nextElement() 就是next()
5.3 Vector和ArrayList对比
Vector是同步的,安全,慢
ArrayList不同步,不安全,快
                    
                
                
            
        
浙公网安备 33010602011771号