-
- 泛型机制:
- 泛型是Java SE 5.0引入的特性,泛型的本质是参数化类型。在类、接口和方法的定义过程中,所操作的数据类型被传入的参数指定。
-
- Iterator迭代器
- 迭代器用于遍历集合元素。获取迭代器可以使用Collection定义的方法: iterator()
- 迭代器Iterator是一个接口,集合在重写Collection的iterator()方法时利用内部类提供了迭代器的实现。
遍历方式:
hasNext()
next()
remove()
在使用迭代器遍历集合时,不能通过集合的remove方法删除集合元素,否则会抛出并发更改异常。我们可以通过迭代器自身提供的remove()方法来删除通过next()迭代出的元素。
forEach循环:增强for循环
Java5.0之后推出了一个新的特性,增强for循环,也称为新循环。该循环不通用于传统循环的工作,其只用于遍历集合或数组。
- 在编译过程中,编译器会将新循环转换为迭代器模式。所以新循环本质上是迭代器。
- 集合操作 -线性表
- List
- List接口是Collection的子接口,用于定义线性表数据结构。可以将List理解为存放对象的数组,只不过其元素个数可以动态的增加或减少。
- List接口的两个常见实现类为ArrayList和LinkedList,分别用动态数组和链表的方式实现了List接口。
- 可以认为ArrayList和LinkedList的方法在逻辑上完全一样,只是在性能上有一定的差别。ArrayList更适合于随机访问而LinkedList更适合于插入和删除。在性能要求不是特别苛刻的情形下可以忽略这个差别。
ArrayList和LinkedList
两者的数据结构
get和set:
get(int index):获取集合中指定下标对应的元素,下标从0开始。
set(int index, E elment):将给定的元素存入给定位置,并将原位置的元素返回。
插入和删除:
void add(int index,E element):
将给定的元素插入到指定位置,原位置及后续元素都顺序向后移动。
remove(int index):
删除给定位置的元素,并将被删除的元素返回。
List转换为数组:
- List的toArray方法用于将集合转换为数组。但实际上该方法是在Collection中定义的,所以所有的集合都具备这个功能。
- 其有两个方法:
Object[] toArray()
<T>T[] toArray(T[] a)
其中第二个方法是比较常用的,我们可以传入一个指定类型的数组,该数组的元素类型应与集合的元素类型一致。返回值则是转换后的数组,该数组会保存集合中所有的元素。
数组转换为List:
- Arrays类中提供了一个静态方法asList,使用该方法我们可以将一个数组转换为对应的List集合。
- 并且要注意的是,返回的集合我们不能对其增删元素,否则会抛出异常。并且对集合的元素进行修改会影响数组对应的元素。
-
- List排序
- Collections是集合的工具类,它提供了很多便于我们操作集合的方法,其中就有用于集合排序的sort方法。
- 该方法定义为: void sort(List<T> list)
该方法的作用是对给定的集合元素进行自然排序。
Comparable:
- Collections的sort方法是对集合元素进行自然排序,那么两个元素对象之间就一定要有大小之分。这个大小之分是如何界定的?实际上,在使用Collections的sort排序的集合元素都必须是Comparable接口的实现类,该接口表示其子类是可比较的,因为实现该接口必须重写抽象方法:
- int compareTo(T t);
该方法用于使当前对象与给定对象进行比较。
-
- 若当前对象大于给定对象,那么返回值应为>0的整数。
- 若小于给定对象,那么返回值应为<0的整数。
- 若两个对象相等,则应返回0。
案例:
一个集合中存放的是学生对象,现对集合进行排序,排序规则按照学生的年龄排序
Comparator:
- 一旦Java类实现了Comparable接口,其比较逻辑就已经确定;如果希望在排序的操作中临时指定比较规则,可以采用Comparator接口回调的方式。
- Comparator接口要求实现类必须重写其定义的方法:int compare(T o1,T o2)
-
- 队列和栈
LinkedList,此类实现了Deque接口,Deque接口又继承了Queue
Queue:
java.util.Queue
* 队列,可以存储一组元素,但是存取元素必须
* 遵循先进先出原则(FIFO,First Input First Output)
队列(Queue)是常用的数据结构,可以将队列看成特殊的线性表,队列限制了对线性表的访问方式:
只能从线性表的一端添加(offer)元素,从另一端取出(poll)元素。
队列遵循先进先出(FIFO First Input First Output )的原则。
JDK中提供了Queue接口,同时使得LinkedList实现了该接口
(选择LinkedList实现Queue的原因在于Queue经常要进行添加和删除的操作,而LinkedList在这方面效率较高)。
方法:
Offer(E e):将一个对象添加至队尾,如果添加成功则返回true。
poll(): 从队首删除并返回一个元素。
peek():返回队首的元素(但并不删除)。
Deque:
- Deque是Queue的子接口,定义了所谓“双端队列”即从队列的两端分别可以入队(offer)和出队(poll),LinkedList实现了该接口。
方法:
Offer(E e)
offerFirst(E e)
offerLast(E e)
poll()
pollFirst()
pollLast()
- 如果将Deque限制为只能从一端入队和出队,则可实现“栈”(Stack)的数据结构,对于栈而言,入栈称之为push,出栈称之为pop。
- 栈遵循先进后出(FILO First Input Last Output )的原则。