JAVA中各种数据结构类

队列

Queue<String> queue = new LinkedList<>();

//增加元素
queue.offer("a");

//出队,会删除队首
String result_poll = queue.poll();//空值返回null
String result_remove = queue.remove();//空值抛出异常

//展示队首第一个,不删除
String result_peek = queue.peek();//空值返回null
String result_element = queue.element();//空值返回true

Stack<String> stack = new Stack<String>();

//入栈
stack.push("a");

//出栈,会删除
String result_pop = stack.pop();

//查看栈顶第一个,不会删除
String result_peek = stack.peek();

Set Map List比较

Set,List, Map各自实现类的比较
Java中 List、Set、Map 之间的区别

在这里插入代码片

Vector、ArrayList、LinkedList的区别

  1. 基本区别:三个类都实现了List接口,都是有序集合,数据是允许重复的;ArrayList 和Vector都是基于数组实现存储的,集合中的元素的位置都是有顺序即连续的;LinkedList是基于双向链表实现存储的,集合中的元素的位置是不连续的
  2. 性能区别:Vector和ArrayList底层实现原理一致,但是Vector是线程安全的,因此性能比ArrayList差很多;LinkedList相比于集合Vector和ArrayList在插入,修改,删除等操作上速度较快,但是随机访问的性能较差
  3. 安全区别:Vector是使用了synchronized同步锁是线程安全的,ArrayList和LinkedList都是线程不安全的
  4. 原理区别:ArrayList与Vector都有初始的容量大小,当存储的元素的个数超过了容量时,就需要增加存储空间,Vector默认增长为原来两倍,而ArrayList的增长为原来的1.5倍;ArrayList与Vector都可以设置初始空间大小,Vector还可以设置增长的空间大小,而ArrayList没有提供设置增长空间的方法

HashTable HashMap

参考:https://zhuanlan.zhihu.com/p/37607299

  1. 安全上:HashMap是线程不安全的,在多线程环境下会容易产生死循环,但是单线程环境下运行效率高;Hashtable线程安全的,很多方法都有synchronized修饰,但同时因为加锁导致单线程环境下效率较低
  2. value:HashMap允许有一个key为null,允许多个value为null;而Hashtable不允许key或者value为null
  3. 构造函数上:HashMap的底层数组的长度必须为2^n,这样做的好处是为以后的hash算法做准备,而Hashtable底层数组的长度可以为任意值,这就造成了当底层数组长度为合数的时候,Hashtable的hash算法散射不均匀,容易产生hash冲突。
  4. hash算法上:Hashtable的hash算法首先使得hash的值小于等于整型数的最大值,再通过%运算实现均匀散射;;;HashMap的hash算法通过非常规的设计,将底层table长度设计为2^n(合数),这是HashMap的一处优化。由于计算机是底层的运算是基于2进制的,所以HashMap的hash算法使用&运算代替%运算,在运算速度上明显HashMap的hash算法更优。
  5. 扩容机制上:HashMap数组的扩容的整体思想就是创建一个长度为原先2倍的数组。然后对原数组进行遍历和复制。只不过jdk1.8对扩容进行优化,使得扩容不再需要进行链表的反转,只需要知道hashcode新增的bit位为0还是1。如果是0就在原索引位置,新增索引是1就在oldIndex+oldCap位置;;;Hashtable的扩容将先创建一个长度为原长度2倍的数组,再使用头插法将链表进行反序。
  6. 结构上:HashMap在jdk1.8在原先的数组+链表的结构进行了优化,将实现结构变为数组+链表+红黑树;;;Hashtable到了jdk1.8了内部结构并没有实质优化,继续使用数组+链表的方式实现
发布了45 篇原创文章 · 获赞 1 · 访问量 549

猜你喜欢

转载自blog.csdn.net/BNMZY/article/details/105083743
今日推荐