Map ,HashMap , TreeMap , TreeMap 默认排序

本文介绍了 Java 中三种 Map 的排序特性:HashMap 按 HashCode 排序,无固定顺序;TreeMap 实现 SortedMap 接口,按 Key 的自然顺序或自定义 Comparator 排序;LinkedHashMap 继承 HashMap,按插入顺序或访问顺序排序。

目录

 

总结来说:

细节描述:

Java

输出结果


总结来说:

HashMap是按照HashCode 排序,莫名其妙的顺序。 
TreeMap是按照自身的顺序排序,比如数字的话,按照数字升序,ascII等。 
LinkedHashMap是按照先进先出的顺序。

细节描述:

HashMap 的一个功能缺点是它的无序性,被存入到 HashMap 中的元素,在遍历 HashMap 时,其输出是无序的。如果希望元素保持输入的顺序,可以使用 LinkedHashMap 替代。

LinkedHashMap 继承自 HashMap,具有高效性,同时在 HashMap 的基础上,又在内部增加了一个链表,用以存放元素的顺序。

HashMap 通过 hash 算法可以最快速地进行 Put() 和 Get() 操作。TreeMap 则提供了一种完全不同的 Map 实现。从功能上讲,TreeMap 有着比 HashMap 更为强大的功能,它实现了 SortedMap 接口,这意味着它可以对元素进行排序。TreeMap 的性能略微低于 HashMap。如果在开发中需要对元素进行排序,那么使用 HashMap 便无法实现这种功能,使用 TreeMap 的迭代输出将会以元素顺序进行。LinkedHashMap 是基于元素进入集合的顺序或者被访问的先后顺序排序,TreeMap 则是基于元素的固有顺序 (由 Comparator 或者 Comparable 确定)。

LinkedHashMap 是根据元素增加或者访问的先后顺序进行排序,而 TreeMap 则根据元素的 Key 进行排序。
 

Java

import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.TreeMap;
 
/**
 * 随机保存参数
 * 按照key排序输出,验证有序性
 */
public class ATest {
	public static void main(String[] args) {
		Map<String, String> map = new HashMap<String, String>();
		map.put("c", "3");
		map.put("b", "2");
		map.put("a", "1");
		map.put("d", "4");
		
		System.out.print("HashMap:");
		for(String key : map.keySet()) {
			System.out.print(map.get(key) + " ");
		}
		
		Map<String, String> linkedMap = new LinkedHashMap<String, String>();
		linkedMap.put("c", "3");
		linkedMap.put("b", "2");
		linkedMap.put("a", "1");
		linkedMap.put("d", "4");
		
		System.out.print("LinkedHashMap:");
		for(String key : linkedMap.keySet()) {
			System.out.print(linkedMap.get(key) + " ");
		}
		
		Map<String, String> treeMap = new TreeMap<String, String>();
		treeMap.put("c", "3");
		treeMap.put("b", "2");
		treeMap.put("a", "1");
		treeMap.put("d", "4");
		
		System.out.print("TreeMap:");
		for(String key : treeMap.keySet()) {
			System.out.print(treeMap.get(key) + " ");
		}
	}
}

输出结果

HashMap:1 2 3 4 LinkedHashMap:3 2 1 4 TreeMap:1 2 3 4 

 

参考文档:原文转自

http://lionkingzw-hotmail-com.javaeye.com/blog/708455

https://blog.youkuaiyun.com/zhuhao717/article/details/47444763

### 数据结构特点与区别 #### Stack Stack 是一种后进先出(LIFO, Last In First Out)的数据结构。它通常基于数组或链表实现,支持的主要操作包括 `push`(将元素压入栈顶)、`pop`(从栈顶移除元素)和 `peek`(查看栈顶元素而不移除)。Stack 的特点是只允许在一端进行插入和删除操作[^1]。 ```java Stack<Integer> stack = new Stack<>(); stack.push(1); // 入栈 stack.pop(); // 出栈 ``` #### List List 是一种有序集合,允许存储重复元素,并且可以通过索引访问元素。Java 中最常用的实现类是 `ArrayList` 和 `LinkedList`。`ArrayList` 基于动态数组实现,适合随机访问;`LinkedList` 基于双向链表实现,适合频繁的插入和删除操作[^2]。 ```java List<String> list = new ArrayList<>(); list.add("A"); // 添加元素 list.get(0); // 根据索引获取元素 ``` #### Map Map 是一种键值对(Key-Value)存储结构,不允许键重复。常见的实现有 `HashMap`、`TreeMap` 和 `LinkedHashMap`。Map 的特点是通过键快速查找对应的值[^3]。 #### Queue Queue 是一种先进先出(FIFO, First In First Out)的数据结构,支持的主要操作包括 `offer`(添加元素到队尾)、`poll`(移除队首元素)和 `peek`(查看队首元素而不移除)。Java 中常见的实现类有 `LinkedList` 和 `PriorityQueue`[^4]。 ```java Queue<String> queue = new LinkedList<>(); queue.offer("A"); // 入队 queue.poll(); // 出队 ``` #### HashMap HashMap 是基于哈希表实现的 Map 接口实现类,其数据结构在 JDK 1.8 中为 **数组 + 链表 + 红黑树**。当链表长度超过阈值(默认为 8)时,链表会转换为红黑树以提高性能。HashMap 不保证键值对的顺序,但提供了非常快的插入、删除和查找速度[^5]。 ```java Map<String, Integer> map = new HashMap<>(); map.put("key", 1); // 插入键值对 map.get("key"); // 获取值 ``` #### TreeMap TreeMap 是基于红黑树实现的 Map 接口实现类,能够按照键的自然顺序或自定义比较器排序TreeMap 提供了有序的键值对访问,因此在需要按键排序的场景中表现优异。然而,由于红黑树的特性,TreeMap 的插入、删除和查找操作的时间复杂度为 O(log n)[^6]。 ```java Map<String, Integer> map = new TreeMap<>(); map.put("key", 1); // 插入键值对 map.firstKey(); // 获取最小键 ``` --- ### 数据结构特点总结 | 数据结构 | 特点 | 时间复杂度(常见操作) | |----------|----------------------------------------------------------------------------------------|------------------------| | Stack | 后进先出(LIFO),仅在一端操作 | O(1) | | List | 有序集合,支持随机访问和重复元素 | O(1)(访问),O(n)(插入/删除) | | Map | 键值对存储,通过键快速查找值 | O(1)(HashMap),O(log n)(TreeMap) | | Queue | 先进先出(FIFO),支持队列操作 | O(1) | | HashMap | 基于哈希表,不保证顺序,提供快速的插入、删除和查找 | O(1) | | TreeMap | 基于红黑树,按键排序,提供有序的键值对访问 | O(log n) | --- ###
评论 5
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值