首页 > 其他分享 >2. 集合

2. 集合

时间:2023-02-16 08:55:29浏览次数:23  
标签:HashMap JDK ArrayList 链表 线程 数组 集合

  • Collection的体系结构,Java容器有哪些?
    List:
    ArrayList
    Vector
    LinkedList
    Set:
    HashSet
    TreeSet
    Queue:
    PriorityQueue
    ArrayQueue
    Map:
    HashMap
    LinkedHashMap
    Hashtable
    TreeMap
  • HashMap底层数据结构jdk1.7和1.8的区别
    HashMap 主要用来存放键值对,它基于哈希表的 Map 接口实现,是常用的 Java 集合之一,是非线程安全的
    JDK1.8 之前 HashMap 底层是 数组和链表 结合在一起使用也就是 链表散列。HashMap 通过 key 的 hashcode 经过扰动函数处理过后得到 hash 值,然后通过 (n - 1) & hash 判断当前元素存放的位置(这里的 n 指的是数组的长度),如果当前位置存在元素的话,就判断该元素与要存入的元素的 hash 值以及 key 是否相同,如果相同的话,直接覆盖,不相同就通过拉链法解决冲突
    JDK1.8 之后
    相比于之前的版本, JDK1.8 之后在解决哈希冲突时有了较大的变化,当链表长度大于阈值(默认为 8)(将链表转换成红黑树前会判断,如果当前数组的长度小于 64,那么会选择先进行数组扩容,而不是转换为红黑树)时,将链表转化为红黑树,以减少搜索时间
  • 解决 hash 碰撞的方法
    为了能让 HashMap 存取高效,尽量较少碰撞,也就是要尽量把数据分配均匀,只要哈希函数映射得比较均匀松散,一般应用是很难出现碰撞的,先做对数组的长度取模运算,得到的余数才能用来要存放的位置也就是对应的数组下标
  • HashMap 有哪几种常见的遍历方式?
    HashMap 遍历从大的方向来说,可分为以下 4 类:
    迭代器(Iterator)方式遍历;
    For Each 方式遍历;
    Lambda 表达式遍历(JDK 1.8+);
    Streams API 遍历(JDK 1.8+)
  • ConcurrentHashMap的实现,底层原理。
    ConcurrentHashMap 是由 Segment 数组结构和 HashEntry 数组结构组成
    jdk1.7和1.8的区别
    线程安全实现方式 :JDK 1.7 采用 Segment 分段锁来保证安全, Segment 是继承自 ReentrantLock。JDK1.8 放弃了 Segment 分段锁的设计,采用 Node + CAS + synchronized 保证线程安全,锁粒度更细,synchronized 只锁定当前链表或红黑二叉树的首节点。
    Hash 碰撞解决方法 : JDK 1.7 采用拉链法,JDK1.8 采用拉链法结合红黑树(链表长度超过一定阈值时,将链表转换为红黑树)。
    并发度 :JDK 1.7 最大并发度是 Segment 的个数,默认是 16。JDK 1.8 最大并发度是 Node 数组的大小,并发度更大
  • HashTable、HashMap、HashSet区别。
    线程是否安全: HashMap 是非线程安全的,Hashtable 是线程安全的
    效率: 因为线程安全的问题,HashMap 要比 Hashtable 效率高一点
    初始容量大小和每次扩充容量大小的不同 :创建时如果不指定容量初始值,Hashtable 默认的初始大小为 11,之后每次扩充,容量变为原来的 2n+1。HashMap 默认的初始化大小为 16。之后每次扩充,容量变为原来的 2 倍
    底层数据结构: JDK1.8 以后的 HashMap 在解决哈希冲突时有了较大的变化
    HashSet底层就是基于HashMap实现的
  • ArrayList,LinkedList ,Vector的区别?
    ArrayList 是 List 的主要实现类,底层使用 Object[]存储,适用于频繁的查找工作,线程不安全 ;
    Vector 是 List 的古老实现类,底层使用Object[] 存储,线程安全的
    我们在项目中一般是不会使用到 LinkedList 的,需要用到 LinkedList 的场景几乎都可以使用 ArrayList 来代替,并且,性能通常会更好
  • ArrayList 的扩容机制
    ArrayList 的底层是数组队列,相当于动态数组
    以无参数构造方法创建 ArrayList 时,实际上初始化赋值的是一个空数组。当真正对数组进行添加元素操作时,才真正分配容量。即向数组中添加第一个元素时,数组容量扩为10

标签:HashMap,JDK,ArrayList,链表,线程,数组,集合
From: https://www.cnblogs.com/song-hua/p/17125415.html

相关文章

  • 集合去重
    1、LinkedHashSet去重List<String>list=newArrayList<>();list.add("111");list.add("22");list.add("111");list.add("33");list.add("111");List<String>newPhon......
  • Guava工具类中一些集合和方法的使用
    Multiset:无序可重复set,重复元素显示个数还是挺有用的数据结构@Testvoidtest5(){Strings="goodgoodstudydaydayup";String[]s1......
  • 集合
    集合一、集合的理解和好处前面保存多个数据使用的是数组,那么数组有不足的地方,分析一下数组长度开始时必须指定,而且一旦指定,不能更改;保存的必须为同类型的元素;......
  • 两个集合对比
    上代码,主要是学习到了如何对比出两个List集合的和差交并集方法staticvoidMain(string[]args){varleftKes=newList<string>(){"111111",......
  • 5、开发中如何选择集合实现类
    在开发中,选择什么集合实现类,主要取决于业务操作特点,然后根据集合实现类特性进行选择,分析如下:先判断存储的类型(一组对象[单列]或一组键值对[双列])一组对象[单列]:Collecti......
  • 集合面试题
    Collection:①List:  Vector(Stack),  ArrayList,  LinekdList ②Set:  HashSet(LinkedHashSet),  TreeSet③Queue:  PriorityQueue,  ArrayDeque......
  • 【Python21天学习挑战赛】集合 & 数据类型补充
    开头一叙:无论是以后学习需要或者是三年后的工作需要,都需要用到python的工具,也接着这次活动的机会,把python系统的学一遍。跟着大佬,让python知识从入门到精通。文章目录​​......
  • 使用 Kitten 编程猫绘制一个 Y 方向平铺的立方体集合
    效果如下图所示:我们实际上使用了2D来模拟3D效果。应用程序启动时,默认只绘制一个立方体,因此我们在初始绘制的函数里,只执行动态绘制X方向的立方体这一个逻辑。因为默......
  • 区间插入,维护本质相同集合对数 (离线)
    有\(n\)个集合,\(m\)次操作,第\(i\)次操作选择一个区间\([l_i,r_i]\),在这些集合里插入\(i\),每次操作后查询本质相同集合对数。先用可持久化线段树来存每个集合。......
  • ADB命令集合
    一.基础命令1.启动adb服务:adbstart_server2.终止adb服务:adbkill_server3.获取帮助:adbhelp4.查看adb版本:adbversion5.连接设备:adbconn......