ImageVerifierCode 换一换
你正在下载:

treemap.docx

[预览]
格式:DOCX , 页数:14 ,大小:18.53KB ,
资源ID:9008042      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/9008042.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(treemap.docx)为本站会员(b****7)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

treemap.docx

1、treemaptreemap我们知道HashMap的存储位置是按照key这个对象的hashCode来存放的,而TreeMap则是不是按照hashCode来存放,他是按照实现的Comparable接口的compareTo这个方法来存储的, 只要compareTo的返回结果为0就表示两个对象相等,那么就存不进去两个对象,后put的就把前面的覆盖掉,甚至我们都不用重写equasls和hashCode方法,而 只需要实现Comparable接口来重写comparareTo方法就行了,但是我们不能保证在应用中不会用到HashMap,所以保持良好的习惯,当我们定义了一个对象之后习惯性的 重写equals和

2、hashCode方法。本文比较详细的解释了TreeMap、Comparable、Comparator这三者的关联。测试Comparable接口:第一次比较:定义一个User类,实现Comparable接口,按照年龄排序,我们让equals为true,而hashCode也始终相等。public class User implements Comparable private String id; private String name; private Integer age; public User() public User(String id, String name, Integer a

3、ge) super(); this.id = id; this.name = name; this.age = age; public String getId() return id; public void setId(String id) this.id = id; public String getName() return name; public void setName(String name) this.name = name; public Integer getAge() return age; public void setAge(Integer age) this.ag

4、e = age; Override public String toString() return User name= + name + , age= + age + ; Override public boolean equals(Object obj) return true; Override public int hashCode() return 0; public int compareTo(User o) return this.age o.getAge() ? 1 : this.age = o.getAge() ? 0 : -1; 测试代码:public class Test

5、User public static void main(String args) Map userHashMap = new HashMap(); User user1 = new User(1, Jay, 30); User user2 = new User(2, Jolin, 21); User user3 = new User(3, Jack Cheng, 22); User user4 = new User(4, Bruce Lee, 22); userHashMap.put(user1, 100); userHashMap.put(user2, 200); userHashMap.

6、put(user3, 300); userHashMap.put(user4, 400); System.out.println(userHashMap); Map userTreeMap = new TreeMap(); userTreeMap.put(user1, 100); userTreeMap.put(user2, 200); userTreeMap.put(user3, 300); userTreeMap.put(user4, 400); System.out.println(userTreeMap); 结果User name=Jay, age=30=400User name=Jo

7、lin, age=21=200, User name=Jack Cheng, age=22=400, User name=Jay, age=30=100123结论:对于HashMap而言,只要key的equals相等就表示两个元素相等,HashMap就存不进去;而TreeMap是不管equals和hashCode的,只要compareTo相等就表示两个元素相同,就存不进去。2.第二次比较:现在我们按照id来重写hashCode和equals方法,如下: Override public int hashCode() final int prime = 31; int result = 1; re

8、sult = prime * result + (id = null) ? 0 : id.hashCode(); return result; Override public boolean equals(Object obj) if (this = obj) return true; if (obj = null) return false; if (getClass() != obj.getClass() return false; User other = (User) obj; if (id = null) if (other.id != null) return false; els

9、e if (!id.equals(other.id) return false; return true; 测试代码不变,还是上面的测试代码,结果:User name=Jolin, age=21=200, User name=Jay, age=30=100, User name=Bruce Lee, age=22=400, User name=Jack Cheng, age=22=300User name=Jolin, age=21=200, User name=Jack Cheng, age=22=400, User name=Jay, age=30=10012说明:HashMap只要equ

10、als不等那就表示不等,而对于TreeMap如果compareTo相等,那么2个元素就相等,并且排序是按照compareTo方法定义的排序规则。接下来再在测试代码里面添加List测试: List userList = new ArrayList(); userList.add(user1); userList.add(user2); userList.add(user3); userList.add(user4); System.out.println(userList); Collections.sort(userList); System.out.println(userList);结果:

11、User name=Jolin, age=21=200, User name=Jay, age=30=100, User name=Bruce Lee, age=22=400, User name=Jack Cheng, age=22=300User name=Jolin, age=21=200, User name=Jack Cheng, age=22=400, User name=Jay, age=30=100User name=Jay, age=30, User name=Jolin, age=21, User name=Jack Cheng, age=22, User name=Bru

12、ce Lee, age=22User name=Jolin, age=21, User name=Jack Cheng, age=22, User name=Bruce Lee, age=22, User name=Jay, age=30当调用sort方法之后List里面的元素就按照age排序了。对于Comparator,一种叫做策略模式的设计模式,我们在User中实现Comparable接口,重写里面的方法,可以实现对User按age排序,这个排序算法是 存在于User内部的,换句话说User和排序算法是相互依存的,User只能用compareTo这个算法,而compareTo算法也只能为U

13、ser服务,那么如果我们其他 地方也有同样的需求,就只能再实现一次Comparable,来为另外一个对象服务,这就有点重复的感觉,而且代码没有得到复用,样子对象和算法混在一 起耦合性很强,于是希望把算法和模型分离出来,让算法单独存在,不同的对象可以使用同一个算法,并且二者是分离的,没有混为一体。当然可以分 开那必然还是可以放在一起的。用一句比较专业点的话来讲就是策略模式有两个特点:1.封装变化。2.变成中使用接口而不实现接口。 如果我再说得直白一点,策略模式就是一种面向接口编程的思想。这点在多线程里面也有所体现,就是为什么我们在开启新线程的时候要new Thread(Runnable接口),

14、参数传接口而不推荐去继承Thread,虽然也可以继承,这也是体现面向对象的封装特性,将run的算法和线程分离,可以实现run所在类的复用,虽然一般都不会去复用, 当然这里还有一点就是Java只能单继承,如果继承了Thread就不能在继承其他的类。此时我们的User是按照age排序,那如果想按照名字排序呢,那就没办法了, 但是如果将算法分离出来,需要用名字排序我们就传用名字排序的算法进去,需要用age排序就传age排序算法进去。环境持有接口引用,通过set方法将接口实现 传入到环境,在环境中来调用接口方法,这完完全全是面向接口的特点。下面的第一个例子就是存放在一起的,因为TreeMap的构造方法

15、其中就有一个是待Comparator 接口参数的构造方法,该参数只要实现了Comparator接口就行,如下:public TreeMap(Comparator comparator) parator = comparator; 举例:有一个Person类,实现了Comparator接口,并且按照岁数排序:public class Person implements Comparator private String id; private String name; private Integer age; public Person() public Person(String id, St

16、ring name, Integer age) this.id = id; this.name = name; this.age = age; public String getId() return id; public void setId(String id) this.id = id; public String getName() return name; public void setName(String name) this.name = name; public Integer getAge() return age; public void setAge(Integer a

17、ge) this.age = age; Override public String toString() return Person name= + name + , age= + age + ; Override public int hashCode() final int prime = 31; int result = 1; result = prime * result + (id = null) ? 0 : id.hashCode(); return result; Override public boolean equals(Object obj) if (this = obj

18、) return true; if (obj = null) return false; if (getClass() != obj.getClass() return false; Person other = (Person) obj; if (id = null) if (other.id != null) return false; else if (!id.equals(other.id) return false; return true; public int compare(Person o1, Person o2) return o1.getAge() o2.getAge()

19、 ? 1 : o1.getAge() = o2.getAge() ? 0 : -1; 测试:public class TestPerson public static void main(String args) Map personHashMap = new HashMap(); Person person1 = new Person(1, Jay, 30); Person person2 = new Person(2, Jolin, 21); Person person3 = new Person(3, Jack Cheng, 22); Person person4 = new Perso

20、n(4, Bruce Lee, 22); personHashMap.put(person1, 100); personHashMap.put(person2, 200); personHashMap.put(person3, 300); personHashMap.put(person4, 400); System.out.println(personHashMap); Map personTreeMap = new TreeMap(new Person(); personTreeMap.put(person1, 100); personTreeMap.put(person2, 200);

21、personTreeMap.put(person3, 300); personTreeMap.put(person4, 400); System.out.println(personTreeMap); 结果:Person name=Jolin, age=21=200, Person name=Jay, age=30=100, Person name=Bruce Lee, age=22=400, Person name=Jack Cheng, age=22=300Person name=Jolin, age=21=200, Person name=Jack Cheng, age=22=400,

22、Person name=Jay, age=30=10012依然是compara方法相等的元素表示相同,只能存放一个进去,并且是按照age排序的。在List中的结果:public class TestPerson public static void main(String args) Map personHashMap = new HashMap(); Person person1 = new Person(1, Jay, 30); Person person2 = new Person(2, Jolin, 21); Person person3 = new Person(3, Jack Ch

23、eng, 22); Person person4 = new Person(4, Bruce Lee, 22); personHashMap.put(person1, 100); personHashMap.put(person2, 200); personHashMap.put(person3, 300); personHashMap.put(person4, 400); System.out.println(personHashMap); Map personTreeMap = new TreeMap(new Person(); personTreeMap.put(person1, 100

24、); personTreeMap.put(person2, 200); personTreeMap.put(person3, 300); personTreeMap.put(person4, 400); System.out.println(personTreeMap); List personList = new ArrayList(); personList.add(person1); personList.add(person2); personList.add(person3); personList.add(person4); System.out.println(personLis

25、t); Collections.sort(personList, new Person(); System.out.println(personList); 结果:Person name=Jolin, age=21=200, Person name=Jay, age=30=100, Person name=Bruce Lee, age=22=400, Person name=Jack Cheng, age=22=300Person name=Jolin, age=21=200, Person name=Jack Cheng, age=22=400, Person name=Jay, age=3

26、0=100Person name=Jay, age=30, Person name=Jolin, age=21, Person name=Jack Cheng, age=22, Person name=Bruce Lee, age=22Person name=Jolin, age=21, Person name=Jack Cheng, age=22, Person name=Bruce Lee, age=22, Person name=Jay, age=30调用sort方法前没排序,而调用之后按照age排序了。其实将算法和模型分离也非常类似,只需要将实现Comparator接口的类单独拿出去就

27、ok了。现在定义Person类,不实现Comparator接口,而将SortPerson类来 实现该接口,其实就是用SortPerson类代替之前TreeMap中的参数,之前的参数是实现了Comparator接口的Person对象。Person类:public class Person private String id; private String name; private Integer age; public Person() public Person(String id, String name, Integer age) this.id = id; this.name = na

28、me; this.age = age; public String getId() return id; public void setId(String id) this.id = id; public String getName() return name; public void setName(String name) this.name = name; public Integer getAge() return age; public void setAge(Integer age) this.age = age; Override public String toString() return Person name= + name + , age= + age + ; Override public int hashCode() final int prime = 31; int result = 1; result = prime * result + (id = null) ? 0 : id.hashCode(); return result; Override public boolean equals(Object obj) if (this = obj) return true; if (ob

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1