Linkedlist

1.extneds AbstractSequentialList, implements List<E>, Deque<E>, Cloneable, java.io.Serializable  ,element,peek

2.双向链表,header链表头,size大小

3.按下标访问元素—get(i)/set(i,e) 遍历链表将指针移动到位(如果i>数组大小的一半,会从末尾移起),

get set 优化后的线程时间O(n),add,remove,只需要改变指针

4.相对于arraylist需要更耗内存,创建Entry对象

ArrayDeque

1.基于动态数组实现的,双端,双端指针

HashMap

1.继承abstractMap,实现Map,Serializable,Cloneable,序列化通过,writeObject,readObject 方法实现

2.先线性安全,默认容量和加载因子16,0.75,数组resize为原来的两倍,伴随着rehash操作,支持键值null,key为null,存储在第一个bucket中

3.链表法解决哈希冲突,

4.通过modcount成员变量支持fail-fast规则,迭代器抛出ConcurrentModificationException异常

5.get put, put 根据k的hashcode值确定 数组下标,再根据k.hashcode,k比较,是否相同,相同则返回旧值,否则新增,再判断是否超过阈值,超过容量变为两倍

6.indexFor(hash, table.length)按位与 数组长度&

hashCode是native方法,对每一个不同的java环境来说,同一个key所计算的hashCode是不相同的,所以反序列化后table的index会发生变化,无法还原

HashMap的bullet存在null数据,如果对这部分数据进行序列化则造成不必要的资源浪费。

transient使用小结

  • transient关键字只能修饰变量,变量如果是用户自定义类变量,则该类需要实现Serializable接口。
  • 被transient关键字修饰的变量不再能被序列化,一个静态变量不管是否被transient修饰,均不能被序列化。

总结

    • 当父类继承Serializable接口时,所有子类都可以被序列化。
    • 子类实现了Serializable接口,父类没有,父类中的属性不能被序列化(不报错,数据不会丢失),但是在子类中的属性仍能正确序列化
    • 如果序列化的属性是对象,则这个对象也必须实现Serializable接口,否则会报错。
    • 在反序列化时,如果对象的属性有修改或删减,则修改的部分属性会丢失,但不会报错。
    • 在反序列化时,如果serialVersionUID被序列化,则反序列化时会失败
    • static,transient修饰后的变量不能被序列化

与hashTable区别

  1. HashMap非线程安全的,并可以支持键值为null,而Hashtable非线程安全的,key和value都不能为null
  2. Hashtable和HashMap默认的容量和resize方式不同。HashTable中hash数组默认大小是11,增加的方式是 old*2+1。HashMap中hash数组的默认大小是16,而且一定是2的指数。
  3. hashMap的迭代器(Iterator)是fail-fast迭代器,而Hashtable的enumerator迭代器。

  HashMap可以通过下面的语句进行同步:Map m = Collections.synchronizeMap(hashMap);
  

LinkedHashMap

1.继承HashMap,实现Map接口

2.通过hash表加双向链表实现,依靠着双向链表实现迭代顺序为插入顺序或者访问顺序,倒序;LRU缓存,先线性安全

package collections;

import java.util.Map;

public class LRUCache {

    private int capacity;
private Map<Integer, Integer> cache; public LRUCache(final int capacity) {
this.capacity = capacity;
this.cache = new java.util.LinkedHashMap<Integer, Integer> (capacity, 0.75f, true) {
// 定义put后的移除规则,大于容量就删除eldest
protected boolean removeEldestEntry(Map.Entry<Integer, Integer> eldest) {
return size() > capacity;
}
};
} public int get(int key) {
if (cache.containsKey(key)) {
return cache.get(key);
} else
return -;
} public void set(int key, int value) {
cache.put(key, value);
}
}

Collections.sort()

加强型归并排序

Linkedlist,arrayDeque,HashMap,linkedHashMap的更多相关文章

  1. Java中HashMap,LinkedHashMap,TreeMap的区别[转]

    原文:http://blog.csdn.net/xiyuan1999/article/details/6198394 java为数据结构中的映射定义了一个接口java.util.Map;它有四个实现类 ...

  2. ArrayList、LinkedList、HashMap的遍历及遍历过程中增、删元素

    ArrayList.LinkedList.HashMap是Java中常用到的几种集合类型,遍历它们是时常遇到的情况.当然还有一些变态的时候,那就是在遍历的过程中动态增加或者删除其中的元素. 下面的例子 ...

  3. HashMap,LinkedHashMap,TreeMap对比

    共同点: HashMap,LinkedHashMap,TreeMap都属于Map:Map 主要用于存储键(key)值(value)对,根据键得到值,因此键不允许键重复,但允许值重复. 不同点: 1.H ...

  4. JDK 源码分析(4)—— HashMap/LinkedHashMap/Hashtable

    JDK 源码分析(4)-- HashMap/LinkedHashMap/Hashtable HashMap HashMap采用的是哈希算法+链表冲突解决,table的大小永远为2次幂,因为在初始化的时 ...

  5. JDK源代码学习-ArrayList、LinkedList、HashMap

    ArrayList.LinkedList.HashMap是Java开发中非常常见的数据类型.它们的区别也非常明显的,在Java中也非常具有代表性.在Java中,常见的数据结构是:数组.链表,其他数据结 ...

  6. Java HashMap,LinkedHashMap,TreeMap

    Java为数据结构中的映射定义了一个接口java.util.Map;它有四个实现类,分别是HashMap Hashtable LinkedHashMap 和TreeMapMap主要用于存储健值对,根据 ...

  7. HashMap,LinkedHashMap和Hashtable类的深入剖析与理解

    上一篇文章写了一些关于HashMap以及HashMap的线程安全问题,这篇文章再来说说Map系列中HashMap,LinkedHashMap和Hashtable三者之间的差异以及该注意的地方. Has ...

  8. java HashMap,LinkedHashMap,TreeMap应用

    共同点: HashMap,LinkedHashMap,TreeMap都属于Map:Map 主要用于存储键(key)值(value)对,根据键得到值,因此键不允许键重复,但允许值重复. 不同点: 1.H ...

  9. Java从入门到放弃18---Map集合/HashMap/LinkedHashMap/TreeMap/集合嵌套/Collections工具类常用方法

    Java从入门到放弃18—Map集合/HashMap/LinkedHashMap/TreeMap/集合嵌套/Collections工具类常用方法01 Map集合Map集合处理键值映射关系的数据为了方便 ...

随机推荐

  1. NeHe OpenGL教程 第三课:颜色渲染

    转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线 ...

  2. python urllib模块的urlopen()的使用方法及实例

    Python urllib 库提供了一个从指定的 URL 地址获取网页数据,然后对其进行分析处理,获取想要的数据. 一.urllib模块urlopen()函数: urlopen(url, data=N ...

  3. A^B问题

    题目:输入包括两个正整数 A 和 B(1 <= A, B <= 10000),A 和 B 之前用空格隔开 ★数据输出 输出一行,若 A ^ B < 10000,则直接输出结果(不包含 ...

  4. dbs:apple-notes

    ylbtech-dbs:apple-notes -- =============================================-- apple_备忘录-- auhtor:Yuanbo ...

  5. Maven如何手动添加依赖的jar文件到本地Maven仓库

    大家肯定遇到过想在pom文件中加入自己开发的依赖包,这些包肯定是不是在Maven仓库(http://repo1.maven.org/maven2/)的.那我们怎么将那些不存在Maven仓库中的包加入到 ...

  6. FBI传授9秘诀:如何看穿对方在撒谎 z

    第1招:不提及自身和姓名 美国赫特福德郡大学的心理学家韦斯曼说,〝人们在说谎时会本能地把自己从他们所说的谎言中剔除出去〞.所以如果你向某人提问时,他们总是反覆地省略〝我〞,他们就有被怀疑的理由了.反过 ...

  7. Failed to create the java virtual machine完全解决办法

    一直用EcliPSe开发java,突然有这么一天,无法启动了,splash窗口显示“Failed to create the Java Virtual Machine”,结果发现eclipse和mye ...

  8. 支付宝&腾讯的OpenID之路

         10年前上网很简单,那时我只用记住三个账号:QQ.21cn邮箱和中国联众.10年后的今天,应用或服务层次不穷:盛大网游.淘宝.豆瓣.人人.微博……太多的账号和密码我已经没办法记住.如果有一个 ...

  9. [Java] java中的接口定义

    在Java的通常规范中,对数据成员的修改要通过接口提供的方法进行(如下面示例中接口中的void learnMath(int hours)和void learnEnglish(int hours)),这 ...

  10. Inno Setup安装、卸载时判断是否程序正在运行

    var ErrorCode: Integer; IsRunning: Integer; // 安装时判断客户端是否正在运行 function InitializeSetup(): Boolean; b ...