目录

力扣易错:Java 语法

TreeSet

红黑树实现的平衡二叉搜索树。

  • ceiling(x): 想象对 x 向上取整,返回的是大于等于 x 的最小值。
  • floor(x): 想象对 x 向下取整,返回的是小于等于 x 的最大值。
    特别容易记混。

TreeMap

  • floorKey()floorEntry() 返回的是key小于等于x的最大值所对应的key或Entry,如果没有返回 null。同理还有 ceilingKey()ceilingEntry()

String & StringBuilder

  • 字符串的比较一定是 equals
  • 字符串中字符个数是 length() 方法,数组中的个数是 length 属性,集合中的个数是 size() 方法。
  • 字符串中取字符 char,用 charAt(index) 方法,如果要遍历,那么可以用 toCharArray() 方法然后使用 for each 方式。
  • 把字符数组char[] 转换为 StringString.valueOf(char[]) 方法。
  • 把字符数组char[] 转换为 Character[].chars().mapToObj(c -> (char) c).toArray(Character[]::new) 方法【注意chars()方法生成 IntSream】,然后才能用 Arrays.stream(T[]) 使之成流 Stream<Character>
  • 把字符流 Stream<Character> 转换为 StringcharStream.map(String::valueOf).collect(Collectors.joining())方法,实际上是把字符转换成字符串然后连接。
  • 把字符串中的字符排序:先生成字符数组,再用数组排序方法,最后转化为字符串,即char[] chars = s.toCharArray(); Arrays.sort(chars); String sortedS = String.valueOf(chars);
  • 收集字符结果然后返回字符串,这种一般用 StringBuilder 就可以了,注意添加要用 append() 方法,字符数量要用 length()方法,【外星文字典】。
  • StringBuilder 可以添加 char !这意味着,对其他的 String,可以直接用 toCharArray() 后遍历。
  • 如何控制打印保留的小数点后的位数,使用 String.format("%.2f", doubleNum),Python也有类似的:print('{:.2f}.format(1.1234)')

Character

  • Java 中字符一定是单引号,别老用双引号! ‘a’ ‘0’
  • 判断一个字符是否为数字:Character.isDigit(c),但这个比较普遍,不仅包含'0’这种,还有其他Unicode数字字符

LinkedList / ArrayDeque

实现了 DequeQueue 接口,因此一些方法的含义要清楚,一般在后面操作元素都要加 Last。

队列:后面 offer 前面 poll 后面 pollLast 前面 offerFirst
栈:前面 push 前面 pop

可以画一张图,标注这些方法,然后灵活使用:

  • 循环中,不能用集合的 size 判断,因为你在循环中改变了集合的大小,因此它是动态变化的
  • LinkedList 可以加入 null 值,而 ArrayDeque 却不行!这一点在我做二叉树的序列化的时候深有体会。

HashMap

  • 继承了 Map 那么就有 getOrDefault 方法可用,还有putIfAbsent方法可用!。
  • values() 方法可以获得所有值组成的 Collection ,但是如果题目要的是 List ,则需要使用 new ArrayList<>(Collection) 方法。
  • containsKey(): 跟 HashSet 的contains()要区别开啊。HashMap 还有一个 containsValue() 方法。【屡屡犯错】
  • 如何遍历里面的元素?
    • entrySet() 方法获取所有 Map.Entry<K, V> 对象,然后使用该对象的 getKey()getValue()setValue(V) 方法
    • keySet() 方法获取所有的键,然后通过键来访问所有对象。

Integer

  • 注意 parseInt(Stirng) 是将字符串转成整数,而 intValue(Integer) 才是将 Integer 转成 int,一般在将 Collection 转成 int[] 的时候会用到:stack.stream().mapToInt(Integer::intValue).toArray()
  • 注意啊,对象之间的比较,即使是 Integer,那也得 equals 啊,否则 == 比较的是引用地址……

List

  • List 转 int[] : stack.stream().mapToInt(Integer::intValue).toArray();
  • List 转 Integer[]: stack.toArray(new Integer[0]);
  • int[] 转 Integer[]: Arrays.stream(data).boxed().toArray(Integer[]::new);
  • int[] 转 List: Arrays.stream(data).boxed().collect(Collectors.toList())
  • Integer[] 转 int[]: Arrays.stream(integers1).mapToInt(Integer::intValue).toArray();
  • Integer[] 转 List: Arrays.asList(integers1);

Stream

  • 排序用的是 sorted() 方法。
  • 转换成 T[] 数组用的是 toArray() 方法。
  • Java 8 使用 Stream 的 skiplimit API 来跳过流中的元素,以及限制流中元素的个数,同样可以达到 SubList 切片的目的1

Collections

  • java 工具类,可以对一个集合逆序:Collections.reverse(list)

Math

  • 取对数,以2为底是 log(double) 返回 double,以10为底是log10(double),返回double

System.out.println

  • System.out.println(l + " " + r) 出来的结果是字符串,但是 System.out.println(l + ' ' + r) 结果是一个整数(l、r都是整数)!

Arrays

  • 初始化数组,使得其中每个元素都为 -1,直接调用方法:Arrays.fill(int[], int)
  • 可把一个对象数组转成固定长度的List,Arrays.asList(Integer[]),并且对List的更改会映射到原来的数组。注意如果传入的是 int[] 那么只会将 int[]对象作为List的元素!!!警惕!!!1
    • 不能直接使用 Arrays.asList 来转换基本类型数组。其原因是:Arrays.asList 方法传入的是一个泛型 T 类型可变参数,最终 int 数组整体作为了一个对象成为了泛型类型 T。
    • Arrays.asList 返回的 List 不支持增删操作Arrays.asList 返回的 List 并不是我们期望的 java.util.ArrayList,而是 Arrays 的内部类 ArrayList。查看源码,我们可以发现 Arrays.asList 返回的 ArrayList 继承了 AbstractList,但是并没有覆写 addremove 方法。
    • 对原始数组的修改会影响到我们获得的那个 ListArrayList 其实是直接使用了原始的数组。
    • 解决方法都很简单,重新 new 一个 ArrayList 初始化 Arrays.asList 返回的 List 即可List list = new ArrayList(Arrays.asList(arr));

PriorityQueue

  • 里面要是传入比较器,可以直接用Comparator.comparingInt(x -> x.val)

遍历

  • Java List 容器可以使用 for-each 循环,也能使用 forEach 方法。

运算符优先级

  • + - 要高于 位运算 << >> >>> 高于 & | ^
  • 一算移关羽,异或集三福:括号级别最高,逗号级别最低,单目 > 算术 > 位移 > 关系 > 逻辑 > 三目 > 赋值。 简书文章

继承

  • 子类是不继承父类的构造器(构造方法或者构造函数)的,它只是调用(隐式或显式)。如果父类的构造器带有参数,则必须在子类的构造器中显式地通过 super 关键字调用父类的构造器并配以适当的参数列表。
  • 如果父类构造器没有参数,则在子类的构造器中不需要使用 super 关键字调用父类构造器,系统会自动调用父类的无参构造器。

递归

  • 写递归函数你记得三部曲吗?非常关键的终止条件,可千万不能忘啊,如果栈溢出,首先想想是不是无限循环了,终止条件有没有?

正则

  • 别在 [] 字符类里面搞或的逻辑,或该由 | 来,用|一定要用()来限定边界。

约定

  • 哨兵:dummy
  • 快慢指针:fast slow
  • 前后指针:front back
  • 左右指针:left right
  • 乘积:product
  • 除法 division 除数 divisor 被除数 dividend 商 quotient 余数 remainder
  • 加减乘除:addition, subtraction, multiplication and division
  • 面积:area
  • 前一个 当前的 后一个:prev curr next
  • 基准:pivot
  • 差值:diff(difference)
  • 小数:decimal
  • 进位 carry 加法位 addPos