力扣易错: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[]转换为String用String.valueOf(char[])方法。 - 把字符数组
char[]转换为Character[]用.chars().mapToObj(c -> (char) c).toArray(Character[]::new)方法【注意chars()方法生成IntSream】,然后才能用Arrays.stream(T[])使之成流Stream<Character>。 - 把字符流
Stream<Character>转换为String用charStream.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
实现了 Deque 和 Queue 接口,因此一些方法的含义要清楚,一般在后面操作元素都要加 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 的
skip和limitAPI 来跳过流中的元素,以及限制流中元素的个数,同样可以达到 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,但是并没有覆写add和remove方法。- 对原始数组的修改会影响到我们获得的那个
List。ArrayList其实是直接使用了原始的数组。 - 解决方法都很简单,重新
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