Java集合框架(Collections Framework)(4)

示例:

import java.util.*; public class TestList { public static void main(String[] args) { List ls = new ArrayList(); ls.add(new Student("Malong1",21)); ls.add(new Student("Malong2",22)); ls.add(1,new Student("Malong3",23)); //[Malong1 21,Malong3 23,Malong2 22] System.out.println(ls.indexOf(new Student("Malong3",23))); // return:1 ls.set(2,new Student("Gaoxiao1",22)); //[Malong1 21,Malong3 23,Gaoxiao1 22] for (Iterator it = l.iterator();it.hasNext();) { //第一种迭代 Student stu = (Student)it.next(); if (stu.getAge() == 22) { it.remove(); // the safe way to operate element //ls.add(new Student("Malong4",24)); //throw ConcurrentModificationException } } //[Malong1 21,Malong3 23] System.out.println(l+"\n---------------"); for (int i=0;i<ls.size();i++) { //第二种迭代 System.out.println(ls.get(i)); } } } class Student { private String name; private int age; Student(String name,int n) { this.name = name; this.age = n; } public String getName() {return this.name;} public int getAge() {return this.age;} //override toString() public String toString() { return this.name + " " + this.age; } //override equals() public boolean equals(Object obj) { if (this == obj) {return true;} if (!(obj instanceof Student)) { throw new ClassCastException("Class error"); } Student stu = (Student)obj; return this.name.equals(stu.name) && this.age == stu.age; } }

上面的代码中,如果将ls.add(new Student("Malong4",24));的注释取消,将抛出异常,因为Iterator迭代器中唯一安全操作元素的方法是Iterator接口提供的remove(),而add()方法是List接口提供的,而非Iterator接口的方法。但对于List集合类来说,可以使用ListIterator迭代器,它提供的操作元素的方法更多,因为是迭代器提供的方法,因此它们操作元素时都是安全的。

List集合的迭代器ListIterator

通过listIterator()方法可以获取ListIterator迭代器。该迭代器接口提供了如下几种方法:

hasNext():是否有下一个元素

hasPrevious():是否有前一个元素,用于逆向遍历

next():获取下一个元素

previour():获取前一个元素,用于逆向遍历

add(element):插入元素。注:这是迭代器提供的add(),而非List提供的add()

remove():移除next()或previous()获取到的元素。注:这是迭代器提供的remove(),而非List提供的remove()

set(element):设置next()或previour()获取到的元素。注:这是迭代器提供的set(),而非List提供的set()

例如:前文示例在Iterator迭代过程中使用List的add()添加元素抛出了异常,此处改用ListIterator迭代并使用ListIterator提供的add()方法添加元素。

List l = new ArrayList(); l.add(new Student("Malong1",21)); l.add(new Student("Malong2",22)); l.add(1,new Student("Malong3",23)); //[Malong1 21,Malong3 23,Malong2 22] l.set(2,new Student("Gaoxiao1",22));//[Malong1 21,Malong3 23,Gaoxiao1 22] for (ListIterator li = l.listIterator();li.hasNext();) { Student stu = (Student)li.next(); if (stu.getAge() == 22) { //l.add(new Student("Malong4",24)); //throw ConcurrentModificationException li.add(new Student("Malong4",24)); } } LinkedList集合

LinkedList类的数据结构是链表类的集合。它可以实现堆栈、队列和双端队列的数据结构。其实实现这些数据结构都是通过LinkedList提供的方法按照不同逻辑实现的。

提供的其中几个方法如下:因为是实现了List接口,所以除了下面的方法,还有List接口的方法可用。

addFirst(element):向链表的首部插入元素

addLast(element):向链表的尾部插入元素

getFirst():获取链表的第一个元素

getLast():获取链表最后一个元素

removeFirst():移除并返回第一个元素,注意返回的是元素

removeLast():移除并返回最后一个元素,注意返回的是元素

LinkedList模拟队列数据结构

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/349b058e608364c69d6a7c8d05332c22.html