List,Set,Map的特性与比较

    技术2022-07-10  125

    List,Set

    List,Set继承Collection接口

    Collection : 是最基本的集合接口,一个Collection代表一组Object,即Collection的元素。Java JDK不能提供直接继承自Collection的类,Java JDK提供的类都是继承自Collection的"子接口",如:List和Set。List : 按对象进入的顺序保存对象,不做排序或编辑操作。主要用来处理序列Set : 对每个对象只接受一次,加入Set的元素必须定义equals()方法以确保对象的唯一性,并使用自己内部的排序方法,由元素的HashCode决定,位置固定。Set与Collection有完全一样的接口。主要用来处理集

    List接口有三个实现类:LinkedList,ArrayList,Vector

    LinkedList : 底层基于链表实现,链表内存是散乱的,每一个元素存储本身内存地址的同时还存储下一个元素的地址,可以当作堆栈、队列和双向队列使用。链表增删快,查找慢ArrayList : 底层基于数组实现,查找快(另一种说话随机访问),增删慢;是非线程安全的,效率高。默认大小是 10 个元素,容量满时,按其容量的50%增加Vector : 是线程安全的,效率低 。容量满时,按其容量的一倍增长

    链表和数组的区别 创建数组必须明确说明数组的长度,(即数组中元素的个数),以便在内存中留出一块空间存放所有的数组元素,数组中各数据元素在内存中是顺序存放的. 创建链表时,不需要给出链表中元素(称为节点)的个数,可以先只创建一个链表头,其他元素在需要时动态地创建并加入到链表,链表的数据无素在内存中不是连续存放的.

    list的toArray有两个重载的方法:

    list.toArray()list.toArray(T[] a)

    Set接口有两个实现类:HashSet(底层由HashMap实现),LinkedHashSet

    TreeSet : (底层由平衡二叉树实现),实现了SortedSet接口,保存顺序HashSet : 为快速查找设计的Set。存入HashSet的对象必须定义hashCode()。LinkedHashSet : 具有HashSet的查询速度,且内部使用链表维护元素的顺序(插入的次序)。于是在使用迭代器遍历Set时,结果会按元素插入的次序显示。

    Map

    执行效率是Map的一个大问题。看看get()要做哪些事,就会明白为什么在ArrayList中搜索“键”是相当慢的。而这正是HashMap提高速度的地方 HashMap使用了特殊的值,称为“散列码”(hash code),来取代对键的缓慢搜索。“散列码”是“相对唯一”用以代表对象的int值,它是通过将该对象的某些信息进行转换而生成的。所有Java对象都能产生散列码,因hashCode()是定义在基类Object中的方法。 Map接口实现类:HashMap, TreeMap, LinkedHashMap, WeakHashMap, IdentityHashMap 有同样的基本接口Map,但是行为、效率、排序策略、保存对象的生命周期和判定“键”等价的策略等各不相同。

    Map : 基于散列表的实现,维护“键值对”的关联性,插入和查询“键值对”的开销是固定的。使你可以通过“键”查找“值”HashMap : 可以通过构造器设置容量capacity和负载因子load factor,以调整容器的性能。使用对象的hashCode()进行快速查询的,非线程安全,高效,支持null。默认大小是16个元素(必须是2的幂)。Hashtable : 线程安全,低效,不支持null // from ArrayList.java JDK 1.7 private static final int DEFAULT_CAPACITY = 10; //from HashMap.java JDK 7 static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; // aka 16

    Hashtable的原理,并说出HashMap与Hashtable的区别 HashTable的原理:通过节点的关键码确定节点的存储位置,即给定节点的关键码k,通过一定的函数关系H(散列函数),得到函数值H(k),将此值解释为该节点的存储地址.HashMap 与Hashtable很相似,但HashMap 是非同步(unsynchronizded)和可以以null为关键码的. 这两个类有许多不同的地方,下面列出了一部分: - Hashtable 是 JDK 1 遗留下来的类,而 HashMap 是后来增加的。所以Hashtable版本较HashMap版本低。 - Hashtable 是同步的,比较慢,但 HashMap 没有同步策略,所以会更快。 - Hashtable 不允许有个空的 key,但是 HashMap 允许出现一个 null key。

    TreeMap : 实现了SortedMap接口,基于红黑树结构,得到的结果是经过排序的。查看“键”或“键值对”时,它们会被排序(次序由Comparabel或Comparator决定)。TreeMap是唯一的带有subMap()方法的Map,它可以返回一个子树。LinkedHashMap : 类似于HashMap,但是迭代遍历它时,取得“键值对”的顺序是其插入次序,或者是最近最少使用(LRU)的次序。只比HashMap慢一点。而在迭代访问时反而更快,因为它使用链表维护内部次序。WeakHashMap : 弱键(weak key)Map,Map中使用的对象也被允许释放: 这是为解决特殊问题设计的。如果没有map之外的引用指向某个“键”,则此“键”可以被垃圾收集器回收。IdentifyHashMap : 使用==代替equals()对“键”作比较的hash map。专为解决特殊问题而设计。

    Processed: 0.015, SQL: 9