Java集合框架(线性表、栈、队列和优先队列)

线性表、栈、队列和优先队列

  • 引言(Java集合框架)
  • 集合(Collection)
  • 迭代器
    • forEach()
  • 线性表
    • 数组线性表类ArrayList和链表类LinkedList
  • Comparator接口

引言(Java集合框架)

  • 数据结构(在java中称作Java集合框架):可以被认为是一种container(容器),从本质上是一个定义了的类。
    java 中的容器
  • java集合框架中定义的所有的接口和类都组织在java.util包中。
  • Java集合框架的设计是一个使用接口、抽象类和具体类的很好的例子。接口定义了通用的操作;抽象类提供了部分实现;具体类用具体的数据结构实现这个接口

集合(Collection)

  • java集合框架有两种类型的容器:

Collection:为了存储元素的集合,是处理对象集合的根接口。
map(映射): 存储键/值对

  • Collection的分类:

Set:用于存储一组不重复的元素。
List:用于存储有序元素的集合,允许重复
Stack:后进先出
Queue:先进先出
PriorityQueue(优先队列):按照优先级顺序处理对象。

  • 便利抽象类:简单的定义一个具体类继承自抽象类,而无需实现接口中的所有方法。如(AbstractCollection)。

Java集合框架(线性表、栈、队列和优先队列)_第1张图片

迭代器

  • 每种集合都是可迭代的。可以获得集合的Iterator对象来遍历集合中的所有元素(不需要暴漏数据是如何保存在数据结构的细节的情况下,便利一个数据结构)
import java.util.*;
//正面遍历应该可以不使用迭代器
public class TestIterator {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Collection 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 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 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 list1 = Arrays.asList("red", "green", "blue");
    List List2 = Arrays.asList(10, 20, 30, 40, 50);

Comparator接口

  • 与Comparable接口区别:
  • Comparable接口:用于String、Data、Calendar、BigInteger、BigDecimal。
  • 如果元素的类没有实现Comparable接口又将如何?

需要创建一个实现java.util.Comparable接口的类并重写它的compare方法。

你可能感兴趣的:(JAVA)