Java学习(九)
目录:
1、equals、hashCode、compareTo方法:
2、Comparable接口的compareTo方法说明:
3、TreeMap是一个按照key排序的键值对集合,比较规则根据key的compareTo()方法进行排序。
4、List、Set、Map简单说明:
5、Map<String, Integer> m = new HashMap<String, Integer>()的一些解释:
6、hashCode和equals方法重写学习:
7、TreeMap学习:
8、HashMap学习:
1、equals、hashCode、compareTo方法:
答:(1)equals方法和hashCode方法保持一致:在同一次运行,当equals方法返回true时,hashcCode方法返回同一个整数。
(2)equals方法对于任何非空引用值x和y,当且仅当x和y引用同一个对象时,此方法才返回true。当此方法被重写时,通常有必要重写hashCode方法,以维护hashCode方法的常规协定,该协定声明相等对象必须具有相等的哈希码。
(3)equals方法和compareTo方法保持一致:当且仅当equlas方法返回true时,compareTo方法返回零。
2、Comparable接口的compareTo方法说明:
答:比较此对象与指定对象的顺序。如果该对象小于指定对象,则返回一个负整数;如果该对象等于指定对象,则返回零;如果该对象大于指定对象,则返回一个正整数。如果指定对象的类型不允许它与此对象进行比较,则会抛出ClassCastException。
3、TreeMap是一个按照key排序的键值对集合,比较规则根据key的compareTo()方法进行排序。
4、List、Set、Map简单说明:
答:List是链表结构,Set都是不包含重复元素的集合,Map都是key-value结构。key的底层就是一个set(不包含满足e1.equals(e2) 的元素对e1 和e2)。
5、Map<String, Integer> m = new HashMap<String, Integer>()的一些解释:
答:HashMap类实现了Map接口,相当于HashMap类继承了Map抽象类
因为Map接口是不能被实例化的,所以需要对此类型实例化时,可以对它的某个实现类进行实例化,即面向对象中的多态的概念。定义一个Map 类型的对象m,这个对象是一个新的HashMap 实例。
6、hashCode和equals方法重写学习:
①代码示例:
图6.1 代码示例1
图6.2 代码示例2
②运行结果:
图6.3 运行结果
7、TreeMap学习:
(1)TreeMap<K, V>继承关系
java.lang.Object
--------java.util.AbstractMap<K, V>
----------------java.util.TreeMap<K, V>
K:此映射维护的键的类型
V:映射值的类型
(2)方法学习:
①代码示例如下:
图7.1 代码示例
②运行结果:
图7.2 运行结果
8、HashMap学习:
(1)HashMap<K, V>继承关系
java.lang.Object
--------java.util.AbstractMap<K, V>
----------------java.util.HashMap<K, V>
K:此映射维护的键的类型
V:映射值的类型
(2)注意事项:
①HashMap 的实例有两个参数影响其性能:初始容量和加载因子。容量是哈希表中桶的数量,初始容量只是哈希表在创建时的容量。加载因子是哈希表在其容量自动增加之前可以达到多满的一种尺度。当哈希表中的条目数超出了加载因子与当前容量的乘积时,则要对该哈希表进行rehash 操作(即重建内部数据结构),从而哈希表将具有大约两倍的桶数。
②通常,默认加载因子 (0.75) 在时间和空间成本上寻求一种折衷。加载因子过高虽然减少了空间开销,但同时也增加了查询成本。在设置初始容量时应该考虑到映射中所需的条目数及其加载因子,以便最大限度地减少rehash 操作次数。如果初始容量大于最大条目数除以加载因子,则不会发生rehash 操作。
(3)方法学习示例1:
①代码示例如下:
图8.1 代码示例
②运行结果:
图8.2 运行结果
说明:散列映射并不保证它的元素的顺序。因此,元素加入散列映射的顺序并不一定是它们被迭代函数读出的顺序。
(4)方法学习示例2:
①代码示例:
在eclipse中给main函数的args参数赋值:
图8.3 传参示例
图8.4 代码示例
②运行结果:
图8.5 运行结果
(5)知识点总结:
①HashMap底层维护一个数组,我们向HashMap中所放置的对象实际上是存储在该数组当中;
②当向HashMap中put一对键值时,它会根据key的hashCode值计算出一个位置,该位置就是此对象准备往数组中存放的位置。
③如果该位置没有对象存在,就将此对象直接放进数组当中;如果该位置已经有对象存在了,则顺着此存在的对象的链开始寻找(Entry类有一个Entry类型的next成员变量,指向了该对象的下一个对象),如果此链上有对象的话,再去使用equals方法进行比较,如果对此链上的某个对象的equals方法比较为false,则将该对象放到数组当中,然后将数组中该位置以前存在的那个对象链接到此对象的后面。