Day 9:双列集合Map及实现该接口的类的常用方法
为什么要学双列集合?
因为单列集合无法处理映射关系,会有成对出现的数据
Map接口 如果是实现了Map接口的集合类,具备的特点: 存储的数据都是以键值对的形式存在的,键不可重复,值可以重复
Map接口的方法:
添加:
put(K key, V value)
putAll(Map<? extends K,? extends V> m)
删除
remove(Object key)
clear()
获取:
get(Object key)
size()
判断:
containsKey(Object key)
containsValue(Object value)
isEmpty()
迭代:
keySet()
values()
entrySet()
import java.util.HashMap;
import java.util.Map; public class Demo1 {
public static void main(String[] args) {
Map<String,String> map = new HashMap<String,String>();
//添加
map.put("李杰","李英");
map.put("黎晨辉","王成娟");
map.put("蛮王","艾希");
map.put("zhangsan", "999999");
System.out.println(map.put("蛮王", "寡妇"));//寡妇把艾希替换了返回艾希,被替换的
System.out.println(map.put("zhangsan", "value"));//如果前面没有添加就返回null
System.out.println(map);
Map<String,String> map1 = new HashMap<String,String>();
map1.put("文章", "马伊琍");
map1.put("谢霆锋","张柏芝");
map1.put("成龙", "林凤娇");
map.putAll(map1);
System.out.println(map);
//删除
//System.out.println("被删除的数据: "+map.remove("蛮王"));//根据键值删除数据,返回的是删除的建对应的值
//System.out.println(map);
//map.clear();
//System.out.println(map); //获取
System.out.println(map.get("蛮王"));//根据指定的建获取值
System.out.println(map.size());//键值对个数 //判断
System.out.println(map.containsKey("蛮王"));//判断集合是否包含指定的建
System.out.println(map.containsValue("张柏芝"));//判断集合是否包含指定的值
System.out.println(map.isEmpty());
} }
//双列集合没有迭代器,所以在遍历双列集合的时候要返回单列集合,然后借用单列集合的迭代器
import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set; public class Demo2 {
public static void main(String[] args) {
Map<String,String> map = new HashMap<String,String>();
map.put("李杰","李英");
map.put("黎晨辉","王成娟");
map.put("蛮王","艾希");
/*
//map集合中遍历方式一: 使用keySet方法进行遍历 缺点: keySet方法只是返回了所有的键,没有值
Set<String> keysView = map.keySet();
System.out.println(keysView); //keySet() 把Map集合中的所有键都保存到一个Set类型 的集合对象中返回。
Iterator<String> it = keysView.iterator();
while(it.hasNext()) {
//System.out.println(it.next());
String list = it.next();
System.out.print("{键:"+list+",值:"+map.get(list)+"}");
System.out.println();
} //map集合的遍历方式二: 使用values方法进行 遍历 缺点: values方法只能返回所有 的值,没有键
Collection<String> valuesView = map.values();
System.out.println(valuesView);
Iterator<String> ir = valuesView.iterator();
while(ir.hasNext()) {
System.out.print(ir.next()+" ");
}
*/
//map集合的遍历方式三: entrySet方法遍历
Set<Map.Entry<String,String>> entrylist = map.entrySet();
Iterator<Map.Entry<String,String>> io = entrylist.iterator();
while(io.hasNext()){
Map.Entry<String,String> entry = io.next();
System.out.println("键:"+ entry.getKey()+" 值:"+ entry.getValue());
}
}
}
HashMap和TreeMap和Hashtable(了解)
HashMap 底层也是基于哈希表实现 的。
HashMap的存储原理:
往HashMap添加元素的时候,首先会调用键的hashCode方法得到元素 的哈希码值,然后经过运算就可以算出该
元素在哈希表中的存储位置
情况1: 如果算出的位置目前没有任何元素存储,那么该元素可以直接添加到哈希表中
情况2:如果算出 的位置目前已经存在其他的元素,那么还会调用该元素的equals方法与这个位置上的元素进行比较
,如果equals方法返回 的是false,那么该元素允许被存储,如果equals方法返回的是true,那么该元素被视为
重复元素,不允存储
import java.util.HashMap; class person{
int id;
String name; public person(int id, String name) {
super();
this.id = id;
this.name = name;
} public String toString() {
return "[编号:"+this.id+" 姓名:"+ this.name+"]";
} @Override
public int hashCode() {
// TODO Auto-generated method stub
return this.id;
}
@Override
public boolean equals(Object obj) {
person p = (person) obj;
// TODO Auto-generated method stub
return this.id == p.id;
}
} public class Demo3 {
public static void main(String[] args) {
HashMap<person,String> map = new HashMap<person,String>();
map.put(new person(110,"李杰"), "lalala");
map.put(new person(120,"李英"), "hahaha");
map.put(new person(119,"李汉斯"), "xixixi");
map.put(new person(119,"李汉斯"), "qiqiqi");
System.out.println(map);
}
}
TreeMap TreeMap也是基于红黑树(二叉树)数据结构实现的 特点:会对元素的键进行排序存储
TreeMap 要注意的事项:
1.往TreeMap添加元素的时候,如果元素的键具备自然顺序,那么就会按照键的自然顺序特性进行排序存储
2.往TreeMap添加元素的时候,如果元素的键不具备自然顺序特性, 那么键所属的类必须要实现Comparable接口,把键
的比较规则定义在CompareTo方法上
3. 往TreeMap添加元素的时候,如果元素的键不具备自然顺序特性,而且键所属的类也没有实现Comparable接口,那么就必须
在创建TreeMap对象的时候传入比较器
import java.util.Comparator;
import java.util.TreeMap; class Person {
String name;
int salary;
public Person( String name,int salary) {
super();
this.name = name;
this.salary = salary;
}
@Override
public String toString() {
return "[姓名:"+this.name+" 薪水:"+ this.salary+"]";
}
} class mycompare implements Comparator<Person>{ @Override
public int compare(Person o1, Person o2) {
// TODO Auto-generated method stub
return o1.salary - o2.salary;
} } public class Demo3 {
public static void main(String[] args) { /*TreeMap<Character, Integer> tree = new TreeMap<Character, Integer>();
tree.put('c',10);
tree.put('b',2);
tree.put('a',5);
tree.put('h',12);
System.out.println(tree);*/
TreeMap<Person,Integer> tree = new TreeMap<Person,Integer>(new mycompare());
tree.put(new Person("李杰",110), 001);
tree.put(new Person("李英",120), 002);
tree.put(new Person("李汉斯",119), 003);
System.out.println(tree); }
}
import java.util.Comparator;
import java.util.TreeMap; class Person implements Comparable{
String name;
int salary;
public Person( String name,int salary) {
super();
this.name = name;
this.salary = salary;
}
@Override
public String toString() {
return "[姓名:"+this.name+" 薪水:"+ this.salary+"]";
} @Override
public int compareTo(Object o) {
Person a = (Person) o;
return this.salary - a.salary;
} } public class Demo3 {
public static void main(String[] args) { /*TreeMap<Character, Integer> tree = new TreeMap<Character, Integer>();
tree.put('c',10);
tree.put('b',2);
tree.put('a',5);
tree.put('h',12);
System.out.println(tree);*/
TreeMap<Person,Integer> tree = new TreeMap<Person,Integer>();
tree.put(new Person("李杰",110), 001);
tree.put(new Person("李英",120), 002);
tree.put(new Person("李汉斯",119), 003);
System.out.println(tree); }
}
作业: 定义一个TreeMap,键存储的是书对象,值存储的是字符串。 根据书的出版出版日期排序
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.TreeMap; class Book<T> implements Comparable<Book>{ String name;
String date;
public Book(String name,String string) {
super();
this.name = name;
this.date = string;
}
/*
@Override
public int compareTo(Book o) { return this.date.compareTo(o.date);
}
*/
public int compareTo(Book o) {
SimpleDateFormat dataformat = new SimpleDateFormat("yyyy-mm-dd");
Date date1 = null;
Date date2 = null;
try {
date1 = dataformat.parse(this.date);
date2 = dataformat.parse(o.date);
} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} return date1.compareTo(date2);
}
@Override
public String toString() {
// TODO Auto-generated method stub
return "{书名:"+this.name+"出版日期:"+this.date+",出版社:}";
}
} public class Demo4 { public static void main(String[] args) {
TreeMap<Book, String> map = new TreeMap<Book, String>(); //值存储书名
map.put(new Book("《红楼梦》","2018-7-25"), "商务出版社");
map.put(new Book("《西游记》","2018-7-26"), "商务出版社");
map.put(new Book("《水浒传》","2018-7-27"), "商务出版社");
map.put(new Book("《三国演义》","2018-7-28"), "商务出版社");
System.out.println(map);
} }
HashTable 底层依赖哈希表存在的,实现方式与HashMap一直,但是他是线程安全的,操作效率低
Day 9:双列集合Map及实现该接口的类的常用方法的更多相关文章
- 双列集合Map
1.双列集合Map,就是存储key-value的键值对. 2.hashMap中键必须唯一,值可以不唯一. 3.主要方法:put添加数据 getKey---通过key获取数据 keySet- ...
- 双列集合Map的嵌套遍历
双列集合Map的嵌套使用,例如HashMap中还有一个HashMap,这样的集合遍历起来稍微有点儿复杂.例如一个集合:HashMap<Integer,HashMap<String,Inte ...
- (10)集合之双列集合Map,HashMap,TreeMap
Map中的元素是两个对象,一个对象作为键,一个对象作为值.键不可以重复,但是值可以重复. 看顶层共性方法找子类特有对象. Map与Collection在集合框架中属并列存在 Map存储的是键值对 Ma ...
- 双列集合Map相关面试题
一.了解Map集合吗?Map集合都有哪些实现 HashMap HashTable LinkedHashMap TreeMap ConcurrentHashMap 二.HashMap和HashTable ...
- 双列集合Map接口 & Collections工具类
HashMap 常用方法 遍历方式 iterator迭代器 ITIT HashTable 继承字典 Hashtable--Properties 文件读写 总结 Collections工具类
- Map集合(双列集合)
Map集合(双列集合)Map集合是键值对集合. 它的元素是由两个值组成的,元素的格式是:key=value. Map集合形式:{key1=value1 , key2=value2 , key3=val ...
- Map集合——双列集合
双列集合<k, v> Map: Map 和 HashMap是无序的: LinkedHashMap是有序的: HashMap & LinkedHashMap: put方法: 其中,可 ...
- Java之Map接口(双列集合)
Map集合概述 现实生活中,我们常会看到这样的一种集合:IP地址与主机名,身份证号与个人,系统用户名与系统用户对象等,这种一一对应的关系,就叫做映射.Java提供了专门的集合类用来存放这种对象关系的对 ...
- 56. Map(双列集合)
在生活中有些数据是以映射关系存在的,也就是成对出现的,比如:老公 老婆(key-->value) 双列集合:-------------------| Map 如果是实现了Map接口的集合 ...
随机推荐
- 虚拟机安装安全狗apache服务的一些问题解决方式(11.5)
首先本文鸣谢bonga的解答大部分问题=.= 由于本人比较懒所以还是喜欢问,不喜欢查啦 1.windows网站安全狗分为:IIS 和 APACHE 版本 我下载的是APACHE版本 (因为 ...
- NIO 组件Buffer
重要属性 属性 描述 Capacity 容量, 即可以容纳的最大数据量; 在缓冲区创建时被设定并且不能改变 Limit 表示缓冲区的当前终点, 不能对缓冲区超过极限的位置进行读写操作, 且极限是可以修 ...
- 吴裕雄--天生自然java开发常用类库学习笔记:Math与Random类
public class MathDemo01{ public static void main(String args[]){ // Math类中的方法都是静态方法,直接使用“类.方法名称()”的形 ...
- SQL注入过WAF(11.4 第三十三天)
WAF是什么? Web应用防护系统(也称:网站应用级入侵防御系统.英文:Web Application Firewall,简称: WAF).也叫Web防火墙,主要是对Web特有入侵方式的加强防护,如D ...
- HTML学习第二天
HTML学习第二天 今天学的比较少,有些乱,先只写一个知识点 三种样式表插入方式 外部样式表: <link rel="stylesheet" type="text/ ...
- Windows 下 GNS3 安装与基本使用指南
1.GNS3简介 GNS3是一款图形化的网络虚拟软件,可以运行在多个平台(windows,linux,mac OS).我们可以通过它来学习Cisco的认证,或者是检验将要在生产环境中部署实施的相关配置 ...
- springcloud--ribbo(负载均衡)
ribbo:是Netflix公司开源的一个负载均衡的项目,是一个客户端负载均衡器,运行在客户端上. 实际运用案例(基于springcloud入门案例): 一.新建Module:springcloud- ...
- 从PC厂商狠抓粉丝经济看,春天将至?
10月中旬,市场研究机构IDC发布的全球三季度PC出货量报告显示,第三季度全球个人电脑出货量总计6740万台,比去年同期下降0.9%.似乎这一数据的发布,依旧在证明着PC市场的颓势.但在这样的大背景下 ...
- jrebel插件的激活
转 jrebel idea插件激活,亲测可用: 在jrebel server处,写上: http://139.199.89.239:1008/88414687-3b91-4286-89ba-2dc81 ...
- ROS常见问题(三) 报错are you sure it is properly registered and that the containing library is built?
报错: [FATAL] [1576042404.913706482]: Failed to create the global_planner/GlobalPlanner planner, are y ...