关于java的各种集合

 

1.HashSet内置了一个HashMap,将对象保存为HashMap的key,复用HashMap的算法来保证对象不可重复

但当创建时有第三个参数boolean dummy时,就用LinkedHashMap来管理 

HashSet(int initialCapacity, float loadFactor, boolean dummy) {

map = new LinkedHashMap<E,Object>(initialCapacity, loadFactor);

    }

2.ArrayList是用数组实现的

LinkedList用链表实现,使用内部类内置了一个Entry

3.HashMap有一个内部类用来管理key和value的映射,Entry有参数next、previous来指向下一个或上一个entry,key和value来存储键和值。

4.创建HashMap时可以

public HashMap(int initialCapacity, float loadFactor)

initialCapacity是初始HashMap的大小(HashMap也是有数组维护的),loadFactor默认是0.75表示Map的维度,当已存储的数据数大

于总数组容量的0.75时,即总容量广大一倍。loadFactor可大可小,当较大时,数组扩充的频率低,但构建哈希表时冲突会更多,而

更慢;较小时,数组扩充频率高,但构建哈希表会更快,插入数据也会更快。

5.LinkedHashMap继承了HashMap,也是用数组存储数据,它之所以叫Linked,因为它维护了3个对象(head(最顶端的元素),before(之前的元素),after(之后的元素)),虽然也继续了父类的next和previous,但基本没有使用。

6.java有个特点就是序列化,简单地来说就是可以将这个类存储在物理空间(当然还是以文件的形式存在),那么当你从本地还原这个文件时,你可以将它转换为它本身。这可以极大地方便网络上的一些操作,但同时,因为涉及到安全问题,所以并不希望把类里面所有的东西都能存储(因为那样,别人可以通过序列化知道类里面的内容,比如密码),那么我们就可以用上transient这个关键字,它的意思是临时的,即不会随类一起序列化到本地,所以当还原后,这个关键字定义的变量也就不再存在。

7.Hashtable也是一个Map,不过它是从jdk1.0就存在的,Map是1.2才有的,后来HashTable应该有过修改,使得它也实现了Map接口,但它仍然继承了虚类Dictionary,它也是从jdk1.0就存在的,用来存储这种键-值对应关系的对象集。但接口无限优于继承,所以自从Map接口出来以后,Dictionary就成了一个obsolete(废弃)类,而jdk以后出来的Map比如HashMap就都是实现Map接口。

8.Hashtable和HashMap基本功能相同,不同点是,它们创建哈希表用的算法不同,Hashtable还是线程安全的,它的第一个方法前都有synchronized标识,而且HashMap保存的对象的key和value都可以分别为空,但Hashtable两个都不能为空。

HashMap: if (key == null)

            return putForNullKey(value);

Hashtable:if (value == null) {

   //当key为null时,由于上面的putForNullKey方法,所以调用key.hashcode()时也会抛出空指针异常

   throw new NullPointerException();

}

9.ArrayList和Vector都是用数组来维护的,其中,Vector是同步的;它们和合快速访问和查找,但由于数组之间是不能有空隙的,当该数组空间不够时,需要创建另一个更大的数组再把数据拷过去,所以会很浪费时间。LinkedList是用链表维护,里面的每个对象都有一个到下一个对象的引用,所以不需要提前申请空间。适合快速插入和遍历,但不适合随机查找。

10.LinkedList封装了一些别的list没有的方法,可以作为队列、和双向列表使用。(其实用栈可以用Vector的子类Stack),放在头部(addFirst=push),放在尾部(addLast=offer),取出尾部(removeLast),取出头部(pop=removeFirst)。(具体参考Deque接口的api,对queue和stack的各个方法都有说明)。

11.LinkedList在1.5及以前的版本实现了Queue接口,使其可以当作队列,在1.6以后,实现了Deque接口(继承了Queue接口,但它是个双向列表)。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值