在做项目的时候经常用到ArrayList、HashMap,但很少系统地去看过Java集合的知识,今天把《疯狂Java讲义》上 的相关内容看了一遍,做如下整理,以便记忆。发现有找工作的压力在,能静下心来看好多以前看不进去的东西。
集合里只能保存对象,确切说是保存对象的引用变量。
一、记住两个集合框架的根接口:Collection和Map。各接口下需要掌握的子接口或类如下:
Collection:Set(HashSet)、List(ArrayList、Vector)、Queue(ArrayDeque、LinkedList)
Map:HashMap、HashTable
二、Collection接口部分方法
boolean add(Object o)
boolean addAll(Collection c)
void clear()
boolean contains(Object o)
boolean isEmpty()
Interator interator()
boolean remove(Object o) //调用对象的equals()方法比较,返回true则删
int size()
Object[] toArray()
三、遍历Collection(在遍历时不能改变集合元素,否则会引发ConcurrentModificationException异常)
1、Lambda表达式 1.8
2、Iterator接口 1.2
3、foreach 1.5
四、Set
1、HashSet
- 元素排列顺序可能和添加顺序不同
- 线程不安全
- 集合元素值可以为null
- 判断元素相等的标准是equals()方法比较相等,hashCode()方法返回值相等。如果需要重写equals()、hashCode()方法的规则:如果equals()返回true,hashCode值也应该相同。
- 封装了动态的Object[]数组
- 线程不安全
- 底层数组长度为10
- 长度增加 *1.5
- 封装了动态的Object[]数组
- 线程安全
- 底层数组长度为10
- 长度增加 *2
- 可以设置增加的步长
- 子类Stack用于模拟数据结构“栈”(性能较差,可以选择用ArrayDeque实现栈)
2、ArrayDeque 双端队列
- 底层数组长度为16
- 作为栈时的实现代码
stack.push(e1);
stack.push(e2);
stack.push(e3);
System.out.println(stack.peek());
System.out.println(stack.pop());
- 作为队列时的实现代码
ArrayDeque queue= new ArrayDeque();
queue.offer(e1);
queue.offer(e2);
queue.offer(e3);
System.out.println(queue.peek());
System.out.println(queue.poll());
- ArrayDeque同时作为栈、队列使用时,对头对应栈顶。(其实就是把push当成offerFirst)
3、LinkedList
- 同时实现了List接口和Deque接口,所以既能根据索引随机访问集合中的元素,也能当成双端队列使用(栈、队列)
- 内部以链表实现,所以插入、删除性能比较好
- 遍历使用迭代器Iterator
七、Map(key集实际就是set集合)
1、基本方法
- void clear()
- Object get(Object key)
- boolean isEmpty()
- Set keySet()
- Object put(Object key, Object value)
- void putAll(Map m)
- Object remove(Object key)
- int size()
2、HashMap
- 线程不安全
- 允许使用null作为key、value
- key相等的标准:equals()返回true,hashCode相等
- value相等的标准:equals()返回true
3、Hashtable
- 线程安全
- 不允许使用null作为key、value,不然会引发空指针异常
- key相等的标准:equals()返回true,hashCode相等
- value相等的标准:equals()返回true
八、操作集合的工具类Collections
1、将指定集合包装成线程同步的集合
Collections.synchronizedXXX()
2、主要对List集合进行排序、查找、替换
附:
由于泛型主要应用在集合中,所以在这里一起记下了:
- 泛型的设计原则:在编译时没有提出“未经检查的转换”警告,则程序在运行时不会引发ClassCastException
- 自定义泛型类Apple<T>,此时构造器名还是Apple。可以把泛型类看做逻辑上的子类,物理上并不存在
- 类型通配符 List<?>,一般在做方法的形参但不知道具体传入参数的类型时使用