![](https://img-blog.csdnimg.cn/20201014180756916.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
集合
文章平均质量分 78
JFS_Study
IP属地以运营商信息为准,境内显示到省(区、市),境外显示到国家(地区)
展开
-
Map 面试
一、说说 hash 的实现。为什么要这样实现?JDK8 中,是通过 hashCode() 的高 16 位异或低 16 位实现的:(h = k.hashCode()) ^ (h >>> 16)。主要是从速度、功效和质量来考虑的,减少系统的开销,也不会造成因为高位没有参与下标的计算,从而引起的碰撞。二、为什么要用异或运算符?保证了对象的 hashCode 的 32 位值只要有一位发生改变,整个 hash() 返回值就会改变。尽可能的减少碰撞。三、数组扩容的过程?创建一个新的数组,其容原创 2022-03-03 16:50:01 · 274 阅读 · 0 评论 -
集合(collection)
一、简述集合是一个容器,用来存储一组对象(元素类型可以不同、集合长度可变、空间不固定)。1️⃣Java 集合操作相关的接口和类定义在java.util包中。2️⃣Collection 接口存储的是一组无序,不唯一的对象。3️⃣Collections 工具类提供对集合的系列操作。4️⃣List 接口存储一组有序,不唯一的对象。List 接口的典型实现类有 ArrayList(基于数组实现), LinkedList(基于链表实现)。5️⃣Set 接口存储一组无序, 唯一的对象。Set 接口的典型实现原创 2022-02-23 10:24:24 · 97 阅读 · 0 评论 -
数组取首末元素没有性能差距
一、简述平时的业务开发中会经常出现数组(Array)一把梭的情况,大多数情况下都会用数组的形式进行操作,而有读源码习惯的开发者可能会发现,在一些底层库中,可能平时用数组的地方,底层库却选择了另外的数据结构,这是为什么?二、什么是数组数组是计算机科学中最基本的数据结构了,绝大多数编程语言都内置了这种数据结构,也是开发者最常见的数据结构。数组是由相同类型的元素(element)的集合所组成的数据结构,分配一块连续的内存来存储。当然,在一些动态语言中例如 Python 的列表或者 JavaScript 的原创 2022-02-23 10:16:03 · 277 阅读 · 0 评论 -
数组元素操作
一、将一个元素插入到数组的指定位置public static void main(String[] args) { int array[] = {1, 2, 3, 4, 5, 7, 8}; insertArray(array, 5, 6);}public static void insertArray(int array[], int index, int target) { //创建一个新的数组 int newArray[] = new int[array.leng原创 2022-02-23 10:03:20 · 281 阅读 · 0 评论 -
list 删除值为指定的字段
一、List 包含两个 remove 方法1️⃣按照下标索引删除2️⃣按照值删除,删除第一个符合的值对象。二、for 循环 remove常见写法:(由于下标问题达不到想要效果)for(int i=0;i<list.size();i++){ if(list.get(i).equals("del")) list.remove(i);}但是直接使用list.remove(i)这个方法的时候,删除第一个继续根据索引访问第2个元素时,因为删除的关系后面的元素都往前移动了一原创 2022-02-23 10:01:43 · 3735 阅读 · 0 评论 -
list 非空判断
一、简述1️⃣方法一(数据量大,效率低):if(list != null && list.size() > 0){}2️⃣方法二(数据量大,效率高)【最佳】:if(list != null && !list.isEmpty()){}方法说明:①list != null:判断是否存在 list,null 表示这个 list 不指向任何东西,如果这时候调用它的方法,那么就会出现 NPE(NullPointerException空指针异常)。②list.is原创 2022-02-23 09:56:14 · 11938 阅读 · 0 评论 -
java.util.ConcurrentModificationException
一、ConcurrentModificationExceptionimport java.util.ArrayList;import java.util.List;public class IteratorDemo { public static void main(String[] args) { List<String> list = new ArrayList<>(); list.add("zhangsan");原创 2022-02-23 09:45:37 · 408 阅读 · 0 评论 -
WeakHashMap
一、什么是 WeakHashMapMap 的子类常见的有 HashMap、Hashtable、ConcurrentHashMap、LinkedHashMap 等。WeakHashMap,直译就是:虚弱的 HashMap。从名字可得知其和 HashMap 有关,确实如此,WeakHashMap 功能几乎和 HashMap 一致。Weak,联想java.lang.ref包下的弱引用(WeakReference),由此这里面还牵扯到了一种弱引用结构。二、HashMap 和 WeakHashMap 的区别先看原创 2022-02-23 09:38:07 · 4543 阅读 · 0 评论 -
HashCode 算法为什么采用 31 作为乘数
一、为什么 String 重写 equals() 后还需要重写 hashcode()hashCode() 的源码:两个对象比较,由于 Java 默认比较的是类的地址值,每个对象一定是不同的,所以重写 hashCode() 和 equals()。重写 hashCode() 是为了提高效率,因为先根据类里的属性生成 hashCode,如果生成的 hashCode 值不同,则没必要再使用 equals() 比较属性的值,这样就大大减少了 equals 的次数,这对大数据量比较的效率提高是很明显的。一个很好的例原创 2022-02-22 17:26:30 · 640 阅读 · 0 评论 -
Java 7 和 Java 8 对 list 的双层循环处理
一、准备Java 处理 List 的双层循环,一般都是当两个 List 某个值满足某条件时候,进行相应的处理。需求:两个 List 对象当 id 相同的时候就组建成美好的家庭,Husband 对象与 Wife 对象组建成 Family 对象。Husband 对象如下:import io.swagger.annotations.ApiModel;import io.swagger.annotations.ApiModelProperty;import lombok.AllArgsConstructo原创 2022-02-22 17:22:42 · 1670 阅读 · 0 评论 -
为何 HashMap 非线程安全
以 JDK8 的 HashMap 为例。1️⃣情况一:线程甲和线程乙共同对 HashMap 进行 put 操作。假设甲乙插入的 Key-Value 中 key 的 hashcode 是相同的,这说明该键值对将会插入到 Table 的同一个下标的位置,会发生哈希碰撞,此时 HashMap 按照平时的做法是形成一个链表(若超过八个节点则是红黑树)。现在插入的下标为 null(Table[i]==null) 则进行正常的插入,此时线程甲进行到了这一步正准备插入,被堵塞,线程乙获得运行时间,进行同样操作,也是原创 2022-02-22 17:20:43 · 475 阅读 · 0 评论 -
ConcurrentHashMap、Hashtable、HashMap
一、区别总结1️⃣HashMap 是非线程安全的,不适用于多线程资源共享场景,在单线程场景下性能最好。在多线程环境中,需要手动实现同步机制。HashMap 中,null 可以作为键,这样的键只有一个,但可以有一个或多个键所对应的值为 null。当 get() 返回 null 时,既可以表示 HashMap 中没有该 key,也可以表示该 key 所对应的 value 为 null。因此,在 HashMap 中不能用 get() 来判断是否存在某个 key,应该用 containsKey() 来判断。2️原创 2022-02-22 17:16:48 · 538 阅读 · 0 评论 -
List 和 Map 的深浅克隆
一、List 的浅克隆List 是 Java 容器中最常用的顺序存储数据结构之一。有些时候将一组数据取出放到一个 List 对象中,但是可能会很多处程序要读取或者是修改。尤其是并发处理的话,显然有的时候一组数据是不够用的。这个时候通常会克隆出一个甚至多个 List 来执行更多的操作。List<String> souString = new ArrayList<>();souString.add("xxx1");souString.add("xxx2");souString原创 2022-02-22 17:07:27 · 574 阅读 · 0 评论 -
Map 的遍历
一、简述Java 的 map 遍历有多种方法,如最早的 Iterator,Java5 支持的 foreach,Java8 的 Lambda。HashMap 遍历从大的方向可分为以下 4 类:迭代器(Iterator)方式遍历;for each 方式遍历;Lambda 表达式遍历(JDK8+);Streams API 遍历(JDK8+)。但每种类型下又有不同的实现方式,因此具体的遍历方式又可分为:使用迭代器(Iterator)EntrySet 的方式进行遍历。使用迭代器(Iterato原创 2022-02-22 16:59:19 · 677 阅读 · 0 评论 -
如何解决哈希冲突
一、简述通过构造性能良好的哈希函数,可以减少冲突,但一般不可能完全避免冲突,因此解决冲突是哈希法的另一个关键问题。创建哈希表和查找哈希表都会遇到冲突,两种情况下解决冲突的方法应该一致。二、拉链法基本思想是将所有哈希地址为 i 的元素构成一个称为同义词链的单链表,并将单链表的头指针存在哈希表的第 i 个单元中,因而查找、插入和删除主要在同义词链中进行。拉链法适用于经常进行插入和删除的情况。1️⃣HashMap、HashSet 其实都是采用的拉链法来解决哈希冲突的,就是在每个位桶实现的时候,采用链表(j原创 2022-02-22 16:32:37 · 1974 阅读 · 0 评论 -
System.arrayCopy
一、源码Object src:源数组。int srcPos:源数组的起始位置。Object dest:目标数组。int destPos:目标数组的起始位置。int length:要 copy 的数组的长度。二、用法示例将源数组 srcBytes[] 从 0 位开始 copy 到目标数组 destBytes[] 中,在目标数组的第 0 位开始放置,共 copy 4 位。public static void main(String[] args) { byte[] srcBytes原创 2022-02-22 16:28:53 · 185 阅读 · 0 评论 -
ArrayList 不能用 foreach 增删改元素
一、快速失败(fail-fast)在用迭代器遍历一个集合对象时,如果遍历过程中对集合对象的内容进行了修改(增加、删除、修改),则会抛出ConcurrentModificationException。1️⃣原理:迭代器在遍历时直接访问集合中的内容,并且在遍历过程中使用一个 modCount 变量。集合在被遍历期间如果内容发生变化,就会改变 modCount 的值。每当迭代器使用 hashNext()/next() 遍历下一个元素之前,都会检测 modCount 变量是否为 expectedmodCount原创 2022-02-15 13:30:29 · 666 阅读 · 0 评论 -
两个list,高效比对属性相同的不同值
一、实体类1️⃣源实体类@Datapublic class SouEntity { private String id; private String name; private String deptId;}2️⃣目标实体类@Datapublic class TarEntity { private String id; private String name; private String deptId;}二、比较方法1️⃣利用map原创 2021-07-19 19:27:09 · 2198 阅读 · 0 评论 -
Lists 方法汇总
一、Lists.partition(List<T> list, int size)将 list 集合按指定长度进行切分,返回新的List<List<T>>集合。import com.google.common.collect.Lists;import org.junit.Test;import java.util.List;public class ListDemo { @Test public void partition() {原创 2021-07-14 21:03:46 · 950 阅读 · 0 评论 -
ArrayList 为什么线程不安全
一、源码分析首先看看这个类所拥有的部分属性字段:public class ArrayList<E> extends AbstractList<E> implements List<E>, RandomAccess, Cloneable, java.io.Serializable{ /** * 列表元素集合数组如果新建ArrayList对象时没有指定大小,那么会将 * EMPTY_ELEMENTDATA赋值给elementData, * 并在第一次添加元素原创 2021-05-19 21:56:33 · 4852 阅读 · 6 评论 -
Java中List去重
一、Stream 去重:list.stream().distinct()public static List removeDuplicate(List list) { List newList = (List) list.stream().distinct().collect(Collectors.toList()); return newList;}首先获得此 list 的 Stream,然后调用 distinct()。Java8 中提供流的方式对数据进行处理,非常快,底层用的是原创 2021-05-19 21:55:49 · 3417 阅读 · 0 评论 -
Set、HashSet 和 TreeSet
一、Set:无序、不可重复无序:指的是元素的添加顺序和迭代出来的顺序不一定相等。不可重复:内部通过 equals 方法来判断元素是否相等。add() 返回 boolean 值。Set<String> set = new HashSet<>();System.out.println("添加第一个元素返回值:" + set.add("a"));//trueSystem.out.println("添加的第二个元素返回值:" + set.add("b"));//trueSy原创 2021-05-19 21:54:49 · 549 阅读 · 0 评论 -
equals() 和 hashcode() 必须同时重写
一、hashCode和hashCode()hashCode 是 jdk 根据对象的地址或者字符串或者数字算出来的 int 类型的数值。public int hashCode()返回该对象的哈希码值。支持此方法是为了提高哈希表(如java.util.Hashtable提供的哈希表)的性能。1️⃣理解虽然 Set 同 List 都实现了 Collection 接口,但是二者实现方式却大不一样。List 基本上是以 Array 为基础。而 Set 则是在 HashMap 的基础上实现的,这是二者的根本区别。原创 2021-05-19 21:39:37 · 1543 阅读 · 0 评论 -
Java 中 list、array 与 set 的互转
一、array 转 list1️⃣直接使用Arrays的asList方法String[] str = new String[]{"a", "b", "c"};List<String> list = Arrays.asList(str);2️⃣for循环方式String[] str = new String[]{"a", "b", "c"};List<String> list = new ArrayList<>();for (int i = 0; i <原创 2021-05-19 21:38:30 · 2126 阅读 · 0 评论 -
Java中ArrayList和LinkedList区别
一、简述ArrayList和Vector内部是使用可増长数组实现的,可以认为ArrayList或者Vector封装了对内部数组的操作,比如向数组中添加、删除、插入新的元素或者数据的扩展和重定向。所以使用get和set方法是花费常数时间的,但是如果插入或者删除元素,除非插入或者删除的位置都在表末尾,否则代码开销会很大,因为里面需要数组的移动。LinkedList使用了循环双向链表数据结构,所以get会非常消耗资源,除非位置离头部很近。但是插入或者删除元素花费常数时间。与基于数组ArrayList相比,这是原创 2021-05-19 21:37:47 · 1228 阅读 · 0 评论 -
JDK7 和 JDK8 的 ConcurrentHashMap
一、SegmentJDK7 的 HashMap 在高并发下会出现链表环,从而导致程序出现死循环。可以使用 HashTable、Collections.syncronizedMap 替代,但是二者性能都很差。因为在执行读写操作时都是将整个集合加锁,导致多个线程无法同时读写集合。因此,高并发下的 HashMap 出现的问题就需要 ConcurrentHashMap 来解决了。【JDK7 的 ConcurrentHashMap】中有一个 Segment 的概念。Segment 本身就相当于一个 HashMap原创 2021-05-19 21:29:16 · 584 阅读 · 0 评论 -
JDK7 和 JDK8 的 HashMap
一、HashMap 的存储结构键值均可为 null##JDK7 的 HashMapJDK7 的 HashMap 的存储结构其实就是哈希表的存储结构(由数组与链表结合组成,称为链表的数组)。如下图:HashMap 的主干是一个 Entry 数组。Entry 是 HashMap 的基本组成单元,每一个 Entry 包含一个 key-value 键值对。当发生 hash 冲突时,数组节点则会变成一个链表,用于存储 hash 冲突的数据。如上图,HashMap 中元素存储的形式是 key-value 键值对原创 2021-05-19 21:25:58 · 770 阅读 · 0 评论 -
集合(collection)
一、简述集合是一个容器,用来存储一组对象(元素类型可以不同、集合长度可变、空间不固定)。1️⃣Java 集合操作相关的接口和类定义在java.util包中。2️⃣Collection 接口存储的是一组无序,不唯一的对象。3️⃣Collections 工具类提供对集合的系列操作。4️⃣List 接口存储一组有序,不唯一的对象。List 接口的典型实现类有 ArrayList(基于数组实现), LinkedList(基于链表实现)。5️⃣Set 接口存储一组无序, 唯一的对象。Set 接口的典型实现原创 2021-05-19 21:22:55 · 169 阅读 · 0 评论