![](https://img-blog.csdnimg.cn/20201014180756926.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Java集合
文章平均质量分 66
黄泥川水猴子
焦虑没有用,得学习
展开
-
ArrayList线程安全问题怎么解决?
一、使用VectorVector是线程安全的,我们可以看下Vector底层的方法是同步的(Synchronized修饰),从而可以解决ArrayList线程不安全的问题;/** * Appends the specified element to the end of this Vector. * * @param e element to be appended to this Vector * @return {@code true} (as specified by {@link Coll原创 2022-03-14 13:01:13 · 591 阅读 · 0 评论 -
JDK 8 ConcurrentHashMap
初始化ConcurrentHashMap初始化设置容量时,底层会自动转换为距设置值2倍的最近的2的次幂;【前后距离相等时选择向后转换:如3 * 2 = 6距离4和8相等,选择向后转换为8】jdk8的版本实际上最多可以同时扩容的线程数是:hash桶的个数/16get方法get方法利用了volatile特性,实现了无锁读。查找value的过程如下:根据key定位hash桶,通过tabAt的volatile读,获取hash桶的头结点。通过头结点Node的volatile属性next,遍历Node链原创 2022-02-16 10:49:14 · 959 阅读 · 0 评论 -
ConcurrentHashMap原理基于JDK1.7源码
多线程高并发情况下,hashmap会出现问题。segment基本原理工作原理:中途多了一个寻找segment的过程,当两个线程同时进行时,如果计算的segement一样,其中一个segment.lock(),下一个就会等待上一个线程释放。源码初始化concurrencyLevel指的是并发级别(多少线程)这个变量决定segment对象多少 8–>8 9–>16initialCapacity是所有entry加一起的数量 c是segment中entry的数量用initia.原创 2022-01-25 11:27:49 · 391 阅读 · 0 评论 -
HashMap中Hash算法的应用
算法一直是我的弱项,然而面试中基本是必考的项目,刚好上次看到一个HashMap的面试题,今天也来学习下 HashMap中的hash算法是如何实现的。数学知识回顾<< : 左移运算符,num << 1,相当于num乘以2 低位补0举例:3 << 2将数字3左移2位,将3转换为二进制数字0000 0000 0000 0000 0000 0000 0000 0011,然后把该数字高位(左侧)的两个零移出,其他的数字都朝左平移2位,最后在低位(右侧)的两个空位补零。则得到原创 2021-12-09 14:56:57 · 248 阅读 · 0 评论 -
HashMap面试题整理
一. 存储结构1.HashMap的底层数据结构是什么?在JDK1.7 和JDK1.8 中有所差别:在JDK1.7 中,由“数组+链表”组成,数组是 HashMap 的主体,链表则是主要为了解决哈希冲突而存在的。在JDK1.8 中,由“数组+链表+红黑树”组成。当链表过长,则会严重影响 HashMap 的性能,红黑树搜索时间复杂度是 O(logn),而链表是糟糕的 O(n)。因此,JDK1.8 对数据结构做了进一步的优化,引入了红黑树,链表和红黑树在达到一定条件会进行转换:当链表超过 8 且数据总原创 2021-12-08 17:17:06 · 6318 阅读 · 0 评论 -
JDK1.7HashMap底层解析
底层数据结构:数组 链表key—》hashcode&key --》寻址新元素进来插入到链表头部,新元素的引用存在数组里,next里边存着老元素的地址。初始化 static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; // 初始容量 16 * 最大容量 static final int MAXIMUM_CAPACITY = 1 << 30; * 加载因子 3/4 static f原创 2021-10-25 16:03:01 · 167 阅读 · 0 评论 -
Java集合接口结构
Collection接口结构原创 2021-10-25 15:38:32 · 46 阅读 · 0 评论 -
List 中 remove() 方法不要随便用
今天在开发过程中遇到一个问题对List中的元素进行筛选,我就想到进行过滤,不符合要求的就删除我想到了遍历中使用remove,但是后来发现这是一个坑啊参考这篇文章List 中 remove() 方法的“陷阱”,被坑惨了...原创 2021-10-20 13:23:01 · 115 阅读 · 0 评论 -
Java迭代器
Iterator接口的使用方法public class IteratorDemo { public static void main(String[] args) { Collection<String> coll = new ArrayList<String>(); //多态 coll.add("abc1"); coll.add("abc2"); coll.add("abc3"); coll.add("abc4"); // 迭代器,对集合ArrayLis原创 2021-10-13 15:44:34 · 69 阅读 · 0 评论 -
Java泛型详解
泛型类可以等效为Object。实例化的时候不指定泛型,那么认为此泛型为Object类型实例化的时候指定泛型在这个类里边,E就是相应的类型继承的时候,指定父类泛型,子类就不需要指定泛型了父类不指定泛型,那么子类也会变成一个 泛型类应用场合:可以不指定固定类型,在实例化的时候使用定义的泛型可以是多个参数类型构造器类型不可以这么写子类继承的写法泛型类中的静态方法因为静态方法是优先于类存在的,所以加载时这个A还没有定义类型,所以会报错!泛型类中的静态方法不能使用类的泛原创 2021-10-19 22:04:29 · 704 阅读 · 0 评论 -
LinkedList笔记&ArrayList和LinkedList的区别
LinkedList简介LinkedList 是一个继承于AbstractSequentialList的双向链表。它也可以被当作堆栈、队列或双端队列进行操作。LinkedList 实现 List 接口,能对它进行队列操作。 LinkedList 实现 Deque接口,即能将LinkedList当作双端队列使用。LinkedList 实现了Cloneable接口,即覆盖了函数clone(),能克隆。LinkedList 实现java.io.Serializable接口,这意味着LinkedList支原创 2021-10-12 22:12:13 · 2141 阅读 · 0 评论 -
Java ArrayList笔记
数组1.动态初始化(声明并开辟数组)数组类型[] 数组名 = new 数据类型[数组长度];int[] array=new int[3];因为数组也是对象,所以下面的代码也是合法的:Object obj = new int[10];注意:在给数组命名的时候,一般在数组名后加一个 s 表示这是一个包含多个元素的数组(与单个变量区分)。当数组采用动态初始化开辟空间之后,数组之中的每个元素都是该数据类型的默认值数据类型默认初始化byte、short、int、long0原创 2021-10-12 17:30:58 · 187 阅读 · 0 评论