关于Java类的hashCode和equals方法

前面两篇文章中提到了利用哈希表的数据结构,如HashMap,HashSet等,这些数据结构利用对象的hashCode和equals函数来识别对象是否相同,原则如下:
* hashCode不同的对象一定不同
* hashCode相同的对象不一定相同
比方说HashMap,查找元素时,会先以key的hashCode来查找,如果找到对象,然后再以equals方法来判定是否相等,如果相等,才返回相应的value。
自定义数据结构做key时,需要成对的实现两个函数才可以正确的使用利用哈希表实现的数据结构。

Java中HashSet, TreeSet, LinkedHashSet区别

三个结构都实现了Set接口,不允许含有重复元素。
* HashSet是用哈希表实现的,增删查的复杂度都是O(1),不能保证元素的顺序
* TreeSet是用一个树形结构实现(红黑树),增删查的复杂度为O(log(n)),维护一个排序的Set,可以用 first(), last(), headSet(), tailSet()等获取最大最小的元素。
* LinkedHashSet是用链表+哈希表实现,因为是Linked,所以可以保持插入的顺序,增删查复杂度都是O(1)

Java中ArrayList,Vector,LinkedList区别

三种结构都实现了Collection接口和List接口。而LinkedList还实现了Queue接口。
内部实现区别:
* ArrayList可以理解为一个可变长度数组,特点是内存连续,随机访问快,插入、删除慢,扩展容量时,每次增加原容量的50%;
* Vector可以理解为线程安全的ArrayList,扩展容量时,每次容量翻倍;
* LinkedList实现上为一个双向链表,随机访问慢,插入、删除快。
refrence: http://www.programcreek.com/2013/03/arraylist-vs-linkedlist-vs-vector/

JAVA volatile关键字特性备忘

  1. 对volatile变量的读写有一个全局的排序,但是volatile变量跟常规变量的读写顺序没并没有保证
  2. volatile的值不会被缓存,所有线程读取到的都是当前的(主存中的)值
  3. 对volatile的变量的读写好像是用了synchronized包围起来一样