字符串 - String

  1. // 返回指定下标的字符,从 0 开始计算
  2. char charAt(int index);
  3. // 返回指定范围的字符串,从 0 开始,不包含右边界
  4. String substring(int beginIndex, int endIndex);
  5. // 可用于对字符串的按位处理
  6. char[] arr = s.toCharArray();
  7. String s = new String(arr);

字符串拼接,和加法相比,性能有 10 倍提升。

  1. StringBuilder sb = new StringBuilder();
  2. sb.append(?);
  3. sb.toString();

数学运算

  1. // 常用边界值
  2. Integer.MAX_VALUE;
  3. Integer.MIN_VALUE;
  4. // 字符串转换为数字
  5. Integer.valueOf('1');
  6. // 大小比较
  7. Math.max(a, b);
  8. Math.min(a, b);
  9. // 如果想保留小数位,可以使用浮点数计算
  10. 5 / 2.0

数组操作

数组初始化

  1. // 如果初始化赋值了的话,就不需要指定维度
  2. int[] arr = new int[]{1,2};
  3. // 如果没有初始化值,则需要指定维度
  4. int[] arr = new int[8];

Arrays 工具类:

  1. // 正序排序
  2. Arrays.sort(intervals, (o1, o2) -> o1[0] - o2[0]);
  3. sort(T[] a, Comparator<? super T> c);
  4. // toIndex 不包含
  5. void sort(short[] a, int fromIndex, int toIndex) {
  6. // 给数组填充默认值
  7. Arrays.fill(T[], defaultValue);
  8. // 数据拷贝
  9. int[] copyOf(int[] original, int newLength) {
  10. // 二分查找,如果有重复值,无法保证返回哪一个
  11. 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 常见操作:
image.png

优先队列
详情见: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 = ' ';

// 但做标记量的时候,建议使用醒目的标志,防止失误