【List子接口中的特有方法:】这些方法都是必须得会的。必须是不加思索
【特点】——对元素有索引标识,所以它的特有方法都是围绕索引展开的。
1. 添加:——会改变集合的长度。
void add (intindex , E element)插入任意位置。
boolean add(E o) 向列表的尾部追加指定的元素
boolean addAll(Collection<? extends E> c)
追加指定 collection 中的所有元素到此列表的结尾,顺序是指定 collection 的迭代器返回这些元素的顺序
2. 删除:
Object remove(intindex); (获取并删除)——会改变集合的长度。
3. 获取:
Object get(int index); 获取元素:
int indexOf(object); 获取元素索引:
intlastIndexOf(object); 获取元素索引:
List subList(fromIndex, toIndex); 获取子列表:
获取列表中的一部分,包含fromIndex位置,不包含toIndex位置。
4. 修改。
Object set(index ,element):替换指定位置的元素,并返回被替代的元素。
【List接口是可以对元素进行增删改查的操作的。注意:只有这个集合具备增删改查。
具备原因:因为有索引。】
【增加,删除】——会改变集合的长度。
——————————————————————————————————————————————————————————————————————
【ListIterator 的应用】
当对集合进行迭代时,在迭代的过程中,如果用集合对象对元素进行了修改,
而迭代器是不知道的,所以在迭代的过程中就会发生不确定性。
可能会抛出ConcurrentModificationException: 并发修改异常。
为了避免这种情况的发生,在迭代时,不要使用集合对象对迭代中的元素进行操作。
但是:还想在迭代过程中对被迭代的元素进行更多的操作。该怎么办呢?
如何解决这个问题——list接口中提供了一个特有的迭代器。
这个迭代器就是ListIterator列表迭代器。可以再迭代过程中 实现:增删改查;
而且这个迭代器只能在list集合中使用
——————————————————————————————————————————————————————————————————————————
常见子类对象:具体的子类对象,学习该对象的特有数据结构,以及相关特点。
List接口的三个常用小弟:
Vector—— 底层是数组结构。可变长度数组,是同步的。
【可变数组原理】:一旦数组长度不够,会创建新数组,长度为原来的一倍,将原数组的元素复制到新数组中,并将新元素添加到新数组中。
ArrayList—— 底层也是数组结构,也是支持长度可变数组的。是不同步的,不用进行很多次判断锁!替代了Vector。
查询效率很高。但是增删的效率很低。
LinkedList——底层是连接列表结构。简称链表结构。是不同步的。
这种结构的好处:对元素的增删效率非常高。查询效率低。
—————————————————————————————————————————————————————————————————————————————
枚举接口也是用来取出集合中的元素,但是枚举接口只能取出Vector集合中的元素。
枚举最后被迭代器取代!
【特点】——对元素有索引标识,所以它的特有方法都是围绕索引展开的。
1. 添加:——会改变集合的长度。
void add (intindex , E element)插入任意位置。
boolean add(E o) 向列表的尾部追加指定的元素
boolean addAll(Collection<? extends E> c)
追加指定 collection 中的所有元素到此列表的结尾,顺序是指定 collection 的迭代器返回这些元素的顺序
2. 删除:
Object remove(intindex); (获取并删除)——会改变集合的长度。
3. 获取:
Object get(int index); 获取元素:
int indexOf(object); 获取元素索引:
intlastIndexOf(object); 获取元素索引:
List subList(fromIndex, toIndex); 获取子列表:
获取列表中的一部分,包含fromIndex位置,不包含toIndex位置。
4. 修改。
Object set(index ,element):替换指定位置的元素,并返回被替代的元素。
【List接口是可以对元素进行增删改查的操作的。注意:只有这个集合具备增删改查。
具备原因:因为有索引。】
【增加,删除】——会改变集合的长度。
——————————————————————————————————————————————————————————————————————
【ListIterator 的应用】
当对集合进行迭代时,在迭代的过程中,如果用集合对象对元素进行了修改,
而迭代器是不知道的,所以在迭代的过程中就会发生不确定性。
可能会抛出ConcurrentModificationException: 并发修改异常。
为了避免这种情况的发生,在迭代时,不要使用集合对象对迭代中的元素进行操作。
但是:还想在迭代过程中对被迭代的元素进行更多的操作。该怎么办呢?
如何解决这个问题——list接口中提供了一个特有的迭代器。
这个迭代器就是ListIterator列表迭代器。可以再迭代过程中 实现:增删改查;
而且这个迭代器只能在list集合中使用
——————————————————————————————————————————————————————————————————————————
常见子类对象:具体的子类对象,学习该对象的特有数据结构,以及相关特点。
List接口的三个常用小弟:
Vector—— 底层是数组结构。可变长度数组,是同步的。
【可变数组原理】:一旦数组长度不够,会创建新数组,长度为原来的一倍,将原数组的元素复制到新数组中,并将新元素添加到新数组中。
ArrayList—— 底层也是数组结构,也是支持长度可变数组的。是不同步的,不用进行很多次判断锁!替代了Vector。
查询效率很高。但是增删的效率很低。
LinkedList——底层是连接列表结构。简称链表结构。是不同步的。
这种结构的好处:对元素的增删效率非常高。查询效率低。
—————————————————————————————————————————————————————————————————————————————
【对应代码演示】
【Vector 演示】
枚举接口也是用来取出集合中的元素,但是枚举接口只能取出Vector集合中的元素。
枚举最后被迭代器取代!
package day0915;
import java.util.Enumeration;
import java.util.Vector;
public class VectorDemo {
public static void main(String[] args) {
// TODO Auto-generated method stub
Vector v = new Vector();
v.addElement("abc1");
v.addElement("abc2");
v.addElement("abc3");
v.addElement("abc4");
//枚举接口也是用来去除集合中的元素,但是枚举接口只能取出
//Vector集合中的对象
Enumeration en = v.elements();
while(en.hasMoreElements()){
System.out.println(en.nextElement());
}
}
}
【代码演示——面试题 ——用LinkedList模拟一个堆栈或者队列数据结构。】
package day0915;
/**
* 需求:用LinkedList模拟一个堆栈或者队列的数据结构
* @author Administrator
*/
public class LinkedListTest {
public static void main(String[] args) {
// TODO Auto-generated method stub
Myqueue my = new Myqueue();
my.myAdd("abc1");
my.myAdd("abc2");
my.myAdd("abc3");
my.myAdd("abc4");
while(!my.isNull()){
System.out.println(my.myGet());
}
}
}
package day0915;
import java.util.LinkedList;
public class Myqueue {
private LinkedList list = null;
public Myqueue(){
list = new LinkedList();
}
/*
* 往链表中添加元素
*/
public void myAdd(Object obj){
list.addLast(obj);
}
/*
* 从链表中删除元素
*/
public Object myGet(){
return list.removeFirst();
}
/**
* 判断是否为空
*/
public boolean isNull(){
return list.isEmpty();
}
}
【ArryList 代码演示】
package day0915;
import java.util.ArrayList;
import java.util.Iterator;
/**
* 需求:定义一个功能,取出ArrayList 中大的重复元素
* 思路:
* 1. 定义一个集合,用于存储唯一性的元素
* 2. 迭代已有的集合,将每一个迭代到的元素都与新集合中判断是否包含。
* 如果包含就不存储,如果不包含就存储到新集合中。
* 3. 迭代结束,新集合中存储的都是不重复的元素。
* @author Administrator
*
*/
public class ArrayListDemo {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
ArrayList a1 = new ArrayList();
a1.add("abc1");
a1.add("abc2");
a1.add("abc1");
a1.add("abc2");
a1.add("abc3");
System.out.println(a1);
a1 = getSingleElements(a1);
System.out.println(a1);
}
public static ArrayList getSingleElements(ArrayList a1) {
// TODO Auto-generated method stub
ArrayList temp = new ArrayList();
Iterator it = a1.iterator();
while(it.hasNext()){
Object obj = it.next();//这块儿为什么这样写,如果不这样写的后果就是异常,因为it.next() 始终在往后推移!
if(!temp.contains(obj)){
temp.add(obj);
}
}
return temp;
}
}
注意:ArrayList判断元素是否相同使用的equals方法。
比如contains 中就是依赖于equals方法。
或者remove方法都是依赖于equals方法。
尤其是存储自定义对象时,该对象一定要覆盖equals方法,建立根据对象自身特点的判断相同的依据。
equals就是用于比较对象的内容的。