引言(Java集合框架)
- 数据结构(在java中称作Java集合框架):可以被认为是一种container(容器),从本质上是一个定义了的类。
java 中的容器 - java集合框架中定义的所有的接口和类都组织在java.util包中。
- Java集合框架的设计是一个使用接口、抽象类和具体类的很好的例子。接口定义了通用的操作;抽象类提供了部分实现;具体类用具体的数据结构实现这个接口。
集合(Collection)
- java集合框架有两种类型的容器:
Collection:为了存储元素的集合,是处理对象集合的根接口。
map(映射): 存储键/值对
- Collection的分类:
Set:用于存储一组不重复的元素。
List:用于存储有序元素的集合,允许重复。
Stack:后进先出
Queue:先进先出
PriorityQueue(优先队列):按照优先级顺序处理对象。
- 便利抽象类:简单的定义一个具体类继承自抽象类,而无需实现接口中的所有方法。如(AbstractCollection)。
迭代器
- 每种集合都是可迭代的。可以获得集合的Iterator对象来遍历集合中的所有元素(不需要暴漏数据是如何保存在数据结构的细节的情况下,便利一个数据结构)
import java.util.*;
//正面遍历应该可以不使用迭代器
public class TestIterator {
public static void main(String[] args) {
// TODO Auto-generated method stub
Collection<String> collection = new ArrayList<>();
collection.add("New York");
collection.add("Atlanta");
collection.add("Dallas");
collection.add("Madison");
System.out.print(collection); //输出[New York, Atlanta, Dallas, Madison]
//定义一个迭代器
// Iterator<String> iterator = collection.iterator();
// while (iterator.hasNext()) {
// System.out.print(iterator.next().toUpperCase() + " ");
// } //输出NEW YORK ATLANTA DALLAS MADISON
// System.out.println();
}
}
forEach()
- 从Java8开始在Iterator接口中添加一个新的默认方法forEach。
import java.util.*;
public class TestForEachLambda {
public static void main(String[] args) {
// TODO Auto-generated method stub
Collection<String> collection = new ArrayList<>();
collection.add("New York");
collection.add("Atlanta");
collection.add("Dallas");
collection.add("Madison");
collection.forEach(e -> System.out.print(e.toUpperCase() + " "));
}
线性表
- ArrayList---->List LinkedList---->List
- List接口增加了面向位置的操作,并且增加了一个能够双向遍历线性表的新的Iterator。
- ListIterator接口继承了Iterator接口,以增加对线性表的双向遍历能力。增加hasPrevious()用于检测迭代器往回遍历时是否还有元素。
数组线性表类ArrayList和链表类LinkedList
- ArrayList用数组储存元素,这个数组是动态创建的。如果元素个数超过了数组的容量,就创建一个更大的数组,并将当前数组中的所有元素都复制到新的数组中,可随机访问数据。
- 如何选择线性表还是数组?
如果不需要在线性表中插入或删除元素,那么数组是效率最高的数据结构。
- 如何选择ArrayList还是LinkedList呢?
如果需要通过下标随机访问元素,而不会在线性表起始位置插入或删除元素,那么ArrayList是最高效的。
如果应用程序需要在线性表的起始位置或结尾位置插入或删除元素,应该选择后者。
- 为了从可变长参数表中创建线性表,java提供了静态的asList方法。
List<String> list1 = Arrays.asList("red", "green", "blue");
List<Integer> List2 = Arrays.asList(10, 20, 30, 40, 50);
Comparator接口
- 与Comparable接口区别:
- Comparable接口:用于String、Data、Calendar、BigInteger、BigDecimal。
- 如果元素的类没有实现Comparable接口又将如何?
需要创建一个实现java.util.Comparable接口的类并重写它的compare方法。