1. charArray toString
    char[] 直接toString 得到的会是一个像这样的[C@6a2437ef序列,所以还是用这个方法:String.valueOf。这让我想到之前有道题(Anagram),我先将string变成char[],排序,然后放在hash表中,最后发现比较的时候明明两个相同的char[]就是不能相等,才发现这个问题。用String.valueOf解决,当初还想过序列化。(详见这道题的笔记)
  2. float vs double, int vs long
    float是单精度,4 bytes, 小数点后6-7位;double双精度, 8 bytes, 小数点后15位。Java中默认浮点数类型为double,所以如果直接写成 float af = 0.3444 会报错,应该写成 float af = 0.344f, 或者float af = (float)0.344.同理是int 和 Long,默认定点数类型是int所以定义的时候也需要加上32L表示Long类。
    转换
    xxx.[Target]Value 这个方法用来转换类型很常用,比如float to int, af.intValue(). 但是使用int时要注意,这是一个类的方法,定义成int i是没办法是用的,必须变成Integer i (Integer 与 int 的区别)。
    强制转换与精度 低精度向高精度可以直接强制转换,反之则会面临精度丢失的问题,一般用BigDeceimal解决。
  3. HashMap的遍历
  4. boolean[] bool数组默认都是false.有时候hashset, hashmap空间太大可以考虑试试bool数组
  5. Arrays.binarySearch是二分法查找,但它的返回值是(-(插入点) - 1), 这个在有一道Google的题里面很巧妙地用到了。binarySearch didn't find
  6. 关于原码补码反码有一篇很棒的文章:true code, complementary code, ones-complementary code
  7. Iterator
    举个栗子,iterator用于遍历Collection. Collection中主要有set, queue, list。本来可以直接for遍历,但是这样耦合度太高,为了表现“能够访问collection又不暴露其具体的细节”,而产生了用一个iterator来遍历的想法。Collection继承了Iterable接口,从而可以通过构建一个Iterator = list.iterator(), 继而通过对这个新建的iterator访问来遍历list. Iterator有三个方法: hasNext(), next(), remove(). 一般这样用while(next()) {next()...}, remove()删除当前next()得到的元素。Iterator用在Flatten类型的题目中:一般要考虑cursor来指定当前位置,或者是两个queue/stack来存放当前位置
  8. Collection里面的细分类
    先贴一个很好的介绍Collection大家族。可以简单来说,Array存储的是基本类型(primitive)并且大小固定,Collection存储任意类型并且可以自动扩容。Collection是个大家族,里面包括List, Queue, Set, Deque... 而以Queue为例,它仅仅是一个接口,可以用LinkedList或者PriorityQueue来实现。具体关系看下面这张大图:Collection大家族,Map大家族,Array
  9. StringBuilder
    归纳一下StringBuilder的常见方法:1)构造:一般是空着构造或者可以直接赋值(char, boolean, string...) 2)append(object) 3) delete(start, end) deleteCharAt 4) indexOf 5) insert 6) reverse 7) toString (* 有时候连用很好用,比如reverse().toString())
  10. HashMap的空间优化
    代表题目(Leetcode 387), 有时候可以考虑用一个很大的整形数组来优化hashmap的空间问题(256)。将hashmap的key值(如果可以int化)存为int[key] = value的形式,甚至可以更优化为bit型

刘牟默
11 声望4 粉丝

霸道java娇俏C