学习笔记之JavaSE(35)--JavaAPI详解10
来源:互联网 发布:linux pyqt4 eric6 编辑:程序博客网 时间:2024/06/05 14:10
今天学习的内容是集合类之HashMap、LinkedHashMap和TreeMap
常用的映射有HashMap、LinkedHashMap和TreeMap,下面分别介绍一下它们
一、HashMap和LinkedHashMap
HashMap、LinkedHashMap与HashSet、LinkedHashSet的原理基本相同,把映射中的键视作集中的元素即可。注意HashMap的键和值都可以是null。
补充个知识点:HashTable,此类也实现了Map接口,与HashMap类似,区别在于它是同步的,且不能使用null作为键和值(面试要点)。虽然这个类已经过时,但是它的子类Properties很重要,可以和IO技术相结合存储键值对型的配置文件的信息。
示例程序:
public class Test60 {public static void main(String[] args) {// HashMap的键不能重复,且元素是无序的Map<Person, String> hs = new HashMap<>();hs.put(new Person("张三", 21), "云南");hs.put(new Person("张三", 21), "北京");hs.put(new Person("李四", 25), "上海");hs.put(new Person("王五", 27), "天津");hs.put(new Person("赵六", 24), "广州");System.out.println(hs);// HashMap是无序的 {Person [name=王五, age=21]=天津,// Person [name=赵六, age=24]=广州, Person [name=张三,// age=21]=北京, Person [name=李四, age=22]=上海}// LinkedHashMap是有序的Map<Person, String> lhs = new LinkedHashMap<>();lhs.put(new Person("张三", 21), "云南");lhs.put(new Person("张三", 21), "北京");lhs.put(new Person("李四", 25), "上海");lhs.put(new Person("王五", 27), "天津");lhs.put(new Person("赵六", 24), "广州");System.out.println(lhs);// LinkedHashMap是有序的 {Person [name=张三,// age=21]=北京, Person [name=李四, age=25]=上海,// Person [name=王五, age=27]=天津, Person [name=赵六,// age=24]=广州}}}//要覆盖Person的hashCode()与equals()方法 class Person {private String name;private int age;public Person() {super();}public Person(String name, int age) {super();this.name = name;this.age = age;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}@Overridepublic String toString() {return "Person [name=" + name + ", age=" + age + "]";}@Overridepublic int hashCode() { // 覆盖Object的hashCode()方法final int prime = 31;int result = 1;result = prime * result + age;result = prime * result + ((name == null) ? 0 : name.hashCode());return result;}@Overridepublic boolean equals(Object obj) {// 覆盖Object的equals()方法if (this == obj)return true;if (obj == null)return false;if (getClass() != obj.getClass())return false;Person other = (Person) obj;if (age != other.age)return false;if (name == null) {if (other.name != null)return false;} else if (!name.equals(other.name))return false;return true;}}
二、TreeMap
TreeMap与TreeSet的原理也基本相同。注意由于TreeMap要根据键按照指定规则进行排序,所以TreeMap存储的元素的键不能是null,而值可以是null。
示例程序:
public class Test61 {public static void main(String[] args) {// 使用自然排序Map<Person, String> tm = new TreeMap<>();tm.put(new Person("zhangsan", 21), "天津");tm.put(new Person("lisi", 22), "北京");// 如果Person类没有实现Comparable接口,会发生ClassCastExceptiontm.put(new Person("wangwua", 23), "云南");tm.put(new Person("wangwub", 23), "上海");tm.put(new Person("zhaoliu", 24), "广州");System.out.println(tm);// {Person [name=zhangsan, age=21]=天津, Person// [name=lisi, age=22]=北京, Person [name=wangwua,// age=23]=云南, Person [name=wangwub, age=23]=上海,// Person [name=zhaoliu, age=24]=广州}// 使用比较器排序Map<Person, String> tm_com = new TreeMap<>(new ComparatorByName());tm_com.put(new Person("zhangsan", 21), "天津");tm_com.put(new Person("lisi", 22), "北京");tm_com.put(new Person("wangwua", 23), "云南");tm_com.put(new Person("wangwub", 23), "上海");tm_com.put(new Person("zhaoliu", 24), "广州");System.out.println(tm_com);// {Person [name=lisi, age=22]=北京, Person// [name=wangwua, age=23]=云南, Person// [name=wangwub, age=23]=上海, Person// [name=zhangsan, age=21]=天津, Person// [name=zhaoliu, age=24]=广州}}}class Person implements Comparable<Person> {private String name;private int age;public Person() {super();}public Person(String name, int age) {super();this.name = name;this.age = age;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}@Overridepublic String toString() {return "Person [name=" + name + ", age=" + age + "]";}@Overridepublic int hashCode() { // 覆盖Object的hashCode()方法final int prime = 31;int result = 1;result = prime * result + age;result = prime * result + ((name == null) ? 0 : name.hashCode());return result;}@Overridepublic boolean equals(Object obj) {// 覆盖Object的equals()方法if (this == obj)return true;if (obj == null)return false;if (getClass() != obj.getClass())return false;Person other = (Person) obj;if (age != other.age)return false;if (name == null) {if (other.name != null)return false;} else if (!name.equals(other.name))return false;return true;}// 本例中按照年龄进行从小到大排序,如果年龄相等,再按照姓名进行自然排序@Overridepublic int compareTo(Person o) {int temp = this.age - o.age;return temp == 0 ? this.name.compareTo(o.name) : temp;}}// 自定义比较器,按照姓名进行自然排序,如果姓名相同,再按照年龄大小进行排序class ComparatorByName implements Comparator<Person> {@Overridepublic int compare(Person o1, Person o2) {int temp = o1.getName().compareTo(o2.getName());return temp == 0 ? o1.getAge() - o2.getAge() : temp;}}
总结:如果要按照特定规则对元素进行排序,建议使用TreeMap;如果想让元素按照添加顺序排序,建议使用LinkedHashMap;其他情况都使用HashMap
0 0
- 学习笔记之JavaSE(35)--JavaAPI详解10
- 学习笔记之JavaSE(26)--JavaAPI详解1
- 学习笔记之JavaSE(29)--JavaAPI详解4
- 学习笔记之JavaSE(30)--JavaAPI详解5
- 学习笔记之JavaSE(31)--JavaAPI详解6
- 学习笔记之JavaSE(32)--JavaAPI详解7
- 学习笔记之JavaSE(33)--JavaAPI详解8
- 学习笔记之JavaSE(34)--JavaAPI详解9
- 学习笔记之JavaSE(36)--JavaAPI详解11
- 学习笔记之JavaSE(37)--JavaAPI详解12
- (黑马程序员)学习笔记,javaAPI之String
- 学习笔记之JavaSE(10)--面向对象编程1
- 学习笔记之JavaSE(19)--面向对象编程10
- 学习笔记之JavaSE(48)--IO流10
- JavaSE学习笔记之Annotation(注解)
- 学习笔记之JavaSE(38)--泛型
- HDFS学习笔记(2)hdfs_shell & JavaAPI
- javaSE学习笔记之数据类型
- win2008部署sql2012集群说明
- JAVA中重写equals()方法的同时要重写hashcode()方法
- Zigbee技术特点
- 第17章 ChannelPipeline和ChannelHandler
- 云平台上elb+haproxy证书导入配置
- 学习笔记之JavaSE(35)--JavaAPI详解10
- Android系统手机端抓包方法
- 设计模式学习笔记--过滤器模式
- C++读写表格csv——文本与表格完美桥接者
- char*,const char*和string的相互转换(转)
- 为什么要自定义UITabBarController
- 苹果ANCS协议学习
- 发送邮件+接收未读邮件
- dockerinstallbashshell