![](https://img-blog.csdnimg.cn/20201014180756916.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
集合
diweikang
心如止水
展开
-
Java之Lists.Partition项目中遇到的坑
项目中使用Lists.Partition批量处理数据,但是最近内存一直OutOffMemory,GC无法回收。后来我们对使用过的集合手动clear,没有测试直接就上线了。尴尬的是内存回收了,但是跑出来的数据出问题了。最后自己单元测试发现是List<List<TreasureIntegrationVo>> resultPartition = Lists.partition(l...原创 2020-04-08 11:53:45 · 5926 阅读 · 0 评论 -
HashSet的实现原理
1、HashSet概述:HashSet实现Set接口,由哈希表(实际上是一个HashMap实例)支持。它不保证set的迭代顺序;特别是它不保证该顺序恒久不变。此类允许使用null元素。2、HashSet的实现:对于HashSet而言,它是基于HashMap实现的,HashSet底层使用HashMap来保存所有元素,因此HashSet的实现比较简单,相关HashSet的操作,基...转载 2019-03-22 15:05:22 · 306 阅读 · 0 评论 -
List与Array转换
List to ArrayList 提供了toArray的接口,所以可以直接调用转为object型数组:List<String> list = new ArrayList<String>();Object[] array=list.toArray();上述方法存在强制转换时会抛异常,下面此种方式更推荐,可以指定类型:String[] array=lis...原创 2019-04-04 11:39:30 · 358 阅读 · 0 评论 -
队列Queue
队列是一种数据结构,它只允许在队列尾部(rear)加人一个元素,和从队列头部(front)移除一个元素。进行插入操作的端称为队尾,进行删除操作的端称为队头。队列中没有元素时,称为空队列。在队列这种数据结构中,最先插入的元素将是最先被删除的元素;反之最后插入的元素将是最后被删除的元素,因此队列又称为“先进先出”(FIFO—first in first out)的线性表。Queue的实现...原创 2019-04-04 17:52:54 · 311 阅读 · 0 评论 -
ConcurrentHashMap原理分析(1.7)
一、出现背景1、线程不安全的HashMap先说HashMap,HashMap是线程不安全的,在并发环境下,可能会形成环状链表(扩容时可能造成,具体原因自行百度google或查看源码分析,参考https://blog.csdn.net/diweikang/article/details/89198811),导致get操作时cpu空转,所以,在并发环境中使用HashMap是非常危险的...转载 2019-03-27 22:14:35 · 1225 阅读 · 1 评论 -
HashMap为什么是线程不安全的
HashMap的容量是有限的,当经过多次元素插入,使得HashMap达到一定饱和度时,Key映射位置发生冲突的几率会逐渐提高。这时候,HashMap需要扩展它的长度,也就是进行resize。影响发生resize的因素有两个:1.capacity:HashMap数组长度,默认初始为16。HashMap的长度是2的幂。2.loadFactor:负载因子,默认值为0.75f。衡量Hash...转载 2019-04-11 00:15:20 · 392 阅读 · 1 评论 -
ArrayList内部原理
简介ArrayList 是一种变长的基于数组实现的集合类,允许空值和重复元素,当往 ArrayList 中添加的元素数量大于其底层数组容量时,它会自动扩容至一个更大的数组。另外,由于 ArrayList 底层基于数组实现,所以其可以保证在 O(1) 复杂度下完成随机查找操作。其他方面,ArrayList 是非线程安全类,并发环境下,多个线程同时操作 ArrayList,会引发不可预知的错误...转载 2019-04-02 21:02:12 · 248 阅读 · 1 评论 -
LinkedList实现栈和队列操作
LinkedList 不仅实现了List接口还实现了Dueue接口(双端队列,既具有队列的特征,也具有栈的特征),Dueue接口是Queue的子接口。它也可以被当作堆栈、队列或双端队列进行操作。LinkedList 实现 List 接口,能对它进行队列操作。LinkedList 实现 Deque 接口,能将LinkedList当作双端队列使用。使用LinkedList实现堆栈impo...转载 2019-04-09 21:47:24 · 1470 阅读 · 0 评论 -
数据结构之栈与队列
1.栈与队列栈与队列是程序设计中广泛使用的两种重要的线性数据结构。栈是LIFO(Last In First Out),先存进去的数据只能最后被取出来,进出顺序逆序,即先进后出,后进先出。队列是FIFO(First In First Out),它保持进出顺序一致,即先进先出,后进后出。4.如何使用两个栈模拟队列操作public class TwoStackForQueue&...转载 2019-04-09 23:13:58 · 262 阅读 · 0 评论 -
重写equal()时为什么也得重写hashCode()之深度解读
1.equals()的所属以及内部原理(即Object中equals方法的实现原理)说起equals方法,我们都知道是超类Object中的一个基本方法,用于检测一个对象是否与另外一个对象相等。而在Object类中这个方法实际上是判断两个对象是否具有相同的引用,如果是,它们就一定相等。其源码如下:public boolean equals(Object obj) { retu...转载 2019-03-21 22:24:14 · 628 阅读 · 0 评论 -
List集合去除重复对象
在java中,要将一个List中重复的对象除去,如果这个集合中的数据类型是基本数据类型,可以直接将List集合转换成Set,就会自动去除重复的元素,大家都知道Set集合的特点就是没有重复的,这个就相对比较简单,这里不在详细说,我们下面说的List集合中的数据类型是一个对象类型的情况。当List集合中存储的类型是对象类型的时候,我们就不能简单的只把List集合转换成Set集合就行了,这时我们需要...转载 2019-03-21 21:28:51 · 12479 阅读 · 0 评论 -
Java中如何删除一个集合中的多个元素
今天我需要从一个java的集合中,根据另一个集合的内容,删除其中的若干个元素。这看上去非常简单,但却遇到了问题。这就是“Java中如何删除一个集合中的多个元素”的问题。我首先使用for each 语句进行删除。 @Test public void errorMethod1() { for (Integer i : sourceList) { for (Integer j ...原创 2016-08-07 17:58:18 · 668 阅读 · 5 评论 -
List和Set的contains()方法实现原理
新手对Set中contains()方法的疑惑class Dog { int id; String color; public Dog(int id, String color) { this.id = id; this.color = color; } public int getId() { return id; } public void setId(i...原创 2016-09-08 20:55:17 · 11780 阅读 · 1 评论 -
List集合序列排序的两种方法
首先讲一下Comparable接口和Comparator接口,以及他们之间的差异。有助于Collections.sort()方法的使用。请参考1.Comparable自然规则排序//在自定义类Student里面实现Comparable接口,并重写抽象方法compareTo(Student o);//Collections.sort(集合);先看一个简单的例子: public st...原创 2018-06-24 00:37:20 · 248647 阅读 · 8 评论 -
Comparable和Comparator两种比较器的区别
Comparable & Comparator接口都可以用来实现集合中元素的比较、排序,Comparator位于包java.util下,而Comparable位于包java.lang下,Comparable接口将比较代码嵌入自身类中,而后者在一个独立的类中实现比较。像Integer、String等这些基本类型的JAVA封装类都已经实现了Comparable接口,这些类对象本身就支持自比...原创 2018-06-24 00:04:35 · 10555 阅读 · 0 评论 -
Java集合框架关系图
集合的特点:集合用来存储不同类型的对象(基本数据类型除外),存储长度可变。Java集合中实际存放的只是对象的引用,每个集合元素都是一个引用变量,实际内容都放在堆内存或者方法区里面,但是基本数据类型是在栈内存上分配空间的,栈上的数据随时就会被收回的。集合框架图:上述类图中,实线边框的是实现类,比如ArrayList,LinkedList,HashMap等,折线边框的是抽象类,...转载 2019-03-10 18:51:45 · 33051 阅读 · 8 评论 -
HashMap底层实现原理
数据结构中有数组和链表这两个结构来存储数据。数组存储区间是连续的,占用内存严重,故空间复杂度很大。但数组的二分查找时间复杂度小,为O(1);数组的特点是:寻址容易,插入和删除困难;链表存储区间离散,占用内存比较宽松,故空间复杂度很小,但查找的时间复杂度很大,达O(N)。链表的特点是:寻址困难,插入和删除容易。综合这两者的优点,摒弃缺点,哈希表就诞生了,既满足了数据查找方面的特点,占用的...原创 2019-03-11 23:24:47 · 248 阅读 · 0 评论 -
HashMap实现原理与源码分析
哈希表(hash table)也叫散列表,是一种非常重要的数据结构,应用场景及其丰富,许多缓存技术(比如memcached)的核心其实就是在内存中维护一张大的哈希表,而HashMap的实现原理也常常出现在各类的面试题中,重要性可见一斑。本文会对java集合框架中的HashMap的实现原理进行讲解,然后会对JDK7的HashMap源码进行分析。一、什么是哈希表在讨论哈希表之前,我们先大概了解...转载 2019-03-12 22:21:47 · 130 阅读 · 0 评论 -
List的equals方法学习
之前没有了解过这个方法,初次在项目中看到它的时候还以为是在比较两个List的地址,后来看了源码才知道了这个方法的作用。首先看一个例子:public class Test{ public static void main(String[] args){ ArrayList<String> str1 = new ArrayList<String>...原创 2019-03-21 18:53:30 · 6442 阅读 · 0 评论 -
对map集合进行排序
1.简单介绍Map在讲解Map排序之前,我们先来稍微了解下map。map是键值对的集合接口,它的实现类主要包括:HashMap、TreeMap、HashTable、LinkedHashMap。其中这四者的区别如下(简单介绍):HashMap:我们最常用的Map,它根据key的HashCode值来存储数据,根据key可以直接获取它的value,同时它具有很快的访问速度。HashMap最多只允...原创 2016-07-26 20:59:32 · 484 阅读 · 0 评论