单例集合体系:

---------| 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集合的一些常用方法

和Map集合的常用方法差不多

1.2、HashMap的存储原理

往HasMap集合中添加元素时,首先会调用键的hashCode()方法得到元素的哈西马值,然后经过运算在哈希表找到相应存储位置
      情况1:如果算出的位置目前没有任何元素,那么该元素可以直接添加到哈希表中。
      情况2:如果算出元素的位置已经存在其他元素,那么就会调用equals方法与该元素位置已存在的元素做一次比较;如过equals方法返回值是true,那么该元素是重复元素,不允许存储;如果返回值是false,那么该元素不是重复元素,则允许存储。

和HashSet差不多(1.2或例1处)

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集合的一些常用方法

和Map集合的常用方法差不多

2.2、TreeMap需要注意的事项

1.往TrreMap添加元素时候,如果元素本身具备自然顺序时,那么就按照自然顺序排列存储。
    2.往TrreMap添加元素时候,如果元素本身不具备自然顺序,那么键所属的类必须要实现Comparable接口,把键比较的规则定义在CompareTo方法中。
    3.往TrreMap添加元素时候,如果元素本身不具备自然顺序,键所属的类也没有实现Comparable接口,那么必须在创建TreeMap是传入一个比较器。

和TreeSet差不多(2.2处)

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集合的更多相关文章

  1. java基础35 双例集合Map及其常用方法

    单例集合体系: ---------| collection  单例集合的根接口--------------| List  如果实现了list接口的集合类,具备的特点:有序,可重复       注:集合 ...

  2. 第5节:Java基础 - 必知必会(下)

    第5节:Java基础 - 必知必会(下) 本小节是Java基础篇章的第三小节,主要讲述Java中的Exception与Error,JIT编译器以及值传递与引用传递的知识点. 一.Java中的Excep ...

  3. Java从入门到放弃18---Map集合/HashMap/LinkedHashMap/TreeMap/集合嵌套/Collections工具类常用方法

    Java从入门到放弃18—Map集合/HashMap/LinkedHashMap/TreeMap/集合嵌套/Collections工具类常用方法01 Map集合Map集合处理键值映射关系的数据为了方便 ...

  4. java基础28 单例集合Collection下的List和Set集合

    单例集合体系: ---------| collection  单例集合的根接口--------------| List  如果实现了list接口的集合类,具备的特点:有序,可重复       注:集合 ...

  5. java基础27 单例集合Collection及其常用方法

    1.集合 集合是存储对象数据的集合容器 1.1.集合比数组的优势 1.集合可以存储任意类型的数据,数组只能存储同一种数据类型的数据    2.集合的长度是变化的,数组的长度是固定的 1.2.数组:存储 ...

  6. java基础(4)---引用数据类型(数组、字符串、集合)

    一.数组 格式: int[] nums; 1. 数据类型[] 数组名称; 2. 数据类型 数组名称[]; (不太推荐)  动态初始化: new int[4] 数据类型[] 数组名称 = new 数据类 ...

  7. Java 基础常见知识点&面试题总结(下),2022 最新版!

    你好,我是 Guide.秋招即将到来,我对 JavaGuide 的内容进行了重构完善,同步一下最新更新,希望能够帮助你. 前两篇: Java 基础常见知识点&面试题总结(上),2022 最新版 ...

  8. java单例模式和双例模式

    今天朋友找我给做道题,双例模式,我是没听说过,都说是单例模式和多例模式, 也不知道双例模式什么时候用,就简单写了一个案例,不知道对不对,个人感觉蛮对的,双例就是单例+单例,废话不说了!!!! /* * ...

  9. JAVA 基础开发环境 vscode 搭建 Windows下VSCode编译运行简单java

    JAVA 基础开发环境 vscode 搭建 来源 https://www.cnblogs.com/freewsf/p/7744728.html 对于使用 Visual Studio Code 的 Ja ...

随机推荐

  1. 解题:APIO 2012 派遣

    题面 以报酬为标准维护一个大根堆,从根节点往上合并,每次踢掉若干人直到花费合法后更新答案 #include<cstdio> #include<cstring> #include ...

  2. 解题:USACO14OPEN Fair Photography

    题面 有点像JRY的那道序列题,大概是统计题的经典套路? 先说无修改的:将白奶牛记为$-1$,花奶牛记为$1$,然后做前缀和统计某个前缀和$sum$第一次出现的位置,之后再出现就统计答案.对于修改(将 ...

  3. 【bzoj4231】回忆树

    题解: 树上的串匹配,模式串的总长$|S|$,令$\overline {S} $为$S$的反串: 对$S$和$\overline {S} $分别建自动机 $u -> v$可以分成三个部分去统计 ...

  4. 科学计算三维可视化---TVTK入门(创建和显示三维对象)

    一:创建一个基本的三维对象 (一)长方体操作 traits:就是TVTK对象的属性 (1)对象属性操作 >>> from tvtk.api import tvtk >>& ...

  5. 监控redis数据库应用状态:python,tornado实现

    公司里最近redis服务器压力越来越大,其大概情况,只能从操作系统层面看,并不详尽,故同事在网上找了一个叫做 redis-live的开源项目,我配合部署了一下,还真有点意思,并解决了其中部分小debu ...

  6. Minicap使用分析

    想起前段时间研究过的minicap,抱着无果的心情再次看了源码,这次竟然比上次清晰了一点点,难道是因为这两天被android源码折磨得身心疲惫然而却在不知不觉中增长了?不懂怎么样,看懂了大概. Min ...

  7. Java中的容器类(List,Set,Map,Queue)

    Java中的容器类(List,Set,Map,Queue) 一.基本概念 Java容器类类库的用途是“保存对象”,并将其划分为两个不同的概念: 1)Collection.一个独立元素的序列,这些元素都 ...

  8. 不忘初心,方得始终——NOIP2016前的感悟

    不忘初心,方得始终 袛园精舍钟声响,奏诸世事本无常.沙罗双树失花色,盛者转衰如沧桑.骄者难久,恰如春宵一梦.猛者遂灭,好似风前之尘.    ——题记   人生中最令人恐惧的恐怕就是选择了,现在的你拥有 ...

  9. 【leetcode 简单】 第六十五题 2的幂

    给定一个整数n,判断它是否为2的次方幂. 方法:2,4,8都是2的n次幂 任何整数乘以2,都相当于向左移动了一位,而2的0次幂为1,所以2的n次幂就是1向左移动n位.这样,2的幂的特征就是二进制表示只 ...

  10. R的农场 chebnear

    评测传送门 Description最近,R 终于获得了一片他梦寐以求的农场,但如此大的一片农场,想要做好防卫工作可不是一件容易的事.所以 R 购买了 N 个守卫,分别让他们站在一定的位置上(守卫不可移 ...