List集合的子实现类的特点:
ArrayList:
底层数据结构是数组的形式,满足数组结构的特点:查询快,增删慢
从线程安全问题来看:线程不安全的,不同步,执行效率高
Vector:
底层数据结构是数组的形式,查询快,增删慢
从线程角度看:线程安全的类,同步,执行效率低
LinkedList:
底层数据结构是链接列表,特点:查询慢,增删快
从线程角度看:线程不安全的一个类,不同步,执行效率高
如果实现多线程程序,一般要是安全的类:
StringBuffer,Vector<E>,hashtable<K,V>
synchronized(同步锁对象){
代码;
}
如果在一般的需求中没有指明使用集合去完成,都默认采用ArrayList
如果需求中要考虑线程安全,那么使用Vector集合!
笔试过程中,一些需求用到集合:就是用ArrayList
(1)ArrayList:
底层数据结构是数组的形式,满足数组结构的特点:查询快,增删慢
从线程安全问题来看:线程不安全的,不同步,执行效率高
由于ArrayList是List集合的字实现类,它元素可以重复,并且存储和取出一致
JDK5以后提供了很多特性:
泛型,增强for循环,可变参数,静态导入,自动拆装箱,枚举等
增强for循环
书写格式:
* for(集合或者数组中的数据类型 变量名:集合或者数组的对象名){
* 输出变量名;
* }
*
* 增强for循环的弊端:
* 遍历数组或者集合的时候,数组对象或者集合对象不能为null
* 如果对象为空,一般加上非空判断
*
* 增强for循环的出现就是为了替代迭代器遍历集合的,以后开发中就是用增强for遍历元素
增强for只能进行遍历,无法获取单个元素.
package list;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.ListIterator;
/**
* 使用ArrayList集合存储自定义对象并遍历
* 几种方式呢:
* 1)toArray()
* 2)Collection集合的迭代器:Iterator iterator();
* 3)List集合的迭代器:ListIterator listiterator();
* 4)普通for循环:size()和get(int index)相结合
* 5)增强for循环
* @author Apple
*/
public class ForDemo2 {
public static void main(String[] args) {
// 创建ArrayList集合
ArrayList<Student> array = new ArrayList<Student>();
// 创建学生对象
Student s1 = new Student("高圆圆", 27);
Student s2 = new Student("高圆圆", 20);
Student s3 = new Student("邓超", 29);
Student s4 = new Student("邓超", 25);
// 给集合中添加元素
array.add(s1) ;
array.add(s2) ;
array.add(s3) ;
array.add(s4) ;
//普通for循环:size()和get(int index)相结合
for(int x =0 ; x < array.size() ; x ++){
Student s = array.get(x) ;
System.out.println(s.getName()+"---"+s.getAge());
}
System.out.println("-----------------------");
//Collection集合的迭代器:Iterator iterator();
Iterator<Student> it = array.iterator() ;
while(it.hasNext()){
Student s = it.next() ;
System.out.println(s.getName()+"----"+s.getAge());
}
System.out.println("-----------------------");
//List集合的迭代器:ListIterator listiterator();
ListIterator<Student> lt=array.listIterator();
while(lt.hasNext()) {
Student st = lt.next() ;
System.out.println(st.getName()+"----"+st.getAge());
}
System.out.println("-----------------------");
//增强for遍历
for(Student s : array){
System.out.println(s.getName()+"----"+s.getAge());
}
}
}
ArrayList的应用:集合去重
方法1:创建新集合
如果当前元素不包括在新集合中,则添加到新集合中
//3)创建一个新集合
ArrayList newArray = new ArrayList() ;
//遍历旧集合,获取迭代器对象
Iterator it = array.iterator() ;
while(it.hasNext()){
Student s = (Student) it.next() ;
//判断新集合中是否包含这些对象
if(!newArray.contains(s)){
//不包含的对象才能添加新集合
newArray.add(s) ;
}
}
方法2:利用选择排序思想
将后面的元素和前面的元素比较,如果和前一个元素重复则从集合中移除后面索引对应的元素
for(int x = 0 ;x <array.size() -1 ; x ++){
for(int y= x +1 ; y <array.size() ;y++){
//判断
if(array.get(x).equals(array.get(y))){
array.remove(y) ;
y -- ;
}
}
}
注意:如果集合存储的是自定义对象,需要重写此自定义类的equals()方法
(2)Vector
package org.westos_02;
import java.util.Enumeration;
import java.util.Vector;
/**
* Vector:
底层数据结构是数组的形式,查询快,增删慢
从线程角度看:线程安全的类,同步,执行效率低
特有功能:
public void addElement(E obj)------->相当于:add(Object e)
public Enumeration<E> elements()----->相当于:Iterator iterator() ;
Enumeration<E>接口:向量的组件枚举有两个方法
boolean hasMoreElements():------>相当于:hasNext()
Object nextElement():----------->相当于:next();
源码:
synchronized:同步锁(多线程中讲):它就可以保证线程安全!
public synchronized void addElement(E obj) {//由同步代码块演变过来的同步方法
modCount++;
ensureCapacityHelper(elementCount + 1);
elementData[elementCount++] = obj;
}
* @author Apple
*/
public class VectorDemo {
public static void main(String[] args) {
//创建一个Vector集合对象
Vector v = new Vector() ;
//添加元素
//public void addElement(E obj)
v.addElement("hello");
v.addElement("hello");
v.addElement("world");
v.addElement("Java");
//public Enumeration<E> elements()----->相当于:Iterator iterator() ;
Enumeration en = v.elements() ;
//遍历元素
/**
* boolean hasMoreElements():------>相当于:hasNext()
Object nextElement():----------->相当于:next();
*/
while(en.hasMoreElements()){
//获取元素
String s = (String)en.nextElement() ;
System.out.println(s);
}
}
}
(3)LinkedList:
底层数据结构是链接列表,特点:查询慢,增删快
从线程角度看:线程不安全的一个类,不同步,执行效率高
特有功能:
添加功能:
public void addFirst(E e)将指定元素插入此列表的开头。
public void addLast(E e)将指定元素添加到此列表的结尾。
获取功能:
public Object getFirst()返回此列表的第一个元素
public Object getLast()返回此列表的最后一个元素。
删除功能:
public Object removeFirst()移除并返回此列表的第一个元素。
public Object removeLast()移除并返回此列表的最后一个元素。
package org.westos_03;
import java.util.LinkedList;
/**
* LinkedList:
底层数据结构是链接列表,特点:查询慢,增删快
从线程角度看:线程不安全的一个类,不同步,执行效率高
特有功能:
添加功能:
public void addFirst(E e)将指定元素插入此列表的开头。
public void addLast(E e)将指定元素添加到此列表的结尾。
获取功能:
public Object getFirst()返回此列表的第一个元素
public Object getLast()返回此列表的最后一个元素。
删除功能:
public Object removeFirst()移除并返回此列表的第一个元素。
public Object removeLast()移除并返回此列表的最后一个元素。
* @author Apple
*/
public class LinkedListDemo {
public static void main(String[] args) {
//创建LinkedList集合
LinkedList link = new LinkedList() ;
//添加元素
link.addFirst("hello") ;
link.addFirst("world") ;
link.addFirst("Java") ;
//public void addFirst(E e)将指定元素插入此列表的开头
/*link.addFirst("android") ;
link.addLast("JavaWeb") ;*/
/**
* public Object getFirst()返回此列表的第一个元素
public Object getLast()返回此列表的最后一个元素。
*/
/*
Object obj = link.getFirst() ;
System.out.println(obj);
Object obj2 = link.getLast() ;
System.out.println(obj2);*/
/**
* public Object removeFirst()移除并返回此列表的第一个元素。
public Object removeLast()移除并返回此列表的最后一个元素。
*/
/*System.out.println("removeFirst:"+link.removeFirst());
System.out.println("removeLast:"+link.removeLast());*/
//输出集合
System.out.println("link:"+link);
}
}