Java-集合-Map-基本数据--知识点解析

  1. Map体系集合:
    在这里插入图片描述
    I. Map:地图、映射
    //数组链表
    I. 概念:存储一对数据(Key-value),无序、无下标、键不可重复(唯一)、值可以重复。
    public interface Map<K,V> Map.Entry<K,V> Map输入(键-值对)。
    映射键到值的对象。一张Map不能包含重复的键,每个键可以映射到至多一个值。
    此接口取代Dictionary。。这个接口的Dictionary类的地方,这完全是一个抽象类而不是接口。

Map接口提供了三集合视图,使Map的内容被看作是一套钥匙,收藏价值,或一组关键值的映射。Map的秩序定义为顺序,对Map的集合视图迭代器返回的元素。一些Map的实现,像TreeMap类,使特定的保证他们的订单;其他人,像HashMap类,不。
注意:必须非常小心行使如果使用可变对象作为map的key。一个Map的行为不是一个对象的值是以影响equals比较而对象在Map的关键改变指定。这一禁令的一个特殊情况是,它是不允许的Map包含本身作为一个关键。而对于map以自身作为值是允许的,极端的谨慎建议:“equals和hashCode方法的Map上不再明确。
方法:
V put(K key, V value) //将对象存入到集合中,关联键值。key重复覆盖原值
Object get(Object key) //根据键获取对应的值。
Set //返回所有key.
Collection values() //返回包含所有值的Collection集合
Set<Map.Entry<K,V>> entrySet()//键值匹配的Set集合。 //Set存的都是Entry对象

Map的底层实现原理:
1.Map是数组链表,
2.这个数组当中的每一个元素都是一个Map.Entry对象,而这个Entry对象本身是一个链表的结点,而在该结点上,还可以通过next指向他的下一个结点。
在我们每一个默认长度的16数组的每一个元素上,基于他们换算后的hash一致,所以在这个第一个元素下边指一个,

main(){
//所有键
Set keys = Country.countries.keySet();
//返回的是一个集合,获取的Key都是唯一
for(String s : keys){ System.out.println(k); }
//所有值
Collection values = Country.countries.values();
// 获取的值不唯一///用接口Collection,因为Map值是无序的,无下标的。
for(String v: value){ System.out.println(v);}

//所有键+值 Set<Map.Entry<K,V>> entrySet();

Set<Map.entry<String , String>> entrys = Country.countries.entrySet();
for(Map.Entry<String,String > entry : enytrys){
entry.getKey();
entry.getValue();
System.out.println(entry);//toString方法 } }
class Country{
public static final Map<String, String> countries = new HashMap<String,String>();
static{
countries.put(“CN”,“中华人民共和国”);
countries.put(“US”,“美利坚合众国”);
countries.put(“KR”,“韩国”);
countries.put(null,“Q”);
countries.put(null,null);
countries.put(“Q”,null);} }

源码:
static class Entry<K,V> implements Map.Entry<K,V>{
final K key; //不能改
V value;
Entry<K,V> next;//链表的下一个元素 Entry<K,V>
int hash; //计算最终存储位置

/Entry 在算完了一个B entry的hash之后得往下标 0 上放;
/下一个对象A entry 计算完后得出的hash后也得往下标0上放;此时的A就要挂在 B 的next上
}

在这里插入图片描述
II. HashMap算法:拿到任何一个对象好,通过hash(key)做运算,key>>>16(除以16),只可能得到0~15之间的一个数组,作为插入数组的下标
(1) JDK1.2版本,线程不安全,运行效率快;运行用null作为key或是value;

public class HashMap<K,V> extends AbstractMap<K,V> implements Map<K,V>, Cloneable, Serializable
基于哈希表的 Map接口的实现。这种实现提供了所有可选的Map操作,并允许 null值和 null键。(这 HashMap类大致相当于 Hashtable,除了它是不同步的,允许空值。)这类做不保证Map的映射顺序;特别是,它并不能保证订单将随时间保持恒定。
这个实现的基本操作提供了稳定的性能(get和put),假设哈希函数的分散元素之间的正确的桶。在集合视图迭代需要时间成正比的“能力”的HashMap实例(桶的数量)加上其尺寸(键值对映射的数量)。因此,它是非常重要的,不设置的初始容量太高(或负载因子太低),如果迭代性能是重要的。
对HashMap实例有影响其性能的两个参数:初始容量和负载因子。是的容量哈希表中的存储桶的数目,和初始容量仅仅是当时的哈希表的创建能力。的负载因子是如何全面衡量哈希表是可以在其容量自动增加。当哈希表中的条目数超过负荷的因素和当前容量的乘积,哈希表是重复(即内部数据结构重建),哈希表有大约两倍的存储桶的数目。
作为一个一般规则,默认负载因子(。75)提供了一个很好的时间和空间成本之间的权衡。较高的值会降低空间开销,但提高查找成本(体现在大多数的HashMap类的操作,包括get和put)。预计参赛人数在Map及其负载系数应考虑设置其初始容量时,以尽量减少重复操作的次数。如果初始容量大于最大条目数除以负载因子,没有rehash操作将不会发生。
如果许多映射将被存储在一个HashMap实例,创建了一个足够大的容量将允许映射可以存储比让它执行自动改写为增长所需要的表格更有效。注意使用多键同hashCode()是一个肯定的方式来减缓任何哈希表的性能。改善的影响,Comparable键时,这类可以帮助打破关系键比较的顺序使用。
构造方法:
HashMap()
构造一个默认的初始容量的空 HashMap(16)和默认的加载因子(0.75)。
HashMap(int initialCapacity)
构建了一个具有指定的初始容量和加载因子空 HashMap(0.75)。
HashMap(int initialCapacity, float loadFactor)
构造一个空 HashMap具有指定的初始容量和加载因子。
HashMap(Map<? extends K,? extends V> m)
构建了一种新的 HashMap与指定的 Map相同的映射。

main(){
String s = XXX.countries.get(“CN”);
System.out.println(s);
}
class XXX{
public static final Map<String, String> countries = new HashMap<String,String>();
static{
countries.put(“CN”,“中华人民共和国”);
countries.put(“US”,“美利坚合众国”);
countries.put(“KR”,“韩国”); } }

III. Hashtable:HashMap的线程安全版本
(1) JDK1.0版本,线程安全,运行效率慢;不允许null作为key或是value

public class Hashtable<K,V> extends Dictionary<K,V> implements Map<K,V>, Cloneable, Serializable
这个类实现了一个哈希表,它映射了值的键。任何非 null对象可以作为key或值。
为了成功地向哈希表中存储或检索对象,作为key的对象必须实现hashCode法和equals方法。
此示例创建一个哈希表的数。它使用数字的名称作为键:
Hashtable<String, Integer> numbers = new Hashtable<String, Integer>();
numbers.put(“one”, 1);
numbers.put(“two”, 2);
numbers.put(“three”, 3);
要检索一个数字,使用下面的代码:
Integer n = numbers.get(“two”);
if (n != null) {
System.out.println("two = " + n); }
构造方法:
Hashtable()
构建一个新的空哈希表默认初始容量(11)和负载因子(0.75)。
Hashtable(int initialCapacity)
构建一个新的空哈希表指定初始容量和加载因子(0.75)。
Hashtable(int initialCapacity, float loadFactor)
构建一个新的空哈希表的指定初始容量和负载因子。
Hashtable(Map<? extends K,? extends V> t)
构建了一种新的哈希表作为给定Map相同的映射。

IV. TreeMap:自动对key做排序,根据compareTo的返回值去重
实现了SortedMap接口(是Map的字接口),可以对key自动排序
public class TreeMap<K,V> extends AbstractMap<K,V> implements NavigableMap<K,V>, Cloneable, Serializable
基于 NavigableMap实现红黑树。Map是根据它的键的 natural ordering排序,或通过设置在Map创建时 Comparator,取决于使用哪个构造函数。
这种实现提供保证log(n)的时间成本的containsKey,get,put和remove操作。算法是在Cormen,Leiserson改编,和Rivest的算法导论。

注意排序树映射保持,像任何排序图,以及是否提供一个明确的比较器,必须符合等于如果排序图是正确执行Map接口。(见Comparable或Comparator为符合平等的。一个精确的定义)这是因为Map接口在equals操作定义,但排序图上执行所有关键的比较使用compareTo(或compare)方法,所以两个键被视为平等的方法是,从排序Map的角度来看,平等。即使它的顺序是不一致的equals排序图的行为是明确的;它只是不服从的Map接口一般合同。

构造方法 Constructor and Description
TreeMap()
构造一个新的,空的树映射,使用它的键的自然顺序。
TreeMap(Comparator<? super K> comparator)
构造一个新的,空的树映射,根据给定的比较器排序。
TreeMap(Map<? extends K,? extends V> m)
构造了一个包含相同映射的新的树映射,根据它的键的自然顺序排列。
TreeMap(SortedMap<K,? extends V> m)
构造一个包含相同映射的新树映射,并使用指定的排序映射使用相同的排序。

main(){
Map<String,String> map = new TreeMap<String,String>();
map.put(“CN”,“中华人民共和国”);
map.put(“US”,“美利坚合众国”);
map.put(“KR”,“韩国”);
//Set keys = map.KeySey();
for(String key : map.keySet()){}
}
/
main(){
Map<Student,School> map = new TreeMap< Student,School >();
map.put(new Student(“张三”),new School(“北京市第一中学”));
map.put(new Student(“李四”),new School(“北京市第二中学”));
map.put(new Student(“王五”),new School(“北京市第三中学”));}
class School implements Comparable{
public School(String string){ }
@Override
public int comparaTo (Student o) { return 0;} }
class Student{
public Student(String string){ }}

V. Properties:Hashtable 子类,主要用于存储key和value都是字符串的情况,常在读取配置文件之后,保存文件中的键值对。反射、JDBC

后缀名。 不支持泛型

public class Properties extends Hashtable<Object,Object>
Properties类代表一个持久的属性集。的 Properties可以保存到流或流中加载。属性列表中的每个键和它的相应值是一个字符串。
一个属性列表可以包含另一个属性列表作为它的“默认值”;如果在原始属性列表中没有找到属性键,则搜索该第二个属性列表。
因为Properties继承的Hashtable,put和putAll方法可以应用于Properties对象。不建议使用,因为它们允许调用者插入的键或值不是String的项。应该用setProperty方法来代替。如果在“不安全”的Prperties对象(即包含非String的键)上调用 store或save方法,调用将失败。同样的,如果在“不安全”的Properties对象(即包含非String的键)上调用propertyNames或list方法,则失败。

构造方法
Properties()
创建一个没有默认值的空属性列表。
Properties(Properties defaults)
用指定的默认值创建一个空属性列表。

main(){
Properties prop = new Properties();
//prop.put(“aaa”,new Object());
//Errpr 不安全 设计存在瑕疵(继承了一个不该继承的父类)
prop.setProperty(“aaa”,“bbb”);//调用Hashtable的方法put
prop.setProperty(“ccc”,“ddd”);
System.out.println(prop.getProperty(“aaa”));//用指定的键在此属性列表中搜索属性
System.out.println(prop.getProperty(“ccc”));}
/

总结
Collection 体系接口 存一组对象 提供一些共性方法;
list 存一组对象,有序可重复
set 存一组对象,无序不可重复
Map 存一组键值对,通过键访问值
泛型 规范类型 类型安全
四点:ArrayList hashSet hashMap 和 泛型集合

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值