API
算法
Arrays
填充
代码块收起展开
Arrays.fill(arr, begin, end, val); //左闭右开数据结构
String
- str.charAt(int)->返回char, 若直接作数组下标即为ASCII
List
1.1 基本API
add(E e):尾部追加add(int index, E e):在指定位置插入,后面的整体右移get(int index):按下标读set(int index, E e):覆盖写,长度不remove(int index)/remove(Object o):一个删位置,一个删值
代码块收起展开
list.remove(1); // 删的是下标 1
list.remove(Integer.valueOf(1)); // 才是删元素 1size():长度isEmpty():是否为空
1.2 三种遍历方式
- for 下标循环:
可控、最安全,删除时要注意下标回退或倒序遍历。 - 增强 for (
for (E e : list)):
只读视角,禁止结构性修改,否则直接ConcurrentModificationException。 - Iterator:
唯一官方允许的“遍历中删除”方式,用it.remove(),不是list.remove()。
代码块收起展开
Iterator<Integer> it = list.iterator();
while (it.hasNext()) {
if (it.next() == 3) { //必须先next再remove
it.remove(); //remove()只能删“最近一次 `next()` 返回的元素”
}
}
Iterator<Integer> it = list.iterator();
while(it.hasNext()){
...
Integer curr = it.next(); //会返回当前元素值
}1.3 批量操作
addAll(Collection c):拼接removeAll(Collection c):差集retainAll(Collection c):交集containsAll(Collection c):包含关系判断 我认为retainAll特别适合表达“保留合法元素集合”这种语义,比手写循环更不容易出 bug。
1.4 查找相关
contains(Object o):是否存在indexOf(Object o)/lastIndexOf(Object o):第一次 / 最后一次出现的位置 注意一点:这些都是线性扫描,在ArrayList上是 O(n)。如果你在刷题里频繁查存在性,那大概率结构选错了,应该换Set或Map。
1.5 具体实现类
1.5.1 ArrayList
初始化
代码块收起展开
new ArrayList<>();
new ArrayList<>(int initialCapacity);
new ArrayList<>(Collection<? extends E> c);//Arrays.asList(...)1.5.2 LinkedList: 双向链表
实现了List<E>, Deque<E>, Queue<E>三个接口, 既能当 List 用,也能当队列、当双端队列用
初始化
代码块收起展开
//Integer
LinkedList<Integer> list = new LinkedList<>(Arrays.asList(1, 2, 3)); //注意只能是引用数据类型
//int类型
int[] a = {1, 2, 3};
LinkedList<Integer> list = new LinkedList<>();
for (int x : a) list.add(x);作为双端队列:
代码块收起展开
addFirst(E e)
addLast(E e)
removeFirst()
removeLast()
getFirst()
getLast()
offer(E e) // 入队(尾)
poll() // 出队(头)
peek() // 看头,不删offer & poll 和add / remove 的区别不在逻辑,而在失败策略:
add / remove:失败抛异常offer / poll:失败返回false / null刷题里我建议你统一用offer / poll / peek,更稳。
HashMap
computeIfAbsent()
注意这个API调用之后返回的是value
代码块收起展开
default V computeIfAbsent(K key, Function<? super K, ? extends V> mappingFunction) {
Objects.requireNonNull(mappingFunction);
V v;
V newValue;
if ((v = (V)this.get(key)) == null && (newValue = (V)mappingFunction.apply(key)) != null) {
this.put(key, newValue);
return newValue;
} else {
return v;
}
}getOrDefault()
代码块收起展开
map.getOrDefault(key,defaultNum); // 有则得val, 无则得defaultmap.entrySet
代码块收起展开
for ( Map.Entry<Integer, String> entry : map.entrySet()) {
Integer key = entry.getKey();
String value = entry.getValue();
}
//java8
map.forEach((key, value) -> {
System.out.println(key + " -> " + value);
});
//可以直接set entry的value
for (Map.Entry<Integer, String> entry : map.entrySet()) {
if (entry.getKey() == 1) {
entry.setValue("NEW");
}
}
/* 不允许遍历时删除
for (Map.Entry<Integer, String> entry : map.entrySet()) {
if (entry.getKey() == 1) {
map.remove(entry.getKey()); // ❌ ConcurrentModificationException
}
}*/
//要用迭代器
Iterator<Map.Entry<Integer, String>> it = map.entrySet().iterator();
while (it.hasNext()) {
Map.Entry<Integer, String> entry = it.next();
if (entry.getKey() == 1) {
it.remove(); // ✅ 正确
}
}
PriorityQueue<>()
- 初始化
PriorityQueue
pq = new PriorityQueue<>( (a,b)->a-b ) 增加元素 pq.offer() 会加入null值的节点, 所以加入时要判断