LinkedHashMap 学习笔记

LinkedHashMap是Map接口的实现,结合了哈希表和链表,提供可预测的迭代顺序。通过accessOrder参数可以选择按照插入顺序或访问顺序排序。它可以重写removeEldestEntry方法以在达到特定条件时删除最老条目。LinkedHashMap的数据结构包含before和after属性,用于维护双向队列,允许在队尾高效插入元素。

LinkedHashMap 在 Map 集合框架的位置

LinkedHashMap

LinkedHashMap简介

LinkedHashMap是Map 接口的 哈希表(hash table) 和 链表(linked list) 的实现,具有可预测的迭代顺序。此实现与 HashMap 的不同之处在于,它维护一个双链接列表,该列表贯穿其所有条目。这个链表定义了迭代的顺序,通常是键值插入到 map 中的插入顺序(insertion-order). 请注意,如果键重新插入到 map 中,则插入顺序不受影响。

在遍历LinkedHashMap时,不会像遍历 HashMap 和 Hashtable 所得到的遍历顺序是不确定的。而且LinkedHashMap在遍历有顺序保证的同时,不会像TreeMap那样招致额外的开销。它可以用来拷贝已有的map, 不用考虑这个被拷贝的map对象原来的实现方式。拷贝出来的map对象和原始的map对象的顺序是一致的。

     void foo(Map m) {
   
   
         Map copy = new LinkedHashMap(m);
         ...
     }

写一个测试方法跑一下看下结果:

import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.Map;

public class LinkedHashMapTest {
   
   
  public static void main(String args[]) {
   
   
      Map<Integer, Integer> map = new HashMap();
      for(int i=1; i<5; i++) {
   
   
          map.put(i, i*i);
      }
      for(int i=1; i>-5; i--) {
   
   
          map.put(i, i*i);
      }
      System.out.println(map);
      System.out.println(map);
      System.out.println(map);
      System.out.println("-----------------copy from map -----------------------");
      LinkedHashMap<Integer,Integer> copy = new LinkedHashMap<Integer, Integer>(map);
      System.out.println(copy);
      Map<Integer, Integer> linkedHashMap = new LinkedHashMap();
      for(int i=1; i<5; i++) {
   
   
          linkedHashMap.put(i, i*i);
      }
      for(int i=1; i>-5; i--) {
   
   
          linkedHashMap.put(i, i*i);
      }
      System.out.println("-----------------------------------------");
      System.out.println(linkedHashMap);
      System.out.println("---------- put exist key again ---------------------");
      for(int i=1; i<5; i++) {
   
   
          linkedHashMap.put(i, i*i);
      }
      System.out.println(linkedHashMap);
      System.out.println("--- remove exist key and put again, keep insert order ----");
      linkedHashMap.remove(3);
      linkedHashMap.put(3, 9);
      System.out.println(linkedHashMap);
  }
}

输出内容:

{
   
   0=0, -1=1, 1=1, -2=4, 2=4, -3=9, 3=9, -4=16, 4=16}
<think>好的,用户现在请求关于“JAVA学习笔记”的介绍。我需要回顾之前的对话历史,看看用户之前问过什么,以便更好地理解他们的需求。之前用户询问了注解(Annotation)的相关内容,我给出了详细的回答,涵盖了注解的核心特性、标准注解示例、元注解、框架应用、自定义注解以及与注释的区别。现在用户可能希望系统地学习Java,需要一份学习笔记作为指南。 首先,我需要确定用户的学习阶段。他们可能已经对Java有一定的基础,因为之前的问题是关于注解的,属于较为高级的主题。但学习笔记通常涵盖从基础到进阶的内容,所以需要全面覆盖。同时,用户可能希望这份笔记结构清晰,便于逐步学习,并且包含实际应用示例,以帮助理解和实践。 接下来,我需要考虑用户可能需要的知识点。Java的学习路径通常包括基础语法、面向对象、核心类库、高级特性(如集合、IO、多线程)、框架使用(如Spring)、JVM原理以及开发工具等。结合之前的回答,用户可能对框架和注解部分特别感兴趣,所以可以适当强调这些部分,但也不能忽略基础。 另外,用户提到“学习笔记”,这意味着内容需要简洁明了,重点突出,可能包括注意事项、最佳实践和常见问题。例如,在基础语法部分,要强调代码规范和常见错误;在面向对象部分,要区分抽象类与接口的应用场景;在多线程部分,需要解释线程安全问题和解决方案。 还要注意用户之前提到的格式要求:行内公式用$...$,独立公式用$$...$$,并且使用中文回答。虽然Java学习笔记可能涉及较少的数学公式,但在某些部分,如算法复杂度或数据结构中,可能需要使用LaTeX格式。例如,在讲解时间复杂度时,可以用$O(n)$表示。 需要确保内容结构清晰,分章节列出,每个部分有子点,并附上代码示例。例如,在面向对象部分,可以给出类和对象的定义示例;在集合框架部分,展示ArrayList和HashMap的使用;在注解部分,回顾之前的内容并扩展自定义注解的使用。 还需要注意用户可能的实际应用需求,比如框架的使用和开发工具,这部分可以结合之前的注解内容,展示Spring中的注解应用,如@Component、@Autowired等,增强实用性。 最后,总结部分要概括Java学习的关键点,并给出学习建议,比如结合项目实践、理解JVM原理等,帮助用户规划学习路径。 需要检查是否所有内容符合格式要求,尤其是LaTeX部分是否正确应用,代码示例是否用正确的语法高亮,以及是否使用表格和列表来增强可读性。确保回答真实可靠,结构合理,帮助用户系统地掌握Java知识。</think>$$Java学习路径:\begin{cases} 基础语法 \rightarrow 面向对象 \rightarrow 核心API \rightarrow 高级特性 \rightarrow 框架应用 \rightarrow JVM原理 \end{cases}$$ --- ### 一、基础语法核心要点 #### 1. 数据类型与变量 - **8种基本类型** ```java int num = 10; // 32位整数 double price = 9.8; // 双精度浮点 boolean flag = true; // 布尔值 ``` - **引用类型** 对象、数组、字符串(`String` 为不可变类) #### 2. 流程控制 - **三元运算符** ```java int max = (a > b) ? a : b; // 替代简单if-else ``` - **增强for循环** ```java for (String item : list) { System.out.println(item); } ``` #### 3. 注意事项 - 避免魔法数字(用常量替代如 `MAX_COUNT`) - 字符串比较必须用 `equals()`,而非 `==` - `switch` 支持字符串(JDK7+)和枚举 --- ### 二、面向对象编程(OOP) #### 1. 类与对象 ```java public class Student { private String name; // 封装特性 public void setName(String name) { this.name = name; } } ``` #### 2. 继承与多态 - **方法重写规则** 子类方法访问权限 ≥ 父类,返回类型协变(JDK5+) - **抽象类 vs 接口** | | 抽象类 | 接口(JDK8+) | |----------|------------------------|-------------------------| | 成员变量 | 可包含非静态变量 | 默认 `public static final` | | 方法实现 | 可包含具体方法 | 支持 `default` 方法 | #### 3. 设计模式基础 - **单例模式(饿汉式)** ```java public class Singleton { private static final Singleton instance = new Singleton(); private Singleton() {} public static Singleton getInstance() { return instance; } } ``` --- ### 三、核心类库必知 #### 1. 集合框架 - **List vs Set vs Map** | 接口 | 特点 | 实现类 | |--------|-----------------------|-----------------------| | `List` | 有序可重复 | `ArrayList`, `LinkedList` | | `Set` | 无序唯一 | `HashSet`, `TreeSet` | | `Map` | 键值对存储 | `HashMap`, `LinkedHashMap` | - **遍历Map** ```java for (Map.Entry<String, Integer> entry : map.entrySet()) { System.out.println(entry.getKey() + ": " + entry.getValue()); } ``` #### 2. IO流体系 - **字节流 vs 字符流** | 类型 | 父类 | 典型场景 | |----------|-----------------|-----------------------| | 字节流 | `InputStream` | 图片、视频等二进制文件 | | 字符流 | `Reader` | 文本文件(自动处理编码) | --- ### 四、高级特性精要 #### 1. 多线程编程 - **创建线程的三种方式** ```java // 方式1:继承Thread类 class MyThread extends Thread { public void run() { /*...*/ } } // 方式2:实现Runnable接口 new Thread(() -> System.out.println("Lambda表达式")).start(); // 方式3:Callable + FutureTask(可获取返回值) ``` - **线程安全解决方案** - 同步代码块:`synchronized(obj) { ... }` - 使用 `ReentrantLock` 锁 - `ConcurrentHashMap` 替代 `HashMap` #### 2. 反射机制 - **动态获取类信息** ```java Class<?> clazz = Class.forName("com.example.User"); Method method = clazz.getMethod("getName"); Object obj = clazz.newInstance(); method.invoke(obj); // 调用方法 ``` --- ### 五、框架应用示例(Spring Boot) #### 1. 控制层注解 ```java @RestController @RequestMapping("/api") public class UserController { @Autowired // 自动注入 private UserService userService; @GetMapping("/{id}") public User getUser(@PathVariable Long id) { return userService.findById(id); } } ``` #### 2. 事务管理 ```java @Service public class OrderService { @Transactional(rollbackFor = Exception.class) // 声明式事务 public void createOrder(Order order) { // 数据库操作 } } ``` --- ### 六、JVM内存模型(简图) $$JVM内存分区 \approx \begin{cases} \text{线程共享区} \begin{cases} 方法区(元数据) \\ 堆(对象实例) \end{cases} \\ \text{线程私有区} \begin{cases} 虚拟机栈(方法调用) \\ 本地方法栈 \\ 程序计数器 \end{cases} \end{cases}$$ --- ### 七、开发工具推荐 | 工具类型 | 推荐工具 | 核心功能 | |----------------|---------------------|----------------------------| | IDE | IntelliJ IDEA | 智能代码提示、重构、调试 | | 构建工具 | Maven/Gradle | 依赖管理、项目构建 | | 版本控制 | Git | 代码托管、分支管理 | | 测试框架 | JUnit 5 | 单元测试、参数化测试 | --- ### 八、学习建议 1. **代码规范** 遵循阿里巴巴Java开发手册(避免`魔鬼数字`、合理命名) 2. **调试技巧** 使用IDEA断点功能(条件断点、表达式评估) 3. **性能优化** - 避免在循环内创建大量对象 - 使用`StringBuilder`处理字符串拼接 4. **学习路线** 基础 → 数据库 → Web开发 → 分布式(Spring Cloud)→ 源码阅读 --- $$总结:Java学习 \propto \begin{cases} 1.\ 面向对象思想的理解深度 \\ 2.\ 对JVM运行机制的掌握 \\ 3.\ 框架原理与实践的结合能力 \end{cases} \quad (关键:多写代码+阅读优秀源码)$$
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值