HashMap优雅的初始化方式以及引申

相信很多人和笔者一样,经常会做一些数组的初始化工作,也肯定会经常用到集合类。假如我现在要初始化一个String类型的数组,可以很方便的使用如下代码:

 String [] strs = {"Tom","Jack"};

但是我相信很多人在初始化HashMap的时候是使用如下的方式:

  Map<String, Object> map = new HashMap<String, Object>();
  map.put("name", "June");  
  map.put("age", 12);

上面这段代码个人觉得略显啰嗦,其实还有另外一种优雅的初始化方式:

  Map<String, Object> map = new HashMap<String, Object>() {
      {
          put("name", "June");  
          put("age", 12);  
      }
  };

这边有必要说清楚两个大括号表示的是啥意思,是一种什么语法呢?其实,外层的一组“{}”表示的是一个匿名类,内层的一对“{}”表示的是实例初始化块,然后这边还有一点需要明白,实例初始化块的代码在编译器编译过后,是放在类的构造函数里面的,并且是在原构造函数代码的前面。

<think>嗯,用户想了解Java相关的数据结构的实现与用法。之前我提供的回答里提到了快速排序,但用户现在更关注数据结构本身。我需要结合用户提到的引用内容,比如LRU算法和栈实现四则运算的例子,来组织回答。首先,用户给出的引用1提到了LRU算法的实现,使用LinkedList。这可能是一个链表结构的应用案例。引用2是关于栈的应用,用两个栈来实现计算器。这说明用户可能对数据结构的具体应用场景感兴趣。因此,我应该列举几种常见的Java数据结构,并分别说明它们的实现方式和典型用法,同时结合这些例子。接下来,我需要确定哪些数据结构是Java中基础且重要的。比如数组、链表、栈、队列、哈希表、树、堆、图等。但用户可能更关注集合框架中的结构,比如ArrayList、LinkedList、HashMap、TreeMap、PriorityQueue等。每个结构需要简要说明实现原理,并用代码示例展示用法。需要注意的是,用户可能希望了解如何自己实现这些结构,而不仅仅是使用Java内置的类。例如,引用1中的LRU实现用了LinkedList,但可能还需要结合哈希表来优化查找速度。这时候可以提到LinkedHashMap的实现原理,或者手动用双向链表和哈希表实现LRU。 另外,用户提到的栈实现计算器的例子,可以引申到栈的其他应用,比如括号匹配、函数调用栈等。这样能帮助用户理解数据结构在不同场景下的作用。还要考虑用户可能的疑问,比如何时选择ArrayList还是LinkedList,HashMap和HashTable的区别,树结构的应用等。因此,在回答中需要对比不同结构的优缺点,帮助用户做出合适的选择。最后,生成的相关问题要引导用户深入思考,比如性能分析、优化方法、应用场景等,类似之前的快速排序问题。这样能够覆盖用户可能感兴趣的后续内容。</think># Java数据结构实现与用法详解 ## 一、线性数据结构 ### 1. 数组与ArrayList 数组是Java最基础的数据结构,ArrayList基于动态数组实现: ```java // 初始化 ArrayList<Integer> list = new ArrayList<>(); list.add(10); // 尾部插入 list.get(0); // 随机访问 list.remove(0);// 删除元素 ``` 动态扩容机制:初始容量10,扩容时新容量=旧容量*1.5[^1] ### 2. 链表与LinkedList 双向链表实现,适合频繁插入删除场景: ```java LinkedList<String> linkedList = new LinkedList<>(); linkedList.addFirst("A"); // 头部插入 linkedList.addLast("Z"); // 尾部插入 linkedList.removeLast(); // 删除尾部 ``` ## 二、栈与队列 ### 1. 栈实现 基于数组的栈实现: ```java class ArrayStack { private int[] data; private int top = -1; public void push(int value) { data[++top] = value; } public int pop() { return data[top--]; } } ``` 应用场景:括号匹配$(\text{例如:} \{(a+b)*c\})$、表达式求值[^2] ### 2. 队列实现 循环队列实现: ```java class CircularQueue { private int[] data; private int front = 0; private int rear = 0; public boolean enqueue(int value) { if ((rear+1)%size == front) return false; data[rear] = value; rear = (rear+1)%size; return true; } } ``` ## 三、哈希结构 ### 1. HashMap实现 哈希表+红黑树(JDK8): $$ \text{哈希函数:} h(key) = key.hashCode() \& (n-1) $$ ```java HashMap<String, Integer> map = new HashMap<>(); map.put("apple", 1); map.get("apple"); ``` ### 2. LinkedHashMap实现 继承HashMap并维护双向链表: ```java LinkedHashMap<Integer, String> lruCache = new LinkedHashMap<>(16, 0.75f, true) { protected boolean removeEldestEntry(Map.Entry eldest) { return size() > 100; } }; ``` LRU缓存淘汰算法实现原理[^1] ## 四、树形结构 ### 1. 二叉搜索树 节点定义: ```java class TreeNode { int val; TreeNode left; TreeNode right; } ``` 中序遍历时间复杂度$O(n)$,空间复杂度$O(h)$,其中$h$为树高 ### 2. 堆结构 PriorityQueue实现最小堆: ```java PriorityQueue<Integer> minHeap = new PriorityQueue<>(); minHeap.offer(5); minHeap.poll(); ``` ## 五、图结构 邻接表实现: ```java class Graph { Map<Integer, List<Integer>> adjList = new HashMap<>(); public void addEdge(int src, int dest) { adjList.computeIfAbsent(src, k -> new ArrayList<>()).add(dest); } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值