当前位置: 首页 > web >正文

java集合类

javaSE中3个重点: 面向对象相关知识

集合类 (数据结构,线程)

多线程

次重点: 网络 (计网)

IO

常用类

异常

Java集合类概述

Java集合类位于java.util包中,主要用于存储和操作一组对象。根据数据结构和用途的不同,可分为三大类:List(有序可重复)、Set(无序唯一)和Map(键值对存储)。


核心接口与实现类

List接口
  • ArrayList:基于动态数组实现,随机访问效率高,但插入/删除元素时性能较低。
    List<String> list = new ArrayList<>();
    list.add("Java");
    list.get(0); // 访问元素
    
    
  • LinkedList:基于双向链表实现,插入/删除效率高,但随机访问性能较差。
  • Vector:线程安全的动态数组,性能较低,是线程安全的 。
Set接口
  • HashSet:基于哈希表实现,元素无序,允许null值。
    Set<Integer> set = new HashSet<>();
    set.add(1);
    set.contains(1); // 检查元素  
    
    
  • LinkedHashSet:维护插入顺序的HashSet
  • TreeSet:基于红黑树实现,元素自然排序或自定义排序。
Map接口
  • HashMap:基于哈希表的键值对存储,非线程安全,允许null键/值。
    基本特点: 双列集合,键不能重复,值可以重复,可以有一个key为null 
    
    Map<String, Integer> map = new HashMap<>();
    map.put("Key", 100);
    map.get("Key"); // 获取值  
    数据结构: 

源码

put方法源码分析

public V put(K key, V value) {//通过key计算哈希值return putVal(hash(key), key, value, false, true);
}
static final int hash(Object key) {int h;                       为了减少哈希值冲突return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);}

 

 final V putVal(int hash, K key, V value, boolean onlyIfAbsent,boolean evict) {Node<K,V>[] tab; //哈希表Node<K,V> p; //记录之前int n, i; //n是哈希表长度, i是索引if ((tab = table) == null || (n = tab.length) == 0)n = (tab = resize()).length;//创建哈希表if ((p = tab[i = (n - 1) & hash]) == null) // == 97%16 根据哈希值计算位置//如果该位置为null,则直接将key,value包装到一个node对象中,直接存放到第i个位的第一个tab[i] = newNode(hash, key, value, null);else {Node<K,V> e; K k;//判断key是否重复, 先判断哈希值(快),但是哈希有问题,值相同,但内容不同,//所以在哈希值相同时,需要调用equals(),判断内容是否相同.if (p.hash == hash &&((k = p.key) == key || (key != null && key.equals(k))))e = p;//当key不重复时,判断类型是树类型还是链表类型else if (p instanceof TreeNode)//已经是树类型,向红黑树上添加元素e = ((TreeNode<K,V>)p).putTreeVal(this, tab, hash, key, value);else {//链表for (int binCount = 0; ; ++binCount) {if ((e = p.next) == null) {p.next = newNode(hash, key, value, null);//添加完成后,判断链表长度if (binCount >= TREEIFY_THRESHOLD - 1) // -1 for 1sttreeifyBin(tab, hash);//转红黑树break;}if (e.hash == hash &&((k = e.key) == key || (key != null && key.equals(k))))break;p = e;}}if (e != null) { // existing mapping for keyV oldValue = e.value;if (!onlyIfAbsent || oldValue == null)e.value = value;//key相同时,会用后面key的值,覆盖之前的相同的key的值afterNodeAccess(e);return oldValue;}}++modCount;if (++size > threshold)resize();afterNodeInsertion(evict);return null;}

重点参数:

哈希表长度: 默认是16

哈希表每次扩容原来 2 倍

哈希表的负载因子 0.75, 哈希表不会装满的,装满会影响查询效率,所以会牺牲一定的空间而换取查询效率

链表长度上限是 8 ,尝试将链表转为红黑树,但是不一定转成功, 还会判断哈希表长度,哈希表长度小于64

会先扩容哈希表,扩容后所有元素位置需要重新计算,这样链表会变短,

只有当链表长度大于等于8且哈希表长度大于64,链表才会转成红黑树.

当红黑树节点数量减少为6个时,红黑树退化成链表

 

  • LinkedHashMap:维护插入顺序的HashMap
  • TreeMap:基于红黑树实现,键按自然顺序或比较器排序。
  • Hashtable:线程安全的Map实现,已被ConcurrentHashMap取代。

线程安全集合

  • ConcurrentHashMap:分段锁实现的高并发Map

ConcurrentHashMap是一个线程安全的map,加锁的方式与Hashtable不同

Hashtable直接在方法上加锁,一次只能有一个线程进入方法操作.

ConcurrentHashMap不是给方法加的锁,个每个哈希表中的位置加锁

  • CopyOnWriteArrayList:写时复制的线程安全List
  • Collections.synchronizedXXX:通过工具类包装非线程安全集合(如Collections.synchronizedList())。

常用工具类

  • Collections:提供排序、查找、同步等方法。
    Collections.sort(list); // 排序List  
    
    
  • Arrays:数组操作工具,如Arrays.asList()转换数组为List。

选择集合类的原则

  1. 是否需要有序:选择ListLinkedHashSet/LinkedHashMap
  2. 是否需要唯一性:选择SetMap的键。
  3. 是否需要键值对:直接使用Map
  4. 是否考虑线程安全:选择ConcurrentHashMapCopyOnWriteArrayList

性能对比

  • ArrayList vs LinkedList:频繁查询用ArrayList,频繁增删用LinkedList
  • HashSet vs TreeSet:需要快速访问用HashSet,需要排序用TreeSet
  • HashMap vs TreeMap:类似HashSetTreeSet的区别。

通过理解集合类的特性和适用场景,可以更高效地选择合适的数据结构。

http://www.xdnf.cn/news/15279.html

相关文章:

  • 输入流挂起
  • 人脸图像生成(DCGAN)
  • Java线程进阶-并发编程
  • python的病例管理系统
  • halcon 求一个tuple的极值点
  • 性能狂飙 Gooxi 8卡5090服务器重新定义高密度算力
  • 深入剖析Spring Bean生命周期:从诞生到消亡的全过程
  • JavaSE——Object
  • Linux驱动基本概念(内核态、用户态、模块、加载、卸载、设备注册、字符设备)
  • DSSA(Domain-Specific Software Architecture)特定领域架构
  • 台球 PCOL:极致物理还原的网页斯诺克引擎(附源码深度解析)
  • Leaflet面试题及答案(21-40)
  • 2025年体育科学与健康大数据国际会议(ICSSHBD 2025)
  • OpenAI 将推 AI Agent 浏览器:挑战 Chrome,重塑上网方式
  • 异构Active DataGuard对于convert参数的错误理解
  • SpringCloud之Feign
  • 从「小公司人事」到「HRBP」:选对工具,比转岗更能解决成长焦虑
  • 十二、k8s工程化管理Helm
  • Linux自动化构建工具(一)
  • pdf拆分
  • 《打破预设的编码逻辑:Ruby元编程的动态方法艺术》
  • LVS负载均衡-DR模式配置
  • 进制转换原理与实现详解
  • 【unity编辑器开发与拓展EditorGUILayoyt和GUILayoyt】
  • RISC-V:开源芯浪潮下的技术突围与职业新赛道 (三)RISC-V架构深度解剖(下)
  • 【八股消消乐】浅尝Kafka性能优化
  • 【面板数据】省级泰尔指数及城乡收入差距测算(1990-2024年)
  • Vue集成MarkDown
  • 开源界迎来重磅核弹!月之暗面开源了自家最新模型 K2
  • UC浏览器PC版自2016年后未再更新不支持vue3