java中HashMap和HashTable的比较

On 八月 12, 2011, in 技术记录, by pensz

1 HashMap 和 HashTable 都是通过链接法解决碰撞

通过链接法解决碰撞,点击放大图片

链接解决碰撞,摘自算法导论第二版135页


2 HashMap 的hash函数更加牛一些,另外支持null的key(这其实是一个支不支持的问题)

3 javadoc中写道:除了不同步和允许使用 null 之外,HashMap 类与 Hashtable 大致相同。从具体代码来看,HashMap代码的方法前面没有加synchronized,而HashTable的方法前面加了synchronized;另外,HashTable不支持null是“全面”的,key 和 value都不能为null

4 HashMap计算key对应的bucket(桶)所使用取模算法中,HashMap是二进制的 & (table.length – 1),而HashTable 是 % table.length,显然HashMap更加牛些

5 HashMap的查找,插入性能更加好,因为它中间会对key的hashCode再做一次hash,使其尽量均匀分布,而HashTable基本依赖于key的hashCode()

选择的原则:尽量使用HashMap,如果有同步方面的需求,自己可以在外面做控制。

Tagged with:  

java字符集小记

On 七月 28, 2011, in 技术记录, by pensz

该blog整理自我的笔记,可能比较乱。

1 String.getBytes(String charset) 方法:是将string 以 charset来编码,同一个string 可以以很多不同的charset来编码,得到的Byte数组也是不一样的。

2 new String (byte[], String charset) 这个是将byte数组里面的数据以charset来解码,这里很容易出现乱码,原因就是charset选择不对。
3 为什么会存在 以下代码转码的情形:

String utf8 = new String (a.getBytes(“8859_1″), “gb2312″);

原因是:首先 a 从人类角度来看是乱码了; 再次,a之前是以8859_1来编码的,后来发现真实的编码应该是 gb2312。其中的 a.getBytes(“8859_1″)只是为了获得最初的byte[],如果你有最初的byte[],完全不需要通过a.getBytes(“8859_1″)来获得。

String a = new String (bo.toByteArray(), “8859_1″);

String correct = new String (a.getBytes(“8859_1″), “gb2312″);

上面这段代码等于

String correct = new String (bo.toByteArray(), ”gb2312″);

4 java 里面的string是没有charset一说的,都是以unicode来保存的。

5 关于servlet,jsp里面的乱码问题
5.1 request.setCharacterEncoding(String) 是对request 的 body的解码有用,故设置这个对解决GET参数里面的乱码没有用;l另外需要注意浏览器发送请求的原始编码是否正确
5.2 response.setCharacterEncoding(String) 声明一下编码即可保证输出正确的编码;需要注意的是:必须要在getWriter前设置。详情可以参考 javadoc:
This method can be called repeatedly to change the character encoding. This method has no effect if it is called after getWriter has been called or after the response has been committed.
6 如何检测编码?
检测编码就是计算这一组字节在各个字符集上解码的可读性,选择可读性最高的那个编码为最终的编码,所以这件事情也不是那么简单的。
当然,utf8 bom时会有一些特殊byte可以判断。
对于html来说,简单的方法是看http header和html中声明的编码。
Tagged with:  

java io类小结

On 五月 8, 2011, in 技术记录, by pensz
  1. 以 Writer Reader 结尾的类是text file相关的,既然与text file相关,那么必然有charset的概念, 暂存数组就是char[];
  2. 以 InputStream OutputStream 结尾的类都是binary file相关的,与charset无关,暂存数组就是byte[];
  3. 以 Buffered类开头的类都是用来做buffer用的,不考虑效率问题,可以从来不使用这些类;
  4. 以 File开头的类都是与File相关的,其他的场景,想都不用想了,都写文件,先想想File开头的类;
  5. PrintWriter 比 FileWriter更加通用。
Tagged with: