这一讲我们来谈谈 List 接口。List 接口是 Collection 接口的子接口。
关于 List 的解释,Oracle 的官方文档上是这么说的:
An ordered collection (also known as a sequence). The user of this interface has precise control over where in the list each element is inserted. The user can access elements by their integer index (position in the list), and search for elements in the list.
Source: https://docs.oracle.com/javase/8/docs/api/java/util/List.html
由以上这段话我们可以得到以下信息:List 接口,是有序的。该接口可以对列表中的每一个元素的插入位置进行精确的控制,同时用户可以根据元素的整数索引(在列表中的位置)访问元素,并搜索列表中的元素。
List 作为一个接口,本身无法实例化,但它拥有有很多实现类: AbstractList
, AbstractSequentialList
, ArrayList
, AttributeList
, CopyOnWriteArrayList
, LinkedList
, RoleList
, RoleUnresolvedList
, Stack
, Vector
我们可以通过以下方法来构造 List 对象:
List 接口拥有以下常用方法:
Source: https://docs.oracle.com/javase/8/docs/api/java/util/List.html
示例如下:
Source:http://www.geeksforgeeks.org/list-interface-java-examples/
在 List 接口的很多个实现类中,常用的有 ArrayList
, LinkedList
, Stack
, Vector
, 下面我们来逐一分析
ArrayList
Resizable-array implementation of the List interface. Implements all optional list operations, and permits all elements, including null. In addition to implementing the List interface, this class provides methods to manipulate the size of the array that is used internally to store the list. (This class is roughly equivalent to Vector, except that it is unsynchronized.)
Source: https://docs.oracle.com/javase/8/docs/api/java/util/ArrayList.html
How to sort and reverse ArrayList in Java
LinkedList
LinkedList 的常用方法如下
示例如下
Vector
vector 与 ArrayList 极其相似,但它拥有更多的方法:
void ensureCapacity(int minCapacity);
123456 Vector v = new Vector();v.ensureCapacity(22); // ensuring capacity// cheking capacitySystem.out.println("Minimum capacity: " + v.capacity()); // 22boolean equals(Object o)
1234567891011121314151617181920 Vector v1 = new Vector();v1.add(1);v1.add(2);v1.add("Future");v1.add("Googler");v1.add(4);// second vectorVector v2 = new Vector();v2.add(1);v2.add(2);v2.add("Future");v2.add("Googler");v2.add(4);if(v1.equals(v2)){System.out.println("both vectors are equal");}void trimToSize()
This method trims the capacity of this vector to be the vector’s current size.
值得注意的是该方法:
替换的对象在第一个参数,索引位置在第二个参数
Stack
Stack 作为一种数据结构,其特点是后进先出 (Last In First Out)。Java 也提供了该数据结构的封装。
其方法主要有如下几种:push(Object element)
, pop()
, peek( )
, empty()
, search(Object element)
示例如下
Stack 还有一种比较有趣的应用,这种数据结构可以用来配对括号或HTML标签
Stack 配对括号
比如在数学表达式中,会有很多圆括号,中括号,大括号
Parentheses: “(“ and “)”
Braces: “{“ and “}”
Brackets: “[“ and “]”
每一个开括号都必须与一个对应的闭括号匹配
如 [(1 + x) / (1 + y)] + 5 中 “[“ 与 “]” 要匹配
我们来看如下几个例子:
正确:()(()){([{}])}
正确:()({)()
错误:(
错误:()(){]
如何运用 Stack 的 LIFO 特点来实现匹配括号的功能呢,思路如下:
从左到右扫描,遇到开括号 push 进 Stack,遇到对应的闭括号 pop 掉,如果最后 Stack 为空,说明这是一个有效的表达式
既然我们可以判断一个数学表达式是否是有效的
那当然也可以计算该数学表达式的值
给定一个数学表达式,如:(1 + ((2 + 3) * (4 * 5)))
, 如何计算呢
E.W.Dijistra 在1960年代想出了一种算法,使用两个 Stack,思路如下:
Push operands onto the operand stack
Push operators onto the opertor stack
Ingore left parantheses
On encountering a right parenthesis,pop an operator, pop the requisite number of operands, and push onto the operand stack the result of applying that operator to those operands
Java 代码实现如下
Reference: Algorithms (4th edition) (Page 128 - Page 129)
Stack 配对 HTML 标签
|
|
关于 List 接口的讨论就到这里,以上内容如有疏漏或不足之处,欢迎与我讨论:
邮箱:entropy714@gmail.com
微信:cobain0714
Reference:
- Geeksforgeeks
- Oracle 官方文档
- Data Structure and Algorithms in Java (7th edition) (Page 235 - Page237)