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. cmd命令行给main传参数

    int main(int argc, char **argv) { cout << "arguments passed to main() : " << e ...

  2. socket 发送发送HTTP请求

    socket方式: $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP); //socket_set_option($socket, SOL_S ...

  3. JAVA 对象初始化的过程

    对象初始化的过程例:Student S    =    new Student();1.因为new Student()用到了Student类,所以会把它从硬盘上加载进入内存2.如果有static静态代 ...

  4. MySql中的变量定义

    根据mysql手册,mysql的变量分为两种:系统变量和用户变量.但是在实际使用中,还会遇到诸如局部变量.会话变量等概念.根据个人感觉,mysql变量大体可以分为四种类型: 一.局部变量. 局部变量一 ...

  5. 2015 年最棒的 5 个 HTML5 框架

    大多数的 web 开发者一直在用关键点来寻找动态的框架,这样能简化他们的设计和开发工作.HTML5 框架在所有的 web 浏览器和手机应用上都展现了优秀的性能.它不仅简化了 HTML5 开发中 CSS ...

  6. NLP学习资源

    Journals  ACM Transactions on Information Systems (TOIS) 影响因子 5.059(2006) IEEE Transactions on Knowl ...

  7. js中使用s(c)标签

    在js或者jquery中使用s标签,其实并不难理解,s标签也只是一个标签而已,当你想象成js+s标签=js+html标签就理解了 例如: <script type="text/java ...

  8. [Other] 自定义MIME类型支持FLV的相关设置

    刚测试知道为何服务器无法播放flv的原因,特此记录而已. 网络空间支持FLV的相关设置,就是自定义一个MIME类型,一般虚拟主机管理里面都有这个选项 自定义MIME类型 扩展名: .flv MIME类 ...

  9. shell local

    Shell函数定义的变量默认是global的,其作用域从"函数被调用时执行变量定义的地方"开始,到shell结束 http://blog.chinaunix.net/xmlrpc. ...

  10. ArcGIS栅格数据的合并和剪切

    ArcGIS栅格数据的合并和剪切 1.  合并:ArcToolBox-- àDataManagement--à Raster--àRaster Dataset--à Mosaic 或 Mosaic t ...