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之IO流(字节流,字符流)
IO流和Properties IO流 IO流是指计算机与外部世界或者一个程序与计算机的其余部分的之间的接口.它对于任何计算机系统都非常关键, 因而所有 I/O 的主体实际上是内置在操作系统中的.单独的 ...
- idea中Hibernate错误:无法解析表
idea中Hibernate错误:无法解析表 这种情况主要是在idea中使用hibernate自定义注解,idea无法检查数据源 this inspecton controls whether the ...
- ubuntu 安装python3.6.6
http://www.cnblogs.com/yhongji/p/9383857.html https://www.jianshu.com/p/1565f38f4236 ./configure --w ...
- JavaScript搜索关键字高亮的实现
高亮功能主要是指对页面中指定区域的指定文字进行高亮显示,也就是背景着色.一般在搜索结果页面会经常用到这个功能. 下面就为大家提供一种解决方案,用javascript实现. 首先在<head> ...
- IEEE 754浮点数表示标准
二进制数的科学计数法 C++中使用的浮点数包括采用的是IEEE标准下的浮点数表示方法.我们知道在数学中可以将任何十进制的数写成以10为底的科学计数法的形式,如下 其中显而易见,因为如果a比10大或者比 ...
- supervisor 添加新配置不生效的问题
supervisorctl reread supervisorctl reload (不运行这一步会导致启动不了) supervisorctl start xxx:* 提示:No config upd ...
- Netflix的zuul使用
1.zuul出现的原因 2.zuul的介绍 3.zuul如何使用 4.zuul的一些注意事项
- MyEclipse10 Tomcat7关联
MyEclipse10 Tomcat7配置 配置: 选择Window下的preferences界面 配置jdk,可以选择自己安装的jdk,点击ok就配置好了. 测试: 菜单file>new> ...
- 科学计算三维可视化---TraitsUI的介绍
TraitsUI的介绍 Python中存在Tkinter,wxPython,pyQt4等GUI图像界面编写库,这三类库要求程序员掌握众多的GUI API函数 对于科学计算的应用来说,我们希望可以快速的 ...
- vue中的slot与slot-scope
深入理解vue中的slot与slot-scope vue+element-ui+slot-scope或原生实现可编辑表格 vue插槽详解