Java集合总述

结构
  • Collection
    • List
      • ArrayList:
        Object数组实现,每次扩容50%;非线程安全;
      • Vector :
        Object数组实现,相对ArrayList,用synchronized关键字加锁,实现线程安全;
      • LinkedList:
        双向循环链表;非线程安全;
    • Map
      • HashMap:
        存储<K,V>对象,用K计算的hash值匹配到bucket,K.equals()定位具体的<K,V>对象来找到value;负载因子0.75,也就是说容量达到75%时扩容,初始16,每次扩容变为原来的2倍。
      • Hashtable:
        遗留类,基本被淘汰,放入null会报错。它是在HashMap基础加了synchronized关键字,所以并发性不好;替代的推荐用ConcurrentHashMap
      • LinkedHashMap:
        HashMap的一个子类;链表实现
      • TreeMap
        TreeMap实现SortedMap接口,保存的是按key排序的,默认是按key升序排序,也可以指定排序;
      • ConcurrentHashMap:
        JDK1.8 中取消了Segment分段锁,采用CAS和synchronized来保证并发安全。数据结构跟HashMap1.8的结构类似,数组+链表/红黑二叉树。不允许键值null;
    • Set
      • HashSet:
        无序,唯一;基于 HashMap 实现的,底层采用 HashMap 来保存元素;判断对象重复的方式与HashMap判断K的hash然后equals一致;
      • TreeSet
        有序,唯一;红黑树
      • LinkedHashSet
        基于LinkedHashMap实现

推荐: ArrayList 源码学习, HashMap源码学习

HashMap分析
  • 允许键值为null;
  • 非线程安全;如果需要满足线程安全,可以用 Collections.synchronizedMap()方法使HashMap具有线程安全的能力,或者使用ConcurrentHashMap。
  • JDK1.7前,以数组+链表的链表数组存储,数组是主体,链表是为了解决hash冲突的存在。存储的结构是<K,V>的实体,以K的hash值定位到bucket,发生hash冲突是通过K.equals()找到需要的实体部分。
  • JDK1.8,当链表长度>8时,链表转换为红黑树,当链表长度<6,红黑树转为链表。另外改进了hash计算方法,使得分布更加均匀
为什么HashMap长度是2的N次?
这个算法实际就是取模,hash%length,计算机中直接求余效率不如位移运算,源码中做了优化hash&(length-1),
hash%length==hash&(length-1)的前提是length是2的n次方;
为什么这样能均匀分布减少碰撞呢?2的n次方实际就是1后面n个0,2的n次方-1  实际就是n个1;
例如长度为9时候,3&(9-1)=0  2&(9-1)=0 ,都在0上,碰撞了;
例如长度为8时候,3&(8-1)=3  2&(8-1)=2 ,不同位置上,不碰撞;
<think>好的,用户让我介绍一下Java的循环语句。首先,我需要确定用户的知识水平。可能他们刚开始学编程,或者有其他语言的背景想了解Java的循环结构。 Java的循环语句主要有三种:for、while和do-while。我应该分别解释每种循环的结构和适用场景,这样用户能知道在什么情况下使用哪种循环更合适。 接下来,得考虑是否需要给出示例代码。示例能帮助理解,特别是对于新手来说,看到具体的代码例子会更清楚循环的执行流程。比如,for循环的经典例子是遍历数组或执行固定次数的操作,while循环适合不确定循环次数的情况,而do-while至少执行一次。 还要注意区分while和do-while的区别,强调do-while的循环体至少执行一次,这在某些情况下很重要。用户可能容易混淆这两种,所以需要明确说明。 另外,可能需要提到增强型for循环(foreach),这是Java 5引入的,用于遍历集合或数组,简化代码。这部分对于处理集合特别有用,应该单独列出来说明。 最后,是否需要提醒循环控制语句,比如break和continue?虽然用户的问题可能不涉及这些,但简要提及可以让他们知道如何控制循环的执行流程。 总结一下,结构应该是先总述三种循环类型,然后分别详细讲解每种,包括语法、流程图、示例代码和适用场景。最后可以补充增强型for循环和控制语句,让内容更全面。要确保用词准确,示例简洁易懂,避免使用复杂术语,保持口语化,让用户容易理解。</think>以下是对Java循环语句的详细介绍(所有代码示例均使用$$...$$格式): 一、Java循环类型 Java提供三种基础循环结构: 1. `for` 循环 $$语法格式: for(初始化; 布尔表达式; 更新) { // 循环体 }$$ 适用场景:明确知道循环次数的情况 ```java // 示例:计算1-100的和 int sum = 0; for(int i=1; i<=100; i++){ sum += i; } ``` 2. `while` 循环 $$语法格式: while(布尔表达式) { // 循环体 }$$ 适用场景:不确定循环次数,但需满足条件才执行 ```java // 示例:猜数字游戏 int target = 42; Scanner scanner = new Scanner(System.in); while(true) { System.out.print("请输入猜测:"); int guess = scanner.nextInt(); if(guess == target) break; } ``` 3. `do...while` 循环 $$语法格式: do { // 循环体 } while(布尔表达式);$$ 特点:至少执行一次循环体 ```java // 示例:输入验证 int input; do { System.out.print("请输入1-100之间的数字:"); input = scanner.nextInt(); } while(input < 1 || input > 100); ``` 二、增强型for循环(foreach) Java 5+ 新增特性: $$语法格式: for(元素类型 变量名 : 集合或数组){ // 循环体 }$$ ```java // 示例:遍历数组 int[] numbers = {1, 2, 3, 4, 5}; for(int num : numbers) { System.out.println(num); } ``` 三、循环控制语句 1. `break`:立即终止当前循环 2. `continue`:跳过本次循环剩余代码 3. 循环标签(Label):控制多层嵌套循环 四、性能注意事项 1. 避免在循环内创建不必要的对象 2. 优先使用局部变量进行循环计算 3. 大数据量遍历时,foreach效率可能低于传统for循环 五、流程图示例 $$for循环执行流程: 开始 -> 初始化 -> 条件判断 -> [true]执行循环体 -> 更新 -> 条件判断 -> [false]结束循环$$ 建议通过实际编码练习加深理解,例如:制作九九乘法表、实现质数判断算法等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值