Java笔记-Map集合

Map集合

Map集合以key和value的这种键值对的方式存储元素。
key的特点:无序不可重复的,存储元素的特点和Set相同。

Map的子类:

HashMap:底层是哈希表数据结构,是非线程安全的
Hashtable:底层也是哈希表数据结构,是线程安全的,所有方法带有synchronized,效率较低,使用较少,因为已经有更好的解决方案。
SortedMap:存储元素的特点:无序不可重复,放在SortedMap的元素,会自动按照大小来排序。

SortedMap的子类:

TreeMap:底层的数据结构是个二叉树。里面的key可以按照大小自动进行排序。
自平衡二叉树,采用中序遍历方式,Iterator迭代器采用中序遍历方式。
存入TreeMap的元素
1.必须实现comparable接口,且实现compareTo方法,在compareTo中定义比较的逻辑。
2.实现comparator接口(比较器),需要在new集合的时候,在构造方法中传比较器对象。
当比较规则不会发生改变,或者只有一个的时候建议实现comparable接口。
如果比较规则有多个,并且需要多个比较规则之间频繁切换的时候,建议使用comparator接口。comparator接口的实现符合OCP原则。

Hashtable的子类:

Properties:线程安全的,存储的key和value只支持String类型,被称为属性类。

泛型:

例如:List mylist = new ArrayList();
指定list集合中只能存储Animal,使用了泛型之后,集合中元素的数据更加统一。
在迭代器中使用泛型,每一次迭代返回的数据都是Animal类型。

泛型的优点:

1.集合中存储的元素类型统一了
2.从集合中取出的元素类型是泛型指定的类型,不需要进行大量的“向下转型”。
泛型的缺点:
导致集合存储的元素缺乏多样性。

自动类型推断机制(砖石表达式):
List stylist = new ArrayList<>();

自定义泛型
class MyItearator < T>{
public T get(){
return null;
}
}

T由自己在new对象的时候规定泛型的类型。

Map中常用的方法:

map集合以key和value键值对方式存储,key和value都是引用数据类型,都是存储对象的内存地址,key起主导的地位,value是key的一个附属品。

void clear();//清空集合
boolean containsKey(Object key);//判断集合中是否包含某个key
boolean containsValue(Object value);//判断map集合中是否包含某个value
V get(Object key);//通过key去获取value
boolean isEmpty();//判断集合中元素个个数是否为0
Set keySet();//获取map集合中所有的key
V put(K key,V value);//向map集合中添加键值对
V remove(Object key);//删除key为某个值的键值对。
int size();//获取map集合中键值对的个数。
collection values();//获取集合中所有value,返回一个collection
Set<Map.Entry<K,V>> entrySet();//将Map集合转化成set集合。集合中的类型是Map.Entry。
getOrDefault(Object key, V defaultValue);//当集合中有这个key的时候,会返回对应的value。

遍历Map的方法:

1.用keySet获取所有的key,通过迭代器遍历key,通过get(key)来得到所有的value。

2.用keySet得到所有的key,然后用foreach,get(key)来得到所有的value。

3.使用Set<Map.Entry<Integer,String> set = map.entrySet();来获得一个Map.Entry<Interger,String>类型,获得迭代器,通过getkey和get value方法来得到map中的所有键值对。
4.使用Set<Map.Entry<Integer,String> set = map.entrySet();来获得一个Map.Entry<Interger,String>类型,获得迭代器,用foreach,for(Map.Entry<Integer,String> node:set){
System.out.println(node.getKey()+”=“+node.getValue());
} 来遍历map集合。(效率较高)

哈希表:

是一个数组和单项链表的结合体
哈希表将以上两种数据结构融合在一起,充分发挥它们各自的优点。
底层有静态内部类:
static clss Node<K,V>{
final int hash;//哈希值(哈希值是key的hashCode()方法的执行结果,hash值通过哈希函数可以转化为数组的下标)
final K key;//存储到Map集合的key
V value;//存储到map集合的value
Node<K,V> next;//下一个节点的内存地址
}
哈希表:一维数组,这个数组中的每一个元素是一个单项链表。(数组和链表的结合体)

为什么哈希表的随机增删,以及查询效率都很高呢?
解:增删是在链表上完成的,查询也不需要全部扫描,只需要部分扫描。

map.put(k,v)实现原理:

放在HashMap集合的key部分的元素需要重写hashCode()和equals()这两个方法。
同理,HashSet也需要重写这两个方法。
HashMap集合
为什么无序:因为进去的节点无法确定会挂在哪个单向链表上。
不可重复怎么保证:equals方法来确定HashMap集合的key不可重复,如果重复会覆盖value。
注意:同一个单项链表上所有节点的hash值相等,因为它们的数组下标一样,但是k值不一样。

HashMap初始化容量为16,默认加载因子是0.75。(默认加载因子是,当HashMap集合底层数组的容量到达数组容量的75%时,数组开始扩容)
HashMap初始化容量必须是2的倍数(官方推荐),因为达到散列均匀,为了提高HashMap集合的存取效率。
扩容后的容量是原来的2倍。

如果一个类的equals方法重写了,他的hashCode方法也要重写,当equals返回true,hashCode返回值也要相同。
hashCode和equals方法用idea生成,但必须同时生成。

如果哈希表单向链表中的元素超过8个,单向链表会变成红黑树数据结构,当红黑树上的节点少于6时,会把红黑树变为单向链表。为了提高检索效率

HashMap集合的key和value可以存一个null,但是Hashtable的key部分不能存null,且其value也不能为null。
Hashtable:初始化容量11,默认加载因子为0.75.
扩容后的容量是原容量*2+1.

Properties继承Hashtable,他的key和value都是String类型,被称为属性类对象。线程安全的。
setProperties(String key,String value);//往properties里存东西,调用map中的put
getProperties(String key)//通过key去获得value

集合工具类collections:

static < T> List< T> synchronizedList(List list)//让List集合变成线程安全的
static <K,V> Map<K,V> synchronizedMap(Map<K,V> m)//让map集合变成线程安全的
static <T extends Comparable<? super T>> void sort(List list)//将List集合进行排序
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值