0. 数据多了为方便存储就出现了对象, 对象多了也需要存储, 有两种存储方式: 数组、集合.
1. 为什么出现集合类?
答: 面向对象语言对事物的体现都是以对象的形式, 所以为了方便对多个对象的操作, 就对对象进行存储, 集合就是存储对象最常用的一 种方式.
2. 数组和集合类都是容器, 有何不同?
答: 数组长度固定, 集合长度可变; 数组中只能存储同种类型的对象, 集合存多种.
3. 集合类框架:
这个看着乱, 先看个Collection及其衍生的吧! (老毕手绘*)
4. 集合框架的共性方法(Collection<E>接口的):
- 添加
- add(E e): 添加元素.
- addAll(Collection<? extends E> c): 添加一个集合.
- 删除
- remove(Object o)
- removeAll(Collection<?> c)
- clear(): 清空集合.
- 判断
- contains(Object o): 包含.
- containsAll(Collection<?> c)
- isEmpty()
- 获取
- iterator(): 获取迭代器.
- size(): 获取元素个数.
- 其他
- retainAll(Collection<?> c): 交集. 返回boolean值.
- toArray(): 集合变数组, 返回Object[].
- toArray(T[] t): 存入t.
5. 迭代器(Iterator):
import java.util.ArrayList;
import java.util.Iterator;
public class Test2 {
public static void main(String[] args) throws InterruptedException {
ArrayList al = new ArrayList();
al.add("asd");
al.add("xxx");
Iterator it = al.iterator(); //获取迭代器, 用于取出元素
while(it.hasNext())
System.out.println(it.next());
}
}
6. * 集合有Collection和Map接口. 其中Collection又有List(列表)和Set(集)子接口.
- List: 元素可以重复, 有序(指存入和取出的顺序一致), 有索引.
|-- Vector: 线程安全的ArrayList.
|-- ArrayList: 底层使用数组数据结构. 查改快, 增删慢. 线程不安全.
|-- LinkedList: 底层使用链表结构. 增删快, 查改慢.
- Set: 元素不能重复, 无序(值存入和取出的顺序不一定一致), 没索引.
|-- HashSet: 底层数据结构是哈希表(存入对象时, 先判断hashCode()得到的值, 如果一样, 再用equals()方法比较, 再相同就当做同一个元素, 不相同就在同一个位置上串联着存两个元素.). 线程不安全. 存取速度快.
|-- TreeSet: 底层数据结构是二叉树. 线程不安全. 可以对Set集合中的元素进行排序(通过compareTo或者compare()方法来保证元素的唯一性.).
7. List集合的共性方法: 大多是与index有关的.
- 增
- add(index, element)
- addAll(index, Collection)
- 删
- remove(index)
- 改
- set(index, element)
- 查
- get(index)
- subList(from, to)
- * listIterator()
8. 列表迭代器ListIterator:
- ListIterator是Iterator的子接口.
- 在迭代时, 不能用集合对象的方法操作集合中的元素, 否则会发生ConcurrentModificationException异常.
所以, 迭代时只能用迭代器的方法操作元素, 但是Iterator方法有限(只能判断、取出、删除), 如有更多要求, 就要使用子接口ListIterator.
9. LinkedList特有方法:
- 增
- addFirst(e)和offerFirst(e): 查的, 说addXxx是继承自List的, offerXxx是来自Queue.
- addLast(e)和offerLast(e)
- 获取: 获取,但不删除元素。
- getFirst()和peakFirst(): 如果集合为空, 前者抛异常, 后者获取null.
- getLast()和peakLast(): 同上
- 删: 获取,且删除元素。
- removeFirst()和pollFirst(): 如果集合为空, 前者抛异常, 后者获取null.
- remove()和poll(): 同上
- removeLast()和pollLast(): 同上
10.* ArrayList和LinkedList分别什么时候用?
答: 一般只有元素多, 且增删频繁, 用LinkedList.
否则一般(涉及增删, 又涉及改查)用ArrayList.
11. TreeSet的排序方式:
- 第一种: 让元素自身具备比较性. 元素需要实现comparable接口, 覆盖compareTo方法. 这种方式也称为元素的自然顺序, 或者叫做默认顺序.
- 第二种: 当元素自身不具备比较性, 或者具备的比较性不是所需的时, 就需要让集合自身具备比较性.
12. 泛型: 用于解决安全问题,是一个类型安全机制。
13. 泛型的好处:
- 更安全让运行时问题减少, 更安全.
- 将运行时期出现问题ClassCastException,转移到了编译时期. 方便于程序员解决问题.
- 避免了强制转换麻烦.
14. 泛型格式:
通过<>来定义遥操作的引用数据类型.
- 定义类时, 放在类名之后.
- 定义方法是, 放在返回值之前修饰符之后.
15. 什么时候定义泛型类?
答:* 当类中要操作的引用数据类型不确定的时候. 早期定义Object来完成扩展, 现在定义泛型来完成扩展.
16. 静态方法泛型:
静态方法不可以访问类上定义的泛型. 如果静态方法操作的应用数据类型不确定, 可以将泛型定义在方法上.
17.* 泛型限定:
- <?>: 代表任意类型.
- <? extends Person>: 代表Person及其子类型. 上限.
- <? super Person>: 代表Person及其父类型.