Java加强编译运行

grammer skills

  • 变长二维数组转定长

    int[][] res = new ArrayList<>().toArray(new int[res.size()][]);

    compile&runtime

  • 不要用有参构造函数
  • 使用移位操作代替乘除法
    1
    2
    3
    4
    a/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
    48
    public 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
    5
    num = num > 0 ? num : -num;       
    if (num==0) {
    return 1;
    }
    return (int) Math.log10(num)+1;

    reduce mem

  • 批量创建对象是使用clone方法
  • 尽量使用局部变量
文章目录
  1. 1. grammer skills
  2. 2. compile&runtime
  3. 3. reduce mem