JAVA SE自学 基础篇 集合类微薄基础知识
目标
- 了解java集合框架
- 熟练使用ArrayList, LinkedList, HashSet, HashMap
- 尽可能了解这些集合类型的底层实现尤其是ArrayList和HashMap
什么是集合
- 集合 ( Collection ), 是一种容器, 装对象的.
- java集合框架在java.util包中.
colection接口是对一个线性表的抽象,不要求元素的唯一性和有序性。
List接口要求元素有序性(能通过下标访问),但不要求唯一性。
Set接口要求元素是唯一的,但不要求有序性
Map接口是对键值对(Key Value Pair)的抽象,要求Key具有唯一性。
Colection类是对集合进行各种操作的工具类/算法类
List接口
通用方法
- add (E) //添加元素到末尾
- add(int index,E obj)//插入新元素
- set(int index)//替换新元素
- remove(int index)// 移除指定元素
- contains(object)//判断集合是否包含了指定对象,内部用了equls来比较两个对象
- clear()//清空元素
- get)(intindex)//通过下标获取元素
- size()//通过下标获取元素个数
- subList(int beginIndex,int endList)//提取一段,返回list
List接口有2个典型实现类:
- getFirst()
- getLast()
- addFirst()
- addLast()
- removeFirst()
- removeLast()
Iterable接口和Iterator接口
Iterable表示可迭代的/可遍历的
Iterator表示迭代器, 它负责迭代的过程
Iterable接口中定义了iterator()方法, 作用是返回迭代器对象.
Iterator接口定义了hasNext()方法和next()方法, 前者用于判断集合中是否还有下一 个元素, 后者返回下一个元素.
Collection接口继承了Iterable接口, 所以只要是这个家族的集合, 都可以用 Iterator进行遍历.
只不过, Iterator有很多不同的实现.
泛型 ( Generic Type )
泛型, 广泛的数据类型, 它能像参数一样传递给类, 接口, 方法.
典型例子:
// what is E? 使用时传入
public interface List<E> extends Collection<E> {
void add(E e);
E get(int index);
}
public class ArrayList<E> implements List<E> {
}
List<Dog> dogs = new ArrayList<Dog>(); // 使用时, 确定了E的类型为Dog
‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐
dogs.add(Dog dog) // 这里就必须传入Dog类型的实参
Dog dog = dogs.get(0) // 这里的返回值必然是Dog类型
泛型还可以用于方法:
public static <A> A hello(A obj){}
泛型集合带来了哪些好处?
- 类型安全
- 获取集合中的对象时,不需要向下转型
扩展: ArrayList中使用Object[]存储对象, 它也没有规定具体类型. 请研究"泛型擦 除".
Map接口
- Map表示地图, 键值对(K-V)
- 一个K必然映射到一个确定的V
- K唯一!
Map的典型实现是HashMap和TreeMap.
Java 1.8 以前, HashMap的底层是数组 + 链表
Java 1.8 以后, HashMap的底层除了数组 + 链表, 还加入了红黑树 ( 二叉树的一种, 平衡二 叉树 )
Map的通用方法:
- put(K, V) // 添加键值对到map中, 如果K已存在, 覆盖其Value
- get(K) // 通过K获取V
- remove(K) // 通过K移除键值对
- containsKey(K) // 判断map中是否包含这个K
- keySet() // 返回键集, Set类型的集合
- values() // 返回值集, Collection类型的集合
注意: 如果重写了一个类的equals(), 请务必重写hashCode(), 以避免对象存储在 HashMap中产生不一致性! 要满足这样的原则:
1. 如果两个对象hashCode()不同, 那这一定是两个不同的对象, (equals = false)
2. 如果两个对象hashCode()相同, 这并不意味着equals=true
3. 如果两个对象equals为true, 那么hashCode()一定相等!
Set接口
Set如何保证元素唯一性 ? 使用Map, 把元素E当成Map的Key
典型实现有HashSet, TreeSet
经验: 以Tree开头的, 都是有序二叉树结构, 但这不意味着它有逻辑上的下标!