grammer skills
- 变长二维数组转定长
int[][] res = new ArrayList<>().toArray(new int[res.size()][]);
compile&runtime
- 不要用有参构造函数
- 使用移位操作代替乘除法
1
2
3
4a/4 == a >> 2
a/8 == a >> 3
a×4 == a << 2
a×8 == a << 3 - 引用类型转换为字符串最好使用toString(),String.valueof()其次,不要使用new String(),也不要使用数字+“”来转化字符串!!!
- 类上申明final
- for使用如下方式
- 复制数组使用System.arraycopy()
- 对象应该多重用
- list, map, set, StringBuilder应设定初始值
- 顺序插入和随机访问使用arraylist,删除和随机插入使用linklist,无序使用set
- 对象比较使用Objects.equals
- 使用栈和队列时,使用linklist(插入,删除)或arraydeque(随机访问),接口为deque
- Collections.reverseOrder()(比较器)可以反转有序集合(list,queue等)
- 遍历map的几种方式
1
2
3
4
5
6
7
8
9
10
11
12如果只是获取key,或者value,推荐使用keySet或者values方式
// KeySet 获取key
public void testKeySet() {
for (Integer key : map.keySet()) {
System.out.println(key);
}
} // values 获取value
public void testValues() {
for (Integer value : map.values()) {
System.out.println(value);
}
}1
2
3
4
5
6
7
8
9如果同时需要key和value推荐使用entrySet
public void testEntry() {
for (Map.Entry<Integer, Integer> entry : map.entrySet()) {
System.out.println(entry.getKey() + ":" + entry.getValue());
}
}
public void testLambda() {
map.forEach((key, value) -> { System.out.println(key + ":" + value); });
}1
2
3
4
5
6
7
8
9如果需要在遍历过程中删除元素推荐使用Iterator
public void testIterator() {
Iterator<Map.Entry<Integer, Integer>> it = map.entrySet().iterator();
while (it.hasNext()) {
Map.Entry<Integer, Integer> entry = it.next();
System.out.println(entry.getKey() + ":" + entry.getValue());
//it.remove(); 删除元素
}
}如果需要在遍历过程中增加元素,可以新建一个临时map存放新增的元素,等遍历完毕,再把临时map放到原来的map中
- 加速读取数据
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48public static class FastIO {
BufferedReader reader;
StringTokenizer tokenizer;
void init(InputStream inputStream) {
reader = new BufferedReader(new InputStreamReader(inputStream));
tokenizer = new StringTokenizer("");
}
//读入一个字符串
String next() {
while (!tokenizer.hasMoreTokens()) {
try {
tokenizer = new StringTokenizer(reader.readLine());
} catch (IOException e) {
e.printStackTrace();
}
}
return tokenizer.nextToken();
}
//读入一整行
String nextLine() {
while (!tokenizer.hasMoreElements()) {
try {
tokenizer = new StringTokenizer(reader.readLine());
} catch (IOException e) {
e.printStackTrace();
}
}
return tokenizer.nextToken("\n");
}
//读入int类型数据
int nextInt() {
return Integer.parseInt(next());
}
//读入double类型数据
double nextDouble() {
return Double.parseDouble(next());
}
} - Character.getNumericValue(char ch)
获取Unicode对应int,即char->int - HashSet的add方法可以判断是否重复放元素
1
for(int i=0,length = list.length; )
- 获取整数位数
1
2
3
4
5num = num > 0 ? num : -num;
if (num==0) {
return 1;
}
return (int) Math.log10(num)+1;reduce mem
- 批量创建对象是使用clone方法
- 尽量使用局部变量