字符串 - String
// 返回指定下标的字符,从 0 开始计算
char charAt(int index);
// 返回指定范围的字符串,从 0 开始,不包含右边界
String substring(int beginIndex, int endIndex);
// 可用于对字符串的按位处理
char[] arr = s.toCharArray();
String s = new String(arr);
字符串拼接,和加法相比,性能有 10 倍提升。
StringBuilder sb = new StringBuilder();
sb.append(?);
sb.toString();
数学运算
// 常用边界值
Integer.MAX_VALUE;
Integer.MIN_VALUE;
// 字符串转换为数字
Integer.valueOf('1');
// 大小比较
Math.max(a, b);
Math.min(a, b);
// 如果想保留小数位,可以使用浮点数计算
5 / 2.0
数组操作
数组初始化
// 如果初始化赋值了的话,就不需要指定维度
int[] arr = new int[]{1,2};
// 如果没有初始化值,则需要指定维度
int[] arr = new int[8];
Arrays 工具类:
// 正序排序
Arrays.sort(intervals, (o1, o2) -> o1[0] - o2[0]);
sort(T[] a, Comparator<? super T> c);
// toIndex 不包含
void sort(short[] a, int fromIndex, int toIndex) {
// 给数组填充默认值
Arrays.fill(T[], defaultValue);
// 数据拷贝
int[] copyOf(int[] original, int newLength) {
// 二分查找,如果有重复值,无法保证返回哪一个
Arrays.binarySearch(T[] arr, int target): int;
数组列表实例:
// 原来 List 里面是可以放 T[] 对象 的
List<int[]> merged = new ArrayList<>();
// 如果输入数组足够大,则直接存放到输入对象,否则会新建返回对象,该函数的好处是可以指定返回值
// 使用方式是 instance.toArray(T[] a);
T[] toArray(T[] a);
// 获取数组长度
int size();
// 删除元素,注意是对象和下标的区别,特别是包装类型之间的自动转换,这里极容易出 BUG
boolean remove(Object o);
E remove(int index);
队列和栈
// 双向队列
Deque<TreeNode> deque = new LinkedList();
// 判断是否为空
deque.isEmpty(): boolean;
// 队列必要时候,可以使用原始的 LinkedList 对象
LinkedList<Integer> list = new LinkedList();
// 队列
Stack<E> stack = new Stack<>();
stack.push();
stack.pop();
// 查看栈顶元素,但是不弹出,为空会报错
stack.peek();
// 很特殊
stack.empty();
Deque 常见操作:
优先队列
详情见:https://time.geekbang.org/column/article/69913
建堆的复杂度接近 O(n), 插入和删除的复杂度是 O(log n),删除从顶向下转换,添加从底向上转换
// 优先队列
// 默认自然序列
PriorityQueue pQ = new PriorityQueue();
// 构造函数可以指定顺序
PriorityQueue(Comparator<? super E> comparator);
// 添加元素
public boolean add(E e);
// 为空返回 null
public E poll();
容器操作
Collections 工具类:
// Reverses the order of the elements in the specified list
public static void reverse(List<?> list);
// 排序
public static <T> void sort(List<T> list, Comparator<? super T> c);
HashMap
// 是否包含键
boolean containsKey(Object key);
// 是否包含值
boolean containsValue(Object value);
// 返回键集合
Set<K> keySet();
// 返回值集合
Collection<V> values();
HashSet
// 是否包含元素
boolean contains(Object o);
// true if this set did not already contain the specified element
boolean add(E e);
// true if the set contained the specified element
boolean remove(Object o);
// Removes all of the elements from this set.
// The set will be empty after this call returns.
void clear();
哨兵模式
- 常用于链表头的补充
- 场景:只要涉及到链表头的变化,加上 sentry 可以大大简化分类讨论的复杂度
调试语句
// 日志打印
System.out.println(String.format("%s", ));
// 打印 int 数组
public static void printArr(int[] arr, String mark) {
System.out.print(mark);
for(int i = 0; i < arr.length; i++) {
System.out.print(arr[i] + " ");
}
System.out.println();
}
暗坑
自增和自减作为函数入参
⚠️:函数入参不要轻易用自增自减,变量之间容易相互干扰,请慎重
int i = 10;
// 函数入参是 10
funtion(i++);
// 函数入参是 9
funtion(--i);
char 不能赋值空字符
// Empty character literal
char c = '';
// 而这样又是可以的
char c = ' ';
// 但做标记量的时候,建议使用醒目的标志,防止失误