学习Java的同学注意了!!!
学习进程中遇到甚么问题或想获得学习资源的话,欢迎加入Java学习交换群,群号码:183993990 我们1起学Java!
List集合代表1个有序集合,集合中每一个元素都有其对应的顺序索引。List集合允许使用重复元素,可以通过索引来访问指定位置的集合元素。
List作为Collection接口的子接口,可使用Collection接口里的全部方法。List是有序集合,所以List集合里增加了1些根据索引来操作集合元素的方法:
List集合可以根据索引来插入、替换和删除集合元素。
示例程序:
public class TestList
{
public static void main(String[] args)
{
List books = new ArrayList();
//向books集合中添加3个元素
books.add(new String("轻量级J2EE企业利用实战"));
books.add(new String("Struts2权威指南"));
books.add(new String("基于J2EE的Ajax宝典"));
System.out.println(books);
//将新字符串对象插入在第2个位置
books.add(1 , new String("ROR敏捷开发最好实践")); //已添加的对象,和下面语句做对照
for (int i = 0 ; i < books.size() ; i++ )
{
System.out.println(books.get(i));
}
//删除第3个元素
books.remove(2);
System.out.println(books);
//判断指定元素在List集合中位置:输出1,表明位于第2位
System.out.println(books.indexOf(new String("ROR敏捷开发最好实践"))); //新创建的对象
//将第2个元素替换成新的字符串对象
books.set(1, new String("Struts2权威指南"));
System.out.println(books);
//将books集合的第2个元素(包括)到第3个元素(不包括)截取称子集合
System.out.println(books.subList(1 , 2));
}
}
程序运行结果:
[轻量级J2EE企业利用实战, Struts2权威指南, 基于J2EE的Ajax宝典]
轻量级J2EE企业利用实战
ROR敏捷开发最好实践
Struts2权威指南
基于J2EE的Ajax宝典
[轻量级J2EE企业利用实战, ROR敏捷开发最好实践, 基于J2EE的Ajax宝典]
1
[轻量级J2EE企业利用实战, Struts2权威指南, 基于J2EE的Ajax宝典]
[Struts2权威指南]
程序说明:List集合可使用普通for循环来遍历集合元素。List判断两个对象相等只要通过equals方法比较返回true便可。如在判断“ROR敏捷开发最好实践”字符串的位置是,新创建了1个新字符串对象,但是程序仍返回第1次创建字符串对象的位置。当调用List的set(int index, Object element)方法来改变List集合指定索引处元素时,指定的索引必须是List集合的有效索引。
与set只提供了1个iterator()方法不同,List还额外提供了1个listIteratro()方法,该方法返回1个ListIterator对象,ListIterator接口继承了Iterator接口,提供了专门操作List的方法。
ListIterator接口在Iterator接口基础上增加了以下方法:
程序示例:
public static void main(String[] args)
{
String[] books = {
"Struts2权威指南",
"轻量级J2EE企业利用实战"
};
List bookList = new ArrayList();
for (int i = 0; i < books.length ; i++ )
{
bookList.add(books[i]);
}
ListIterator lit = bookList.listIterator();
while (lit.hasNext())
{
System.out.println(lit.next());
lit.add("-------分隔符-------");
}
System.out.println("==========下面开始反向迭代===========");
while(lit.hasPrevious())
{
System.out.println(lit.previous());
}
}
}
程序运行结果:
Struts2权威指南
轻量级J2EE企业利用实战
==========下面开始反向迭代===========
-------分隔符-------
轻量级J2EE企业利用实战
-------分隔符-------
Struts2权威指南
程序说明:List通过ListTterator迭代集合时,便可采取next()方法进行正向迭代,迭代进程中可使用add()方法向上1次迭代元素的后面添加1个新元素。同时程序演示了向前迭代。
ArrayList和Vector作为List类的两个典型实现,完全支持前面介绍的List接口全部功能。
ArrayList和Vector类都是基于数组实现的List类,他们封装了1个动态再分配的Object[]数组。每一个ArrayList或Vector对象有1个capacity属性,表示它们所封装的Object[]数组的长度。capacity会添加元素的个数而自动增加。当向集合中添加大量元素时,可使用ensureCapacity方法1次性地增加capacity。这可以减少增加重分配次数,从而提供性能。capacity大小也能够在创建时就指定,该属性默许为10.
ArrayList和Vector提供以下两个方法来操作capacity属性:
ArrayList和Vector用法几近相同,Vector是1个古老的集合(从JDK1.0),起初Java还没有提供系统的集合框架,所以Vector里提供了1些方法名很长的方法:例如addElement(Object obj), 同等于add()方法。从JDK1.2以后,Java提供了系统的集合框架,就将Vector改成实习List接口,作为List的实习之1,从而致使Vector里有1些功能重复的方法。Vector具有很多缺点,通常尽可能少用Vector实现类。
ArrayList和Vector的区分:ArrayList是线程不安全的,多个线程访问同1个ArrayList集合时,如果有超过1条线程修改了ArrayList集合,则程序必须手动保证该集合的同步性。Vector集合则是线程安全的,无线程序保证该集合的同步性。由于Vector是线程安全的,所以Vector的性能比ArrayList的性能要低。实际上,即便保证List集合线程安全,一样不推荐使用Vector实现类。Collections工具类,可以将1个ArrayList变成线程安全的。
Vector还提供了1个Stack子类,它用于摹拟了”栈“这类数据结构,”栈“通常是指”落后先出“(LIFO)的容器。最后”push“进栈的元素,将最早被”pop“出栈。与Java中其他集合1样,进栈出栈的都是Object,因此从栈中取出元素后必须做类型转换,除非你只是使用Object具有的操作。所以stack类提供了以下几个方法:
程序示例:
public class TestVector
{
public static void main(String[] args)
{
Stack v = new Stack();
//顺次将3个元素push入"栈"
v.push("Struts2权威指南");
v.push("轻量级J2EE企业利用实战");
v.push("ROR敏捷开发最好实践");
//输出:[Struts2权威指南, 轻量级J2EE企业利用实战, ROR敏捷开发最好实践]
System.out.println(v);
//访问第1个元素,但其实不将其pop出"栈",输出:ROR敏捷开发最好实践
System.out.println(v.peek());
//仍然输出:[Struts2权威指南, 轻量级J2EE企业利用实战, ROR敏捷开发最好实践]
System.out.println(v);
//pop出第1个元素,输出:ROR敏捷开发最好实践
System.out.println(v.pop());
//仍然输出:[Struts2权威指南, 轻量级J2EE企业利用实战]
System.out.println(v);
}
}
程序运行结果:
[Struts2权威指南, 轻量级J2EE企业利用实战, ROR敏捷开发最好实践]
ROR敏捷开发最好实践
[Struts2权威指南, 轻量级J2EE企业利用实战, ROR敏捷开发最好实践]
ROR敏捷开发最好实践
[Struts2权威指南, 轻量级J2EE企业利用实战]
List还有1个LinkedList的实现,它是1个基于链表实现的List类,对顺序访问集合中的元素进行了优化,特别是当插入、删除元素时速度非常快。由于LinkedList即实现了List接口,也实现了Deque接口(双向队列),Deque接口是Queue接口的子接口,它代表1个双向列表,Deque接口里定义了1些可以双向操作队列的方法:
从上面方法中可以看出,LinkedList不但可以当做双向队列使用,也能够当做“栈”使用。同时,LinkedList实现了List接口,所以还被当做List使用。
程序示例:
public class TestLinkedList
{
public static void main(String[] args)
{
LinkedList books = new LinkedList();
//将字符串元素加入队列的尾部
books.offer("Struts2权威指南");
//将1个字符串元素入栈
books.push("轻量级J2EE企业利用实战");
//将字符串元素添加到队列的头部
books.offerFirst("ROR敏捷开发最好实践");
for (int i = 0; i < books.size() ; i++ )
{
System.out.println(books.get(i));
}
//访问、其实不删除队列的第1个元素
System.out.println(books.peekFirst());
//访问、其实不删除队列的最后1个元素
System.out.println(books.peekLast());
//采取出栈的方式将第1个元素pop出队列
System.out.println(books.pop());
//下面输出将看到队列中第1个元素被删除
System.out.println(books);
//访问、并删除队列的最后1个元素
System.out.println(books.pollLast());
//下面输出将看到队列中只剩下中间1个元素:轻量级J2EE企业利用实战
System.out.println(books);
}
}
程序运行结果:
ROR敏捷开发最好实践
轻量级J2EE企业利用实战
Struts2权威指南
ROR敏捷开发最好实践
Struts2权威指南
ROR敏捷开发最好实践
[轻量级J2EE企业利用实战, Struts2权威指南]
Struts2权威指南
[轻量级J2EE企业利用实战]
说明:程序中示范了LinkedList作为双向队列、栈和List集合的用法。LinkedList与ArrayList、Vector的实现机制完全不同,ArrayList、Vector内部以数组的情势来保存集合中的元素,因此随机访问集合元素上有较好的性能;而LinkedList内部以链表的情势来保存集合中的元素,因此随机访问集合时性能较差,但在插入、删除元素时性能非常出色(只需改变指针所指的地址便可)。Vector因实现了线程同步功能,所以各方面性能有所降落。
关于使用List集合的几点建议:
学习Java的同学注意了!!!
学习进程中遇到甚么问题或想获得学习资源的话,欢迎加入Java学习交换群,群号码:183993990 我们1起学Java!