List,Set,Map的特性与比较

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时,结果会按元素插入的次序显示。

扩容

  • ArrayList:
    int newCapacity = oldCapacity + (oldCapacity >> 1);  //1.5被扩容
    
    扩容:将src源数组中从第srcPos位置的数值开始,到length长度位置的数值结束。覆盖到dest数组中,超出dest数组长度,会报ArrayIndexOutOfBoundsException。
    System.arraycopy(Object src, int srcPos, Object dest, int destPos, int length)
    

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。专为解决特殊问题而设计。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值