Map&泛型

140 阅读3分钟

一、Map

1、什么是map

  • 底层是:数组+链表 红黑树(链表后面查询慢,防止链表过长而推出)
  • 也是一种容器,是父接口,和collection同级
  • key键和value值成对出现,是映射关系,存需要key和value一起存,取是根据key取value

2、Map常用子实现类

image.png

3、存放

  • 将key和value封装成一个Entry对象
  • 计算Key的HashCode%数组长度就是存放位置(出现的值相同,这就叫哈希碰撞/哈希冲突)
  • 数值冲突后就会在相同位置增加链表进行存储(链表增删块,查询慢,后面的数据就查询慢)

image.png

  • 链表长度大于8的时候,第九个链表就会转化为红黑树(缺点是占空间)增加效率

image.png

  • 红黑树小于7的时候红黑树转换回链表

4、 HashMap

4.1、注意

  • 线程不安全
  • 输出是无序的,
  • Key值是不能重复,
  • Value可以重复,
  • Key和Value都可以为null
  • Key的判重条件,必须重写equals和HashCode才行

4.2、重要方法

方法描述
Object put(Object key,Object value);输入值
Object get(Object key) ;取值
remove(key值)删除值,如果没有获取到数据,回返回null值,不会报错
getOrDefault如果查询到Key值就返回Value值,如果没有查询到,就输出后面的字符串
boolean containsKey(Object key)判断Map集合中是否包含当前的传入的key
boolean containsValue(Object value)判断Map集合中是否包含当前的传入的value

4.3、 遍历-调方法

  • 使用方法返回到Collection集合,调用for和迭代器进行遍历
Collection values返回一个Map中的所有的value值 Collection集合

image.png

  • 返回所有的key值的集合
Collection values返回一个Map中的所有的value值 Collection集合

image.png

  • 返回所有的entry对象
方法描述
Set entrySet()返回所有的entry对象(key是唯一的,所以返回的是Set集合)

image.png

5、LinkedHashMap

  • 效率很低,同步锁效率低,后面用concurrentHashtable替代
  • 有序的,其他和HashMap一样(就是有序的HashMap)

6、Hashtable

  • 无序的
  • 不能存放null(Key和Value都不能为null),不然要 报错
  • 线程安全的(就是一个线程安全的HashMap,不需要线程安全就使用HashMap代替HashTable)

6、properties(属性)

6.1、介绍

  • 是Hashtable子类,表示一个持久的属性集(存在硬 盘不在内存,不断电丢失)
  • Proterties当做一个特殊的Map用
  • 一般用来做配置和配置文件

6.2、重要方法使用

  • 输入值和取值建议不用put和get方法
  • 传入值key只能是字符串类型
方法描述
Object setProperty(String key, String value)设置值
String getProperty(String key)取值
String getProperty(String key, String defaultValue) ;如果没有通过对应的key没有找到对应的值,就返回后面的defaultValue
  • 将内存中的数据写入到用硬盘

  • 将硬盘里的数据读取到内存里

    instanceof

7、TreeMap

和Treeset差不多

二、Collections 工具类-Arrays

调用方法就行

1、ex:

image.png

image.png

三、泛型

1、介绍

就是在设计类(接口等)的时候,没有给规定具体是什么类型的参数,在实例化或调用的时候再传入具体的类型,告诉编译器这是什么类型

  • 本质是参数化类型,将类型 当做参数进行传递

  • 泛型的类型参数必须是引用类型,不能是基本类型

  • 所有的强制转换都是自动和隐式的

  • 泛型不能直接实例化,不能直接去new一个泛型

image.png

  • 借用工具类

image.png

2、泛型的上下限

  • 写类的时候采用逐一继承
  • ex:B继承A,C继承B
符号描述
标识通配符,可以表示任何类型
  • 表示上限
    ? extends Number : 表示通配符 ?的[上限],必须是Number及Number的子类

image.png

  • 表示下限
    ? super Number: 表示通配符 ?的[下限],必须是Number及Number的父类