
java集合
java集合,源码,重难点
多问为什么,坚持跑步
这个作者很懒,什么都没留下…
展开
-
ConcurrentHashMap & HashTable
HashMap在多线程环境下存在线程安全问题,那你一般都是怎么处理这种情况的?Collections.synchronizedMap(Map)创建线程安全的map集合;HashtableConcurrentHashMapCollections.synchronizedMap实现线程安全的你有了解过么?SynchronizedMap有一个对象Object mutex作为锁对象,所有集合方法...转载 2020-04-19 16:30:58 · 357 阅读 · 0 评论 -
LinkedHashSet源码
就4个构造方法和一个迭代器方法,构造方法全部调用父类HashSet的一个构造方法这个HashSet的构造方法是:是默认类型,紧同包可见。里面其实生成的是LinkedHashMap对象,也就是说LinkedHashSet继承自HashSet,只覆写了构造方法,返回一个LinkedHashMap对象。但却是调动的HashSet的add(),remove()等方法。 HashSet(int...原创 2020-04-09 17:51:11 · 95 阅读 · 0 评论 -
TreeSet
TreeSet底层实际是用TreeMap实现的,内部维持了一个简化版的TreeMap,通过key来存储Set的元素, 而value是一个统一的object对象,TreeSet内部需要对存储的元素进行排序,因此,我们对应的类需要实现Comparable接口。这样,才能根据compareTo()方法比较对象之间的大小,才能进行内部排序。(1) 由于是二叉树,需要对元素做内部排序。 如果要放入Tree...原创 2020-04-08 21:19:09 · 231 阅读 · 0 评论 -
LinkedHashMap源码分析
LinkedHashMap是基于HashMap,其内部的LinkedHashMap.Entry继承了HashMap.Node,并增加了一个before和一个after引用,用于指向上一个节点和下一个节点,LinkedHashMap就是利用这两个引用来记录节点插入的顺序。LinkedHashMap还维护了head和tail两个引用,用来指向双向链表的头节点和尾结点。新元素插入后,tail的afte...转载 2020-04-08 21:04:05 · 121 阅读 · 0 评论 -
HashSet
因为内部基于Hashset, 无序,不允许重复元素。HashSet会调用对象的hashCode()计算两个对象是否相等,如果不相等,添加到集合中去。如果相等,才调用对象的equals方法比较是不是真正的相等,相等则覆盖旧值。提高效率。所以HashSet集合中存储的对象需要覆写hashCode()和euqals()方法。否则可能产生重复元素,因为只要你不覆写equals()方法,就会按照地址值比...转载 2020-04-05 18:09:46 · 220 阅读 · 0 评论 -
LinkedList源码分析
属性:public class LinkedList<E> extends AbstractSequentialList<E> implements List<E>, Deque<E>, Cloneable, java.io.Serializable{ transient int size = 0; // 集合内现有的元...转载 2020-04-04 18:43:30 · 87 阅读 · 0 评论 -
TreeMap源码分析
底层数据结构:红黑树(自平衡的排序二叉树)(有序,唯一)属性public class TreeMap<K,V> extends AbstractMap<K,V> implements NavigableMap<K,V>, Cloneable, java.io.Serializable { // 如果传入了比较器,就用比较器中覆...原创 2020-04-04 18:10:51 · 107 阅读 · 0 评论 -
红黑树
什么是红黑树?红黑树是一种自平衡的二叉树,删除或添加节点后,根据不同情况,进行左旋,右旋,变色等操作,使红黑树的左子树和右子树的高度差小于或等于1。性质:1.节点是黑色或者红色2.根节点是黑色3.叶子节点是黑色(叶子节点是null节点)4.不能出现两个连续的红色节点5.从任意节点到叶子的节点的每条路径上,黑色节点数相等。(黑高)数据结构:private static final ...原创 2020-04-02 18:21:12 · 172 阅读 · 0 评论 -
comparable和comparator接口的区别
要对一个集合中的对象排序,可以采用Collections.sort(List list)方法或Collections.sort(List list, Comparator<? super T> c)方法Collections.sort(List list), 将Comparator设为null,调用list.sort(null)public static <T extends...原创 2020-03-31 23:29:28 · 150 阅读 · 0 评论 -
ArrayList源码分析
1. 成员变量public class ArrayList<E> extends AbstractList<E> implements List<E>, RandomAccess, Cloneable, java.io.Serializable { // 默认的大小,如果初始化小于10,均会变到10 private...原创 2020-03-29 17:43:03 · 92 阅读 · 0 评论 -
集合面试题
DVR原创 2020-03-24 13:32:04 · 123 阅读 · 0 评论 -
HashMap源码分析
public class HashMap<K,V> extends AbstractMap<K,V> implements Map<K,V>, Cloneable, Serializable { private static final long serialVersionUID = 362498820763181265L; // 默认初始容量,...原创 2020-03-24 17:17:48 · 78 阅读 · 0 评论 -
为什么放入HashMap的key对象要重写euqals()和hashCode()并要两个方法保持一致
为什么放入HashMap的key对象要重写euqals()和hashCode():具体参考另一篇博文:https://zhuanlan.zhihu.com/p/78249480为什么要两个方法保持一致假设两个Java对象,A和B,A和B相等, euqals()结果一样,hashCode()结果不一样。HashMap根据hashCode()计算hash码得到的数组下标不一样,放入数组的索引位置...转载 2020-03-24 16:13:41 · 288 阅读 · 0 评论 -
ArrayList和Vector区别
主要是线程安全的区别,ArrayList是非线程安全的,而Vector的所有方法都是同步的,是线程安全的,但性能低,在不保证线程安全时选择ArrayList。原创 2020-03-21 18:47:07 · 98 阅读 · 0 评论 -
ArrayList 与 LinkedList 异同
异:数据结构上:ArrayList底层数据结构是数组,而LinkedList采用的是双向链表。查找,删除,插入元素上:因为ArrayList是数组,所以查找元素的时间复杂度为O(1),删除和插入元素,需要大量的移动元素,时间复杂度为O(n)。LinkedList虽然是双向链表,但他的删除元素remove(Element e)和删除指定位置元素remove(int index),插入指...原创 2020-03-21 18:40:14 · 175 阅读 · 1 评论 -
HashMap和HashSet的区别
先说一下HashSet底层实现:HashSet是基于HashMap实现的,HashSet存储的是对象,而HashMap存储的是键值对,HashSet将对象放进HashMap的键中,所有的值都指向一个静态对象。HashSet的构造函数:HashSet有HashMap引用:看add方法:调用底层HashMap的put方法,把"张三"作为key,PRESENT作为value放在hashM...原创 2020-03-20 18:37:45 · 383 阅读 · 0 评论 -
HashMap和HashTable的区别
线程安全性:HashMap是非线程安全的,HashTable是线程安全的,它里面的大部分方法都加了synchronize。效率:HashMap由于是非线程安全的,效率要高一些。初始化容量和扩容容量不同:HashMap的初始化容量必须为2的幂次方,默认为16,如果指定的初始化大小不是2的幂次方也会让他变为2的幂次方,扩容后也变为原来的2倍;HashTable不接受初始化值,默认为11,扩容为2...原创 2020-03-20 15:54:06 · 97 阅读 · 0 评论 -
HashMap的底层实现
JDK1.8之前,HashMap的底层是数组+链表,即散列链表。HashMap首先通过key的hashCode()方法计算出key的hash值,因为hash值是范围为-XX到XX的int型数字,而HashMap的数组默认长度是16,所以肯定不能直接将int值作为数组的索引,需要扰动函数处理后得到一个适合作为数组索引的数值大小,...原创 2020-03-20 15:18:18 · 141 阅读 · 0 评论 -
HashMap的长度为什么要是2的n次方
因为当HashMap的桶数组的length为2的n次方时,hash&(length)取模操作得到的数组索引的碰撞变小。直观解释,转载自https://blog.youkuaiyun.com/sidihuo/article/details/78489820HashMap为了存取高效,要尽量较少碰撞,就是要尽量把数据分配均匀,每个链表长度大致相同,这个实现就在把数据存到哪个链表中的算法;这个算法实际...原创 2020-03-18 15:38:27 · 99 阅读 · 0 评论 -
重载与重写的区别
重载:发生在同一类中,方法名必须一样,但参数类型不同,个数不同,顺序不同,返回参数不同,访问修饰符可以不同,发生在编译阶段。java多态性的编译时多态主要指方法的重载。可以理解为:有一个做早餐的类,可以做很多种早餐,但是方法都是指做早餐,只是原料不同,做出的早餐也不同,如果在C语言中,就必须为每一种做早餐的方法取不同的名字madeAppleBreakfast(Apple apple),ma...原创 2020-03-16 12:00:29 · 139 阅读 · 0 评论