登录
注册
开源
企业版
高校版
搜索
帮助中心
使用条款
关于我们
开源
企业版
高校版
私有云
模力方舟
AI 队友
登录
注册
Gitee 2025 年度开源项目评选中
代码拉取完成,页面将自动刷新
捐赠
捐赠前请先登录
取消
前往登录
扫描微信二维码支付
取消
支付完成
支付提示
将跳转至支付宝完成支付
确定
取消
Watch
不关注
关注所有动态
仅关注版本发行动态
关注但不提醒动态
3
Star
45
Fork
21
DreamCoders
/
CoderGuide
代码
Issues
1169
Pull Requests
0
Wiki
统计
流水线
服务
JavaDoc
PHPDoc
质量分析
Jenkins for Gitee
腾讯云托管
腾讯云 Serverless
悬镜安全
阿里云 SAE
Codeblitz
SBOM
我知道了,不再自动展开
更新失败,请稍后重试!
移除标识
内容风险标识
本任务被
标识为内容中包含有代码安全 Bug 、隐私泄露等敏感信息,仓库外成员不可访问
如何决定使用 HashMap 还是 TreeMap?
待办的
#IAJKPI
陌生人
拥有者
创建于
2024-08-13 10:04
<h3 style="text-align: start;"><span style="color: inherit;">介绍</span></h3><p style="text-align: start;"><span style="color: rgb(233, 105, 0); background-color: rgb(248, 248, 248);"><code>TreeMap<K,V></code></span>的Key值是要求实现<span style="color: rgb(233, 105, 0); background-color: rgb(248, 248, 248);"><code>java.lang.Comparable</code></span>,所以迭代的时候TreeMap默认是按照Key值升序排序的;TreeMap的实现是基于红黑树结构。适用于按自然顺序或自定义顺序遍历键(key)。</p><p style="text-align: start;"><span style="color: rgb(233, 105, 0); background-color: rgb(248, 248, 248);"><code>HashMap<K,V></code></span>的Key值实现散列<span style="color: rgb(233, 105, 0); background-color: rgb(248, 248, 248);"><code>hashCode()</code></span>,分布是散列的、均匀的,不支持排序;数据结构主要是桶(数组),链表或红黑树。适用于在Map中插入、删除和定位元素。</p><h3 style="text-align: start;"><span style="color: inherit;">结论</span></h3><p style="text-align: start;">如果你需要得到一个有序的结果时就应该使用TreeMap(因为HashMap中元素的排列顺序是不固定的)。除此之外,由于HashMap有更好的性能,所以大多不需要排序的时候我们会使用HashMap。</p><h3 style="text-align: start;"><span style="color: inherit;">拓展</span></h3><p style="text-align: start;"><span style="color: rgb(122, 68, 66);"><strong>1、HashMap 和 TreeMap 的实现</strong></span></p><p style="text-align: start;"><strong>HashMap:</strong>基于哈希表实现。使用HashMap要求添加的键类明确定义了<span style="color: rgb(233, 105, 0); background-color: rgb(248, 248, 248);"><code>hashCode()</code></span>和<span style="color: rgb(233, 105, 0); background-color: rgb(248, 248, 248);"><code>equals()</code></span>[可以重写<span style="color: rgb(233, 105, 0); background-color: rgb(248, 248, 248);"><code>hashCode()</code></span>和<span style="color: rgb(233, 105, 0); background-color: rgb(248, 248, 248);"><code>equals()</code></span>],为了优化HashMap空间的使用,您可以调优初始容量和负载因子。</p><ul><li style="text-align: justify;">HashMap(): 构建一个空的哈希映像</li><li style="text-align: justify;">HashMap(Map m): 构建一个哈希映像,并且添加映像m的所有映射</li><li style="text-align: justify;">HashMap(int initialCapacity): 构建一个拥有特定容量的空的哈希映像</li><li style="text-align: justify;">HashMap(int initialCapacity, float loadFactor): 构建一个拥有特定容量和加载因子的空的哈希映像</li></ul><p style="text-align: start;"><strong>TreeMap:</strong><span style="font-size: 15px;">基于红黑树实现。TreeMap没有调优选项,因为该树总处于平衡状态。</span></p><ul><li style="text-align: justify;">TreeMap():构建一个空的映像树</li><li style="text-align: justify;">TreeMap(Map m): 构建一个映像树,并且添加映像m中所有元素</li><li style="text-align: justify;">TreeMap(Comparator c): 构建一个映像树,并且使用特定的比较器对关键字进行排序</li><li style="text-align: justify;">TreeMap(SortedMap s): 构建一个映像树,添加映像树s中所有映射,并且使用与有序映像s相同的比较器排序</li></ul><p style="text-align: start;"><span style="color: rgb(122, 68, 66);"><strong>2、HashMap 和 TreeMap 都是非线程安全</strong></span></p><p style="text-align: start;">HashMap继承AbstractMap抽象类,TreeMap继承自SortedMap接口。</p><p style="text-align: start;"><span style="color: inherit;"><strong>AbstractMap抽象类:</strong></span>覆盖了equals()和hashCode()方法以确保两个相等映射返回相同的哈希码。如果两个映射大小相等、包含同样的键且每个键在这两个映射中对应的值都相同,则这两个映射相等。映射的哈希码是映射元素哈希码的总和,其中每个元素是Map.Entry接口的一个实现。因此,不论映射内部顺序如何,两个相等映射会报告相同的哈希码。</p><p style="text-align: start;"><span style="color: inherit;"><strong>SortedMap接口:</strong></span>它用来保持键的有序顺序。SortedMap接口为映像的视图(子集),包括两个端点提供了访问方法。除了排序是作用于映射的键以外,处理SortedMap和处理SortedSet一样。添加到SortedMap实现类的元素必须实现Comparable接口,否则您必须给它的构造函数提供一个Comparator接口的实现。TreeMap类是它的唯一一个实现。</p><p style="text-align: start;"><span style="color: rgb(122, 68, 66);"><strong>3、TreeMap中默认是按照升序进行排序的,如何让他降序</strong></span></p><p style="text-align: start;">通过自定义的比较器来实现</p><p style="text-align: start;">定义一个比较器类,实现Comparator接口,重写compare方法,有两个参数,这两个参数通过调用compareTo进行比较,而compareTo默认规则是:</p><blockquote style="text-align: start;">如果参数字符串等于此字符串,则返回 0 值;如果此字符串小于字符串参数,则返回一个小于 0 的值;如果此字符串大于字符串参数,则返回一个大于 0 的值。</blockquote><p style="text-align: start;">自定义比较器时,在返回时多添加了个负号,就将比较的结果以相反的形式返回,代码如下:</p><pre><code class="language-java">static class MyComparator implements Comparator{ @Override public int compare(Object o1, Object o2) { // TODO Auto-generated method stub String param1 = (String)o1; String param2 = (String)o2; return -param1.compareTo(param2); } }</code></pre><p><span style="color: rgb(62, 62, 62); background-color: rgb(255, 255, 255); font-size: 15px;">之后,通过MyComparator类初始化一个比较器实例,将其作为参数传进TreeMap的构造方法中:</span></p><pre><code class="language-java">MyComparator comparator = new MyComparator(); Map<String,String> map = new TreeMap<String,String>(comparator);</code></pre><p><span style="color: rgb(62, 62, 62); background-color: rgb(255, 255, 255); font-size: 15px;">这样,我们就可以使用自定义的比较器实现降序了</span></p><pre><code class="language-java">public class MapTest { public static void main(String[] args) { //初始化自定义比较器 MyComparator comparator = new MyComparator(); //初始化一个map集合 Map<String,String> map = new TreeMap<String,String>(comparator); //存入数据 map.put("a", "a"); map.put("b", "b"); map.put("f", "f"); map.put("d", "d"); map.put("c", "c"); map.put("g", "g"); //遍历输出 Iterator iterator = map.keySet().iterator(); while(iterator.hasNext()){ String key = (String)iterator.next(); System.out.println(map.get(key)); } } static class MyComparator implements Comparator{ @Override public int compare(Object o1, Object o2) { // TODO Auto-generated method stub String param1 = (String)o1; String param2 = (String)o2; return -param1.compareTo(param2); } } }</code></pre><p><br></p>
<h3 style="text-align: start;"><span style="color: inherit;">介绍</span></h3><p style="text-align: start;"><span style="color: rgb(233, 105, 0); background-color: rgb(248, 248, 248);"><code>TreeMap<K,V></code></span>的Key值是要求实现<span style="color: rgb(233, 105, 0); background-color: rgb(248, 248, 248);"><code>java.lang.Comparable</code></span>,所以迭代的时候TreeMap默认是按照Key值升序排序的;TreeMap的实现是基于红黑树结构。适用于按自然顺序或自定义顺序遍历键(key)。</p><p style="text-align: start;"><span style="color: rgb(233, 105, 0); background-color: rgb(248, 248, 248);"><code>HashMap<K,V></code></span>的Key值实现散列<span style="color: rgb(233, 105, 0); background-color: rgb(248, 248, 248);"><code>hashCode()</code></span>,分布是散列的、均匀的,不支持排序;数据结构主要是桶(数组),链表或红黑树。适用于在Map中插入、删除和定位元素。</p><h3 style="text-align: start;"><span style="color: inherit;">结论</span></h3><p style="text-align: start;">如果你需要得到一个有序的结果时就应该使用TreeMap(因为HashMap中元素的排列顺序是不固定的)。除此之外,由于HashMap有更好的性能,所以大多不需要排序的时候我们会使用HashMap。</p><h3 style="text-align: start;"><span style="color: inherit;">拓展</span></h3><p style="text-align: start;"><span style="color: rgb(122, 68, 66);"><strong>1、HashMap 和 TreeMap 的实现</strong></span></p><p style="text-align: start;"><strong>HashMap:</strong>基于哈希表实现。使用HashMap要求添加的键类明确定义了<span style="color: rgb(233, 105, 0); background-color: rgb(248, 248, 248);"><code>hashCode()</code></span>和<span style="color: rgb(233, 105, 0); background-color: rgb(248, 248, 248);"><code>equals()</code></span>[可以重写<span style="color: rgb(233, 105, 0); background-color: rgb(248, 248, 248);"><code>hashCode()</code></span>和<span style="color: rgb(233, 105, 0); background-color: rgb(248, 248, 248);"><code>equals()</code></span>],为了优化HashMap空间的使用,您可以调优初始容量和负载因子。</p><ul><li style="text-align: justify;">HashMap(): 构建一个空的哈希映像</li><li style="text-align: justify;">HashMap(Map m): 构建一个哈希映像,并且添加映像m的所有映射</li><li style="text-align: justify;">HashMap(int initialCapacity): 构建一个拥有特定容量的空的哈希映像</li><li style="text-align: justify;">HashMap(int initialCapacity, float loadFactor): 构建一个拥有特定容量和加载因子的空的哈希映像</li></ul><p style="text-align: start;"><strong>TreeMap:</strong><span style="font-size: 15px;">基于红黑树实现。TreeMap没有调优选项,因为该树总处于平衡状态。</span></p><ul><li style="text-align: justify;">TreeMap():构建一个空的映像树</li><li style="text-align: justify;">TreeMap(Map m): 构建一个映像树,并且添加映像m中所有元素</li><li style="text-align: justify;">TreeMap(Comparator c): 构建一个映像树,并且使用特定的比较器对关键字进行排序</li><li style="text-align: justify;">TreeMap(SortedMap s): 构建一个映像树,添加映像树s中所有映射,并且使用与有序映像s相同的比较器排序</li></ul><p style="text-align: start;"><span style="color: rgb(122, 68, 66);"><strong>2、HashMap 和 TreeMap 都是非线程安全</strong></span></p><p style="text-align: start;">HashMap继承AbstractMap抽象类,TreeMap继承自SortedMap接口。</p><p style="text-align: start;"><span style="color: inherit;"><strong>AbstractMap抽象类:</strong></span>覆盖了equals()和hashCode()方法以确保两个相等映射返回相同的哈希码。如果两个映射大小相等、包含同样的键且每个键在这两个映射中对应的值都相同,则这两个映射相等。映射的哈希码是映射元素哈希码的总和,其中每个元素是Map.Entry接口的一个实现。因此,不论映射内部顺序如何,两个相等映射会报告相同的哈希码。</p><p style="text-align: start;"><span style="color: inherit;"><strong>SortedMap接口:</strong></span>它用来保持键的有序顺序。SortedMap接口为映像的视图(子集),包括两个端点提供了访问方法。除了排序是作用于映射的键以外,处理SortedMap和处理SortedSet一样。添加到SortedMap实现类的元素必须实现Comparable接口,否则您必须给它的构造函数提供一个Comparator接口的实现。TreeMap类是它的唯一一个实现。</p><p style="text-align: start;"><span style="color: rgb(122, 68, 66);"><strong>3、TreeMap中默认是按照升序进行排序的,如何让他降序</strong></span></p><p style="text-align: start;">通过自定义的比较器来实现</p><p style="text-align: start;">定义一个比较器类,实现Comparator接口,重写compare方法,有两个参数,这两个参数通过调用compareTo进行比较,而compareTo默认规则是:</p><blockquote style="text-align: start;">如果参数字符串等于此字符串,则返回 0 值;如果此字符串小于字符串参数,则返回一个小于 0 的值;如果此字符串大于字符串参数,则返回一个大于 0 的值。</blockquote><p style="text-align: start;">自定义比较器时,在返回时多添加了个负号,就将比较的结果以相反的形式返回,代码如下:</p><pre><code class="language-java">static class MyComparator implements Comparator{ @Override public int compare(Object o1, Object o2) { // TODO Auto-generated method stub String param1 = (String)o1; String param2 = (String)o2; return -param1.compareTo(param2); } }</code></pre><p><span style="color: rgb(62, 62, 62); background-color: rgb(255, 255, 255); font-size: 15px;">之后,通过MyComparator类初始化一个比较器实例,将其作为参数传进TreeMap的构造方法中:</span></p><pre><code class="language-java">MyComparator comparator = new MyComparator(); Map<String,String> map = new TreeMap<String,String>(comparator);</code></pre><p><span style="color: rgb(62, 62, 62); background-color: rgb(255, 255, 255); font-size: 15px;">这样,我们就可以使用自定义的比较器实现降序了</span></p><pre><code class="language-java">public class MapTest { public static void main(String[] args) { //初始化自定义比较器 MyComparator comparator = new MyComparator(); //初始化一个map集合 Map<String,String> map = new TreeMap<String,String>(comparator); //存入数据 map.put("a", "a"); map.put("b", "b"); map.put("f", "f"); map.put("d", "d"); map.put("c", "c"); map.put("g", "g"); //遍历输出 Iterator iterator = map.keySet().iterator(); while(iterator.hasNext()){ String key = (String)iterator.next(); System.out.println(map.get(key)); } } static class MyComparator implements Comparator{ @Override public int compare(Object o1, Object o2) { // TODO Auto-generated method stub String param1 = (String)o1; String param2 = (String)o2; return -param1.compareTo(param2); } } }</code></pre><p><br></p>
评论 (
0
)
登录
后才可以发表评论
状态
待办的
待办的
进行中
已完成
已关闭
负责人
未设置
标签
Java
未设置
标签管理
里程碑
未关联里程碑
未关联里程碑
Pull Requests
未关联
未关联
关联的 Pull Requests 被合并后可能会关闭此 issue
分支
未关联
未关联
master
开始日期   -   截止日期
-
置顶选项
不置顶
置顶等级:高
置顶等级:中
置顶等级:低
优先级
不指定
严重
主要
次要
不重要
参与者(1)
1
https://gitee.com/DreamCoders/CoderGuide.git
git@gitee.com:DreamCoders/CoderGuide.git
DreamCoders
CoderGuide
CoderGuide
点此查找更多帮助
搜索帮助
Git 命令在线学习
如何在 Gitee 导入 GitHub 仓库
Git 仓库基础操作
企业版和社区版功能对比
SSH 公钥设置
如何处理代码冲突
仓库体积过大,如何减小?
如何找回被删除的仓库数据
Gitee 产品配额说明
GitHub仓库快速导入Gitee及同步更新
什么是 Release(发行版)
将 PHP 项目自动发布到 packagist.org
评论
仓库举报
回到顶部
登录提示
该操作需登录 Gitee 帐号,请先登录后再操作。
立即登录
没有帐号,去注册