hashCode 和 equals 方法继承自 根类 Object,如果你用自定义的类当作 key 的话,要相当小心,按照散列函数的定义,如 果两个对象相 同,即 obj1.equals(obj2)=true,则它们的 hashCode 必须相同,但如果两个 对象不同,则它们的 hashCode 不一定不同,如 果两个不同对象的 hashCode 相同,这种 现象称为冲突,冲突会导致操作哈希表的时间开销增大,所以尽量定义好的 hashCode()方 法,能加快哈希 表的操作。 如果相同的对象有不同的 hashCode,对哈希表的操作会出现意想不到的结果(期待的 get 方法返回 null) , 要避免这种问题, 只需要牢记一条: 要同时复写 equals 方法和 hashCode 方法,而不要只写其中一个。 Hashtable 是同步的。 HashMap 类 HashMap 和 Hashtable 类似,不同之处在于 HashMap 是非同步的,并且允许 null, 即 null value 和 null key。,但是将 HashMap 视为 Collection 时(values()方法可返回 Collection),其迭代子操作时间开销和 HashMap 的容量成比例。因此,如果迭代操作的 性能相当重要的话,不要将 HashMap 的初始化容量设得过高,或者 load factor 过低。 WeakHashMap 类 WeakHashMap 是一种改进的 HashMap,它对 key 实行“弱引用”,如果一个 key 不再 被外部所引用,那么该 key 可以被 GC 回收。 总结 如果涉及到堆栈,队列等操作,应该考虑用 List,对于需要快速插入,删除元素,应该 使用 LinkedList,如果需要快速随机访问元素,应该使用 ArrayList。 如果程序在单线程环境中,或者访问仅仅在一个线程中进行,考虑非同步的类,其效率 较高,如果多个线程可能同时操作一个类,应该使用同步的类。 要特别注意对哈希表的操作,作为 key 的对象要正确复写 equals 和 hashCode 方法。 尽量返回接口而非实际的类型,如返回 List 而非 ArrayList,这样如果以后需要将 ArrayList 换成 LinkedList 时,客户端代码不用改变。这就是针对抽象编程。 同步性 Vector 是同步的。这个类中的一些方法保证了 Vector 中的对象是线程安全的。而 ArrayList 则是异步的, 因此 ArrayList 中的对象并 不是线程安全的。因为同步的要求会影响执行的效 率,所以如果你不需要线程安全的集合那么使用 ArrayList 是一个很好的选择,这样可以避 免由于同步带 来的不必要的性能开销。 数据增长 从内部实现机制来讲 ArrayList 和 Vector 都是使用数组(Array)来控制集合中的对象。 当你向 这两种类型中增加元素的时候,如果元素的数目 超出了内部数组目前的长度它们都需要扩 展内部数组的长度,Vector 缺省情况下自动增长原来一倍的数组长度,ArrayList 是原来的 50%,所以最 后你获得的这个集合所占的空间总是比你实际需要的要大。 所以如果你要在集 合中保存大量的数据那么使用 Vector 有一些优势, 因为你可以通过设置集合的初 始化大小 来避免不必要的资源开销。 使用模式 在 ArrayList 和 Vector 中, 从一个指定的位置 (通过索引) 查找数据或是在集合的末尾增加、 移除一个元素所花费的时间是一样的,这个时间我们用 O(1)表示。但是,如果在集合的其 他位置增加或移除元素那么花费的时间会呈线形增长:O(n-i),其中 n 代表集合中元素的个 数, i 代表元素增加或移除 元素的索引位置。 为什么会这样呢?以为在进行上述操作的时候 集合中第 i 和第 i 个元素之后的所有元素都要执行位移的操作。这一切意味着什么呢? 这意味着,你只是查找特定位置的元素或只在集合的末端增加、 移除元素,那么使用 Vector 或 ArrayList 都可以。如果是其他操作,你最好选择其他 的集合操作类。比如,LinkList 集 合类在增加或移除集合中任何位置的元素所花费的时间都是一样的?O(1),但它在索引一个 元素的使用缺比较慢 -O(i),其中 i 是索引的位置.使用 ArrayList 也很容易, 因为你可以简单 的使用索引来代替创建 iterator 对象的操作。LinkList 也 会为每个插入的元素创建对象,所 有你要明白它也会带来额外的开销。 最后,在《Practical Java》一书中 Peter Haggar 建议使用一个简单的数组(Array)来代 替 Vector 或 ArrayList。 尤其是对于执行效率要求高的程序更应如此。 因为使用数组 (Array) 避免了同步、额外的方法调用和不必要的重新分配空间的操作。 相互区别 Vector 和 ArrayList 1,vector 是线程同步的,所以它也是线程安全的,而 arraylist 是线程异步的,是不安全的。 如果不考虑到线程的安全因素,一般用 arraylist 效率比较高。 2,如果集合中的元素的数目大于目前集合数组的长度时,vector 增长率为目前数组长度的 100%,而 arraylist 增长率为目前数组长度 的 50%.如过在集合中使用数据量比较大的数据,用 vector 有一定的优势。 3,如果查找一个指定位置的数据,vector 和 arraylist 使用的时间是相同的,都是 0(1),这个 时候使用 vector 和 arraylist 都可以。而 如果移动一个指定位置的数据花费的时间为 0(n-i)n 为总长度,这个时候就应该考虑到使用 linklist,因为它移动一个指定位置的数据 所花费的时间为 0(1),而查询一个指定位置的数据时花费的时间为 0(i)。 ArrayList 和 Vector 是采用数组方式存储数据, 此数组元素数大于实际存储的数据以便增加 和插入元素, 都允许直接序号索引元素, 但是插入数据要设计到数组元素移动 等内存操作, 所以索引数据快插入数据慢,Vector 由于使用了 synchronized 方法(线程安全)所以性能 上比 ArrayList 要 差,LinkedList 使用双向链表实现存储,按序号索引数据需要进行向前或 向后遍历,但是插入数据时只需要记录本项的前后项即可,所以插入数度较快! arraylist 和 linkedlist 1.ArrayList 是实现了基于动态数组的数据结构,LinkedList 基于链表的数据结构。 2.对于随机访问 get 和 set,ArrayList 觉得优于 LinkedList,因为 LinkedList 要移动指针。 3.对于新增和删除操作 add 和 remove,LinedList 比较占优势,因为 ArrayList 要移动数据。 这一点要看实际情况的。若只对单条数据插入或删除,ArrayList 的速度反而优于 LinkedList。但若是批量随机的插入删除数 据,LinkedList 的速度大大优于 ArrayList. 因为 ArrayList 每插入一条数据,要移动插入点及之后的所有数据。 HashMap 与 TreeMap (注) 文章出处:http://www.diybl.com/course/3_program/java/javaxl/200875/130233.html 1、HashMap 通过 hashcode 对其内容进行快速查找,而 TreeMap 中所有的元素都保 持着某种固定的顺序,如果你需要得到一个有序的结果你就应该使用 TreeMap(HashMap 中元素的排列顺序是不固定的)。 HashMap 中元素的排列顺序是不固定的)。 2、 HashMap 通过 hashcode 对其内容进行快速查找,而 TreeMap 中所有的元素都 保持着某种固定的顺序,如果你需要得到一个有序的结果你就应该 使用 TreeMap (HashMap 中元素的排列顺序是不固定的)。集合框架”提供两种常规的 Map 实现: HashMap 和 TreeMap (TreeMap 实现 SortedMap 接口)。 3、在 Map 中插入、删除和定位元素,HashMap 是最好的选择。但如果您要按自然 顺序或自定义顺序遍历键,那么 TreeMap 会更好。使用 HashMap 要求添加的键类明确定 义了 hashCode()和 equals()的实现。 平衡状态。 结过研究,在原作者的基础上我还发现了一点,二树 map 一样,但顺序不一样,导致 hashCode()不一样。 同样做测试: 在 hashMap 中,同样的值的 map,顺序不同,equals 时,false; 而在 treeMap 中, 同样的值的 map,顺序不同,equals 时, true, 说明, treeMap 在 equals() 时是整理了顺序了的。 这个 TreeMap 没有调优选项,因为该树总处于 hashtable 与 hashmap 一.历史原因:Hashtable 是基于陈旧的 Dictionary 类的,HashMap 是 Java 1.2 引进的 Map 接口的一个实现 二.同步性:Hashtable 是线程安全的,也就是说是同步的,而 HashMap 是线程序不安全的, 不是同步的 三.值:只有 HashMap 可以让你将空值作为一个表的条目的 key 或 value package 练习; import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; import java.util.Hashtable; import java.util.Iterator; import java.util.LinkedList; import java.util.TreeMap; import java.util.Vector; public class Diedaijihe { public Diedaijihe(){ } void testArrayList(){ System.out.println("-------------ArrayList-------------------"); System.out.println("List类"); ArrayList al=new ArrayList(); al.add(1); al.add(2); al.add(3); al.add(4); Iterator it=al.iterator();//用迭代器将其迭代化,将其序列化为一个序列 System.out.println(al.size());//这样就可以遍历真个序列而不必关心低成结构 System.err.println(it.toString()); System.out.println("开始"); while(it.hasNext()){ System.out.println(it.next()); } } /** * vector是同步的、线程安全的、所以如果需要的是速度,并且不在多线程环境中使用,最好 * 选arrayList,arraylist是非同步,当然也不是线程安全 * 且每次vector容量的自动扩张是按照100%扩展,但是arrayList是按照50%扩展,这样 * 使用arraylist就会节省内存时间 * */ void testVector(){ System.out.println("-------------Vector---------------"); Vector vector=new Vector(); vector.add(1); vector.add(2); vector.add(3); vector.add(4); Iterator it=vector.iterator(); while(it.hasNext()){ System.out.println(it.next()); } } /* * LinkedList实现了list接口,允许null元素。