力扣易错: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
和limit
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
,但是并没有覆写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