文章目录
关系图
原理
List、Set、Map的区别?
List接口存储一组有序可重复的对象集合;
Set存储一组无序不可重复的对象集合;
Map存储具有映射关系的键值对的集合
ArrayList与LinkedList的区别?
ArrayList:存放Object对象的可变长数组
LinkedList:双向链表,因为它实现了Deque接口和List接口
Vector:类似于LinkedList,它的大部分方法都包括synchronized关键字,它是线程安全的。可以由两个线程安全地访问同一个Vector对象,但是同一个线程访问Vector的话代码要在同步上耗费大量的时间。
-
线程安全:ArrayList和LinkedList都是不同步的,不保证线程安全
-
效率:ArrayList支持按索引快速随机访问,LinkedList不支持;插入和删除时间复杂度为O(n),LinkedList仅为o(1)
-
内存占用:LinkedList每个元素比ArrayList更占空间,因为需要存放前驱和后继节点。
HashMap
LinkedList
集合的方法
Collection API
Stack类
方法 | 功能 |
---|---|
boolean empty() | 测试堆栈是否为空 |
Object peek( ) | 查看堆栈顶部的对象,但不从堆栈中移除它 |
Object pop( ) | 移除堆栈顶部的对象,并作为此函数的值返回该对象 |
Object push(Object element) | 把项压入堆栈顶部 |
boolean add(Object element) | 把项压入堆栈顶部 |
int search(Object element) | 返回对象在堆栈中的位置,以 1 为基数 |
LinkedList
链表
HashSet
方法 | 功能 |
---|---|
boolean add(E e) | 如果指定的元素尚不存在,则将其添加到此集合中 |
boolean remove(Object o) | 如果存在,则从该集合中移除指定的元素 |
boolean contains(Object o) | 如果此set包含指定的元素,则返回 true |
boolean isEmpty() | 如果此集合不包含任何元素,则返回 true |
int size() | 返回此集合中的元素数(基数) |
void clear() | 从该集中删除所有元素 |
Iterator iterator() | 返回此set中元素的迭代器 |
Object clone() | 返回此 HashSet实例的浅表副本:未克隆元素本身 |
List接口类
- 遍历元素除了使用 for循环+get(), 还用迭代器
Iterator it=list.iterator();
while(it.hashNext()){
System.out.println(it.next());
}
void add(int index, Object element);
// 将元素插入到List集合的索引处
boolean addAll(int index, Collection c);
// 将集合c中的所有元素插入到List集合的索引处
Object get(int index);
// 返回索引处元素
int indexOf(Object o);
// 返回o在List集合中第一次出现的位置索引
int lastIndexOf(Object o);
// 返回o在List集合中最后一次出现的位置索引
Object remove(int index);
// 删除并返回index索引处的元素
Object set(int index, Object element);
// 将索引处的元素替换成element对象,返回被替换的旧元素
List subList(int fromIndex, int toIndex);
// 返回从索引fromIndex到索引toIndex(左闭右开区间)处所有集合元素组成的子集合
Map接口类
方法 | 功能 |
---|---|
void clear() | 删除Map对象中的所有key-value对 |
Object put(Object key, Object value) | 向集合中添加key-value对,若已有相等key的key-value对则会覆盖已有的key-value对 |
void putAll(Map m) | 将来自指定Map中的key-value对复制到本Map中 |
Object remove(Object key) | 删除指定key对应的key-value对,返回被删除key所关联的value对;若该key不存在,返回null |
boolean remove(Object key, Object value) | 删除指定key、value所对应的key-value对;成功删除返回true,否则返回false |
boolean containsKey(Object key) | 查询Map中是否包含指定的key,包含则返回true |
Set entrySet() | 返回Map中包含的key-value对所组成的Set集合,每个集合元素都是Map.Entry(Entry是Map的内部类)对象 |
Object get(Object key) | 返回指定key所对应的value;若不包含该key,则返回null |
boolean isEmpty() | 判断集合元素个数是否为0 |
Set keySet() | 返回该Map中所有key组成的Set集合 |
int size() | 返回该Map中的key-value对数量 |
Collection values() | 返回该Map中所有value组成的Collection集合 |
Object getKey() | 返回该Entry里包含的key值 |
Object getValue() | 返回该Entry里包含的value值 |
Object setValue(V value) | 设置该Entry里包含的value值,并返回新设置的value值 |
HashMap
方法 | 功能 |
---|---|
void clear() | 删除 hashMap 中的所有键/值对 |
Object clone() | 复制一份 hashMap |
boolean isEmpty() | 判断 hashMap 是否为空 |
int size() | 计算 hashMap 中键/值对的数量 |
V put() | 将键/值对添加到 hashMap 中 |
void putAll() | 将所有键/值对添加到 hashMap 中 |
putIfAbsent() | 如果 hashMap 中不存在指定的键,则将指定的键/值对插入到 hashMap 中。 |
V remove() | 删除 hashMap 中指定键 key 的映射关系 |
boolean containsKey() | 检查 hashMap 中是否存在指定的 key 对应的映射关系。 |
boolean containsValue() | 检查 hashMap 中是否存在指定的 value 对应的映射关系。 |
replace() 替换 | hashMap 中是指定的 key 对应的 value。 |
replaceAll() | 将 hashMap 中的所有映射关系替换成给定的函数所执行的结果。 |
V get() | 获取指定 key 对应对 value |
getOrDefault() | 获取指定 key 对应对 value,如果找不到 key ,则返回设置的默认值 |
forEach() | 对 hashMap 中的每个映射执行指定的操作。 |
Set<Map.Entry<K,V>> entrySet() | 返回 hashMap 中所有映射项的集合集合视图。 |
Set keySet() | 返回 hashMap 中所有 key 组成的集合视图。 |
Collection values() | 返回 hashMap 中存在的所有 value 值。 |
merge() | 添加键值对到 hashMap 中 |
compute() | 对 hashMap 中指定 key 的值进行重新计算 |
computeIfAbsent() | 对 hashMap 中指定 key 的值进行重新计算,如果不存在这个 key,则添加到 hasMap 中 |
computeIfPresent() | 对 hashMap 中指定 key 的值进行重新计算,前提是该 key 存在于 hashMap 中。 |
集合的算法题
用两个栈实现队列
用两个栈,栈A 模拟队列的元素入列,栈A的栈顶是队列元素入列的位置,当需要元素出列时,需要获取栈A的栈顶。因此用栈B倒序存放栈A的所有元素,栈A的栈底元素变成了栈B的栈顶元素,因此可以获取栈B的栈顶元素即为队列的出队元素。所以每次队列appendTail时,栈A push元素,栈B无操作。队列deleteTail时,如果栈B有元素,则pop出栈B的栈顶元素;否则,看栈A的情况,栈A没有元素则队列为空返回-1,有元素则将栈A 的所有元素依次pop出来再push到栈B,最后弹出栈B的栈顶元素即为队列的头元素。
package com.atguigu.com;
import java.util.Stack;
public class CQueue {
private Stack<Integer> stackA;
private Stack<Integer> stackB;
public CQueue() {
stackA = new Stack<>();
stackB = new Stack<>();
}
void appendTail(int value){
stackA.push(value);
}
int deleteHead(){
if(!stackB.isEmpty()){
return stackB.pop();
}
if(stackA.isEmpty()){
return -1;
}
while(!stackA.isEmpty()){
stackB.push(stackA.pop());
}
return stackB.pop();
}
public static void main(String[] args) {
// 测试
CQueue cQueue = new CQueue();
cQueue.appendTail(2);
cQueue.appendTail(3);
System.out.println(cQueue.deleteHead());
cQueue.appendTail(4);
System.out.println(cQueue.deleteHead());
System.out.println(cQueue.deleteHead());
System.out.println(cQueue.deleteHead());
System.out.println(cQueue.deleteHead());
}
}