java基础36 双例集合Map下的HashMap和TreeMap集合
单例集合体系:
---------| collection 单例集合的根接口
--------------| List 如果实现了list接口的集合类,具备的特点:有序,可重复 注:集合中的有序不是指自然顺序,而是指添加进去的顺序与出来的顺序是一致的
------------------| ArrayList ArrayList底层维护了一个object数组的实现的。(线程不安全),特点:查询速度快,增删速度慢。(有序,可重复)
------------------| LinkedList LinkedList底层是使用链表结构实现的,线程不安全,特点:查询速度慢,增删速度快。(有序,可重复)
------------------| Vector(了解即可) 底层也是维护一个Object数组的实现的,实现与ArrayList是一样的,但是Vector是线程安全的,操作效率低
--------------| Set 如果实现了set接口的集合类,具备的特点:无序,不可重复 注:集合中的无序不是指自然顺序,而是指添加元素进去的顺序与元素出来的顺序是不一致的
------------------| HashSet 底层是用于一个哈希表支持的,线程不安全,特点:存储速度块
------------------| TreeSet 底层是使用红黑树(二叉树)数据结构实现的,线程不同步(即线程不安全),不能在多线程中共享,但可以使用synchroinzedMap()方法来实现同步。特点:会对元素进行排序存储(按自然顺序)
双例集合体系:
----------| Map 双例集合的根接口。如果是实现了Map接口的集合类,具备的特点:存储的数据都是以键值对形式存在的,键不可重复,值可以重复
--------------| HashMap 底层是基于哈希表实现的,HashMap允许键和值为null,线程不安全,特点:存储速度块
--------------| TreeMap 基于红黑数(二叉树)数据结构实现的,线程不同步(即线程不安全),特点:会对元素经行排序存储
--------------| HashTable(了解即可) 线程安全
一、HashMap集合
1.1、HashMap集合的一些常用方法
1.2、HashMap的存储原理
往HasMap集合中添加元素时,首先会调用键的hashCode()方法得到元素的哈西马值,然后经过运算在哈希表找到相应存储位置
情况1:如果算出的位置目前没有任何元素,那么该元素可以直接添加到哈希表中。
情况2:如果算出元素的位置已经存在其他元素,那么就会调用equals方法与该元素位置已存在的元素做一次比较;如过equals方法返回值是true,那么该元素是重复元素,不允许存储;如果返回值是false,那么该元素不是重复元素,则允许存储。
1.3、HashMap和HashSet的区别
相同点:
1.集合中元素都是无序,不可重复。且都要重写HashCode和equals方法进行判断比较。注:“无序”指添加元素进去(集合)的顺序与元素输出来的顺序是不一致的。指定的比较字段不可重复,但 非指定字段可重复
2.都是线程不安全的
不同点:
1.HashMap实现了Map接口;HashSet实现了Set接口。
2.HashMap是以键值对的形式储存的;HashSet存储的是对象。
3.HashMap比较快,因为使用的是唯一的键来获取对象;HashSet较HashMap来说,比较慢。
4.HashMap是使用put()方法将元素放入map集合中;而HashSet是使用add()方法将元素放入set集合中。
1.4、实例
例1 (没有重写HashCode和equals方法的结果:“110,狗娃”这个重复元素,两个都添加进map集合中)
package com.dhb.collection; import java.util.HashMap; /**
* @author DSHORE / 2018-5-30
*
*/
class Personnal{
int id;
String name; public Personnal(int id, String name) {
super();
this.id = id;
this.name = name;
}
@Override
public String toString() {
return "Personnal [id=" + id + ",name=" + name + "]";
} }
public class Demo22 {
public static void main(String[] args) {
HashMap<Personnal, String> map=new HashMap<Personnal, String>();
map.put(new Personnal(,"狗娃"),"");
map.put(new Personnal(,"狗剩"), "");
map.put(new Personnal(,"狗蛋"),"");
map.put(new Personnal(,"狗娃"),"");
System.out.println("集合中的元素:"+map);//返回值:{Personnal [id=330,name=狗蛋]=003, Personnal [id=220,name=狗剩]=002, Personnal [id=110,name=狗娃]=001, Personnal [id=110,name=狗娃]=007}
}
}
例2 (重写HashCode和equals方法后的结果:“110,狗娃”这个重复元素,只有一个添加进map集合中)
package com.dhb.collection; import java.util.HashMap; /**
* @author DSHORE / 2018-5-30
*
*/
class Personnal{
int id;
String name; public Personnal(int id, String name) {
super();
this.id = id;
this.name = name;
}
@Override
public String toString() {
return "Personnal [id=" + id + ",name=" + name + "]";
}
@Override
public int hashCode() {//重写hashCode方法
return this.id;
}
@Override
public boolean equals(Object obj) {//重写equals方法
Personnal p = (Personnal) obj;
return this.id == p.id; //指定的比较字段不可重复,但,非指定字段可重复
}
}
public class Demo22 {
public static void main(String[] args) {
HashMap<Personnal, String> map=new HashMap<Personnal, String>(); //注:“无序”指添加元素进去(集合)的顺序与元素输出来的顺序是不一致的。
map.put(new Personnal(,"狗娃"),""); //指定的比较字段不可重复,但,非指定字段可重复。 110是指定比较字段,狗娃不是
map.put(new Personnal(,"狗剩"), "");
map.put(new Personnal(,"狗蛋"),"");
map.put(new Personnal(,"狗娃"),"");
System.out.println("集合中的元素:"+map);//返回值:{Personnal [id=220,name=狗剩]=002, Personnal [id=110,name=狗娃]=007, Personnal [id=330,name=狗蛋]=003}
}
}
重写HashCode和equals方法后,例2比例1少了一个id为110的重复值
二、TreeMap集合
2.1、TreeMap集合的一些常用方法
2.2、TreeMap需要注意的事项
1.往TrreMap添加元素时候,如果元素本身具备自然顺序时,那么就按照自然顺序排列存储。
2.往TrreMap添加元素时候,如果元素本身不具备自然顺序,那么键所属的类必须要实现Comparable接口,把键比较的规则定义在CompareTo方法中。
3.往TrreMap添加元素时候,如果元素本身不具备自然顺序,键所属的类也没有实现Comparable接口,那么必须在创建TreeMap是传入一个比较器。
2.3、自定义比较器
自定一个比较器只需要实现接口 Comparator<T>即可,把元素与元素之间的比较规则定义在compare方法内即可
自定义比较器的格式:
class 类名 implements Comparator<T>{ }
实例 (通过自定义比较器来排序存储)
package com.dhb.collection; import java.util.Comparator;
import java.util.TreeMap; /**
* @author DSHORE / 2018-5-30
*
*/
class Emp3{
String name;
int salary;
public Emp3(String name,int salary) {
this.name=name;
this.salary=salary;
}
@Override
public String toString() {
return "Emp [name=" + name + ",salary=" + salary + "]";
}
}
//自定义比较器 作用:用于根据指定字段进行比较 排序存储
class MyComparator1 implements Comparator<Emp3>{ public int compare(Emp3 o1, Emp3 o2) {
return o1.salary-o2.salary;
}
}
public class Demo23 {
public static void main(String[] args) {
MyComparator1 mc=new MyComparator1();//创建比较器MyComparator1对象
TreeMap<Emp3, Integer> tm=new TreeMap<Emp3, Integer>(mc);
tm.put(new Emp3("张三",),);
tm.put(new Emp3("李四",), );
tm.put(new Emp3("王五",),);
tm.put(new Emp3("赵六",), ); System.out.println(tm);//返回值:{Emp [name=李四,salary=1000]=2, Emp [name=张三,salary=2000]=1, Emp [name=赵六,salary=5000]=4, Emp [name=王五,salary=36000]=3}
}
}
2.4、TreeMap和TreeSet的区别
相同点:
1.都是无序集合(添加进去和输出来的顺序不一样),但是,存储方式都是一样的,都是按自然顺序排序存储的。
2.都是非同步集合(线程不安全),因此他们不能在多线程之间共享,不过可以使用方法Collections.synchroinzedMap()来实现同步。
3.运行速度都要比Hash集合慢。
不同点:
1.TreeMap实现了Map接口;TreeSet实现了Set接口。
2.TreeMap是以键值对的形式储存的;TreeSet存储的是对象。
3.TreeMap是使用put()方法将元素放入map集合中;而TreeSet是使用add()方法将元素放入set集合中。
2.5、实例
通过实现Comparable<T>接口来 排序存储
package com.dhb.collection; import java.util.TreeMap; /**
* @author DSHORE / 2018-5-30
*
*/
class Emp4 implements Comparable<Emp4>{ //实现Comparable<T>接口
String name;//姓名
int salary;//工资
public Emp4(String name,int salary) {
this.name=name;
this.salary=salary;
}
@Override
public String toString() {
return "Emp [name=" + name + ",salary=" + salary + "]";
}
@Override
public int compareTo(Emp4 e) {//实现Comparable接口后,重写compareTo方法
return this.salary - e.salary;//用工资进行排序存储
}
}
public class Demo24 {
public static void main(String[] args) {
TreeMap<Emp4, Integer> tm=new TreeMap<Emp4, Integer>();
tm.put(new Emp4("张三",),);
tm.put(new Emp4("李四",), );
tm.put(new Emp4("王五",),);
tm.put(new Emp4("赵六",), ); System.out.println(tm);//返回值:{Emp [name=李四,salary=1000]=2, Emp [name=张三,salary=2000]=1, Emp [name=赵六,salary=5000]=4, Emp [name=王五,salary=36000]=3}
}
}
原创作者:DSHORE 作者主页:http://www.cnblogs.com/dshore123/ 原文出自:https://www.cnblogs.com/dshore123/p/9110016.html 欢迎转载,转载务必说明出处。(如果本文对您有帮助,可以点击一下右下角的 推荐,或评论,谢谢!) |
java基础36 双例集合Map下的HashMap和TreeMap集合的更多相关文章
- java基础35 双例集合Map及其常用方法
单例集合体系: ---------| collection 单例集合的根接口--------------| List 如果实现了list接口的集合类,具备的特点:有序,可重复 注:集合 ...
- 第5节:Java基础 - 必知必会(下)
第5节:Java基础 - 必知必会(下) 本小节是Java基础篇章的第三小节,主要讲述Java中的Exception与Error,JIT编译器以及值传递与引用传递的知识点. 一.Java中的Excep ...
- Java从入门到放弃18---Map集合/HashMap/LinkedHashMap/TreeMap/集合嵌套/Collections工具类常用方法
Java从入门到放弃18—Map集合/HashMap/LinkedHashMap/TreeMap/集合嵌套/Collections工具类常用方法01 Map集合Map集合处理键值映射关系的数据为了方便 ...
- java基础28 单例集合Collection下的List和Set集合
单例集合体系: ---------| collection 单例集合的根接口--------------| List 如果实现了list接口的集合类,具备的特点:有序,可重复 注:集合 ...
- java基础27 单例集合Collection及其常用方法
1.集合 集合是存储对象数据的集合容器 1.1.集合比数组的优势 1.集合可以存储任意类型的数据,数组只能存储同一种数据类型的数据 2.集合的长度是变化的,数组的长度是固定的 1.2.数组:存储 ...
- java基础(4)---引用数据类型(数组、字符串、集合)
一.数组 格式: int[] nums; 1. 数据类型[] 数组名称; 2. 数据类型 数组名称[]; (不太推荐) 动态初始化: new int[4] 数据类型[] 数组名称 = new 数据类 ...
- Java 基础常见知识点&面试题总结(下),2022 最新版!
你好,我是 Guide.秋招即将到来,我对 JavaGuide 的内容进行了重构完善,同步一下最新更新,希望能够帮助你. 前两篇: Java 基础常见知识点&面试题总结(上),2022 最新版 ...
- java单例模式和双例模式
今天朋友找我给做道题,双例模式,我是没听说过,都说是单例模式和多例模式, 也不知道双例模式什么时候用,就简单写了一个案例,不知道对不对,个人感觉蛮对的,双例就是单例+单例,废话不说了!!!! /* * ...
- JAVA 基础开发环境 vscode 搭建 Windows下VSCode编译运行简单java
JAVA 基础开发环境 vscode 搭建 来源 https://www.cnblogs.com/freewsf/p/7744728.html 对于使用 Visual Studio Code 的 Ja ...
随机推荐
- java多线程 -- 同步鎖
为了解决多线程安全问题在 Java 5.0 之前,协调共享对象的访问时可以使用的机制只有 synchronized 和 volatile .Java 5.0 后增加了一些新的机制,但并不是一种替代内置 ...
- 「CodePlus 2017 12 月赛」火锅盛宴(模拟+树状数组)
1A,拿来练手的好题 用一个优先队列按煮熟时间从小到大排序,被煮熟了就弹出来. 用n个vector维护每种食物的煮熟时间,显然是有序的. 用树状数组维护每种煮熟食物的数量. 每次操作前把优先队列里煮熟 ...
- php中文网在这里给大家汇总了最热门最全面的php面试题
PHP面试题汇总 视频版: 1.<最新PHP面试视频教程> http://www.php.cn/course/876.html 2.<PHP经典算法面试题> http://ww ...
- 初学SQL语句练习1
--[1 ]查询出每个月倒数第三天受雇的所有员工SELECT * FROM EMP WHERE HIREDATE=LAST_DAY(HIREDATE)-2; --[2 ]找出早于30 年前受雇的员工S ...
- sqlalchemy多外键关联
一.前言 如果有张表A的多个字段关联另一张表B的一个字段,就如同一个客户表的账单地址和发货地址,同时关联地址表中的id字段. 二.事例 # -*- coding: UTF-8 -*- from sql ...
- Kubelet资源预留
目录 Kubelet Node Allocatable 配置参数 配置示例 Kubelet Node Allocatable Kubelet Node Allocatable用来为Kube组件和Sys ...
- kubernetes node管理
目录 Node的扩缩容 删除node节点 Node的隔离与恢复 通过配置文件实现 通过命令行的方式实现 恢复 更新资源对象的label 给一个node添加一个label 将pod调度到指定的node ...
- P3014 [USACO11FEB]牛线Cow Line && 康托展开
康托展开 康托展开为全排列到一个自然数的映射, 空间压缩效率很高. 简单来说, 康托展开就是一个全排列在所有此序列全排列字典序中的第 \(k\) 大, 这个 \(k\) 即是次全排列的康托展开. 康托 ...
- Tomcat权威指南-读书摘要系列2
2. 配置Tomcat 2.1. 重定向Web应用程序的目录 将工程文件与Tomcat分离 复制conf和webapps文件夹到分离目录: 配置CATALINA_BASE环境变量,值为分离目录: 2. ...
- PHP超级全局变量
$_get:地址栏上获取值 $_post:post表单发送数据 $_request:即有get也有post的内容 如果post和get重名:那么由设置项决定,比如request_crder=" ...