JAVA基础之Map接口
个人理解:
个人感觉Map接口以后会经常用到,可以很清晰地查找某个对象,要熟悉其四种遍历方法。特别注意其键值对的键不能是重复的,有想定义有序存取的话,可以使用LinkedHashMap集合。不过定义自定义对象时,要复写其对象的hashCode和equals方法。静态导入的话,不用编辑器的话可以使用下。再定义方法时有多个参数的话,可以使用可变参数,不过只能一个且在最后面。Collections的工具类可以对数据进行升序和打乱顺序。集合是可以嵌套的。
详见https://blog.csdn.net/zhangqunshuai/article/details/80660974
一、Map接口概述:
Map接口下的集合与Collection接口下的集合存储数据的不同在于:
Map中的集合,元素是以键值对的形式存在的,但是集合中不能包含重复的键,值可以重复,每个键只能对应一个值。常用集合为HashMap集合、LinkedHashMap集合(有序)。
二、常用方法:
1、get():获取指定键对应的值;
2、put():将指定的键与值对应起来,并添加到集合中,返回对应的值,无的话返回null;
3、remove():移除
三、Map集合遍历键找值方式:
keySet() 返回此key所在的Set集合
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set; public class Demo01 {
public static void main(String[] args) {
Map<String,String> map=new HashMap<String,String>();
map.put("1","a");
map.put("2","a");
map.put("3","b");
map.put("3","c");
//删除元素
map.remove("3");
//System.out.println(map.get("3"));
//ketset遍历集合
//1.获取所有key的set集合
/* Set<String> set=map.keySet();
//2.遍历set集合取到每一个key
for(String key:set){
//3.根据每个key获取每个值
System.out.println(key+"...."+map.get(key));
}*/
//使用迭代器遍历
//1.获取所有key的集合
Set<String> set=map.keySet();
//2.获取迭代器对象
Iterator<String> it=set.iterator();
//3.判断容器中是否有值
while(it.hasNext()){
//获取每一个key值
String key=it.next();
//根据每一个key值获取每一个Value值
System.out.println(key+"..."+map.get(key));
}
四、Entry键值对对象:Map.Entry<K,V>
1、在Map类设计时,提供了一个嵌套接口(又定义一个接口):Entry。Entry将键值对的对应关系封装成了对象。即键值对对象。
2、方法:
getKey() 返回Entry对象中的键
getValue() 返回Entry对象中的值
entrySet() 用于返回Map集合中所有的键值对(Entry)对象,以Set集合形式返回
3、Map集合遍历键值对方式:
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set; public class Demo02 {
public static void main(String[] args) {
Map<String,String> map=new HashMap<String,String>();
map.put("1","a");
map.put("2","a");
map.put("3","b");
map.put("3","c");
//entrySet遍历(增强for遍历)
//1.获取所有结婚证对象存在的Set集合;
/*Set<Map.Entry<String,String>> set=map.entrySet();
//2.遍历所有结婚证取到每一个结婚证
for(Map.Entry<String, String> entry:set){
//3.通过每一个结婚证对象获取key
String key=entry.getKey();
//4.通过每一个结婚证对象获取value;
String value=entry.getValue();
System.out.println(key+"...."+value);
}*/
//迭代器遍历
Set<Map.Entry<String,String>> set=map.entrySet();
Iterator<Map.Entry<String,String>> it=set.iterator();
while(it.hasNext()){
Map.Entry<String,String> entry=it.next();
String key=entry.getKey();
String value=entry.getValue();
System.out.println(key+"..."+value);
}
五、HashMap存储自定义类型键值:
1、当给HashMap中存放自定义对象时,如果自定义对象作为key存在,这时要保证对象唯一,必须复写对象的hashCode和equals方法。
2、如果要保证map中存放的key和取出的顺序一致,可以使用LinkedHashMap集合来存放。
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Set; public class Demo04 {
public static void main(String[] args) {
Map<String,Person> map=new LinkedHashMap<String,Person>();
map.put("java0322", new Person("熊三",33));
map.put("java0222", new Person("熊大",22));
map.put("java0611", new Person("熊三",33));
//遍历(entrySet迭代器)
//获取集合
Set<Map.Entry<String,Person>> set=map.entrySet();
//获取迭代器对象
Iterator<Map.Entry<String,Person>> it=set.iterator();
//循环判断下个元素是否有值
while(it.hasNext()){
//获取每个对象
Map.Entry<String, Person> entry=it.next();
//获取key
String key=entry.getKey();
//获取value
Person value=entry.getValue();
System.out.println(key+"..."+value);
}
}
}
六、静态导入:
在导包的过程中我们可以直接导入静态部分,这样某个类的静态成员就可以直接使用了。在源码中经常会出现静态导入。
静态导入格式:
import static XXX.YYY; 导入后YYY可直接使用。
package com.oracle.demo02;
import static java.lang.System.out;
import static java.lang.Math.PI; public class Demo01 {
public static void main(String[] args) {
out.println("你好");
out.print("Hello");
out.println(2*PI);
}
}
七、可变参数:
在JDK1.5之后,如果我们定义一个方法需要接受多个参数,并且多个参数类型一致,我们可以对其简化成如下格式:
修饰符 返回值类型 方法名(参数类型... 形参名){ }
其实这个书写完全等价与
修饰符 返回值类型 方法名(参数类型[] 形参名){ }
只是后面这种定义,在调用时必须传递数组,而前者可以直接传递数据即可。
package com.oracle.demo02; public class Demo02 {
public static void main(String[] args) {
int sum=add(1,2,3,5,6,11,33,44);
System.out.println(sum);
}
//写方法,计算整数参数的和
public static int add(int...a){
int sum =0;
/*for(int i:a){
sum=sum+i;
}*/
for(int i=0;i<a.length;i++){
sum=sum+a[i];
}
return sum;
}
}
add方法在同一个类中,只能存在一个。因为会发生调用的不确定性
注意:如果在方法书写时,这个方法拥有多参数,参数中包含可变参数,可变参数一定要写在参数列表的末尾位置。
八、Collections集合工具类:
shuffle() 随机置换(只能传list)
sort() 集合元素升序排列
import java.util.ArrayList;
import java.util.Collections; public class Demo03 {
public static void main(String[] args) {
ArrayList<String> arr=new ArrayList<String>();
arr.add("a");
arr.add("b");
arr.add("c");
arr.add("d");
for(String s:arr){
System.out.print(s+" ");
}
System.out.println();
//打乱集合中元素顺序
Collections.shuffle(arr);
for(String s:arr){
System.out.print(s+" ");
}
System.out.println();
//排序
Collections.sort(arr);
for(String s:arr){
System.out.print(s+" ");
}
}
}
九、集合嵌套:
集合嵌套,仅仅是集合内容又是集合,如Collection集合嵌套、Collection集合与Map集合相互嵌套、Map集合嵌套。
package com.oracle.demo02; import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set; import com.oracle.demo01.Person; public class Demo04 {
public static void main(String[] args) {
HashMap<String,HashMap<Person,String>> map=new HashMap<String,HashMap<Person,String>>();
//第一个小map
HashMap<Person,String> map1=new HashMap<Person,String>();
map1.put(new Person("袁一鸣",21), "java0322");
map1.put(new Person("韩振宇",21), "java0322");
//第二个小map
HashMap<Person,String> map2=new HashMap<Person,String>();
map2.put(new Person("孙鹏坤",24), "java0929");
map2.put(new Person("李瑞",21), "php0705");
//向大的map存数据
map.put("java班", map1);
map.put("php班", map2);
//1、遍历
//获取大map中所有的key的所在的Set集合
/*Set<String> bigkeys=map.keySet();
//遍历所有key
for(String bigkey:bigkeys){
//根据bigkey获取小map的对象
HashMap<Person,String> smallmap=map.get(bigkey);
//获取小map所有的key所在的set集合
Set<Person> smallkeys=smallmap.keySet();
//遍历小map的key
for(Person smallkey:smallkeys){
//根据smallkey获取对应的value值
System.out.println(bigkey+"..."+smallkey+"..."+smallmap.get(smallkey));
}
}*/
//2、使用迭代器遍历
//获取大的Key集合
/*Set<String> bigkeys=map.keySet();
//获取迭代器对象
Iterator<String> bigkey=bigkeys.iterator();
//判断
while(bigkey.hasNext()){
//获取迭代器中每个key值
String bigkey1=bigkey.next();
//根据bigkey1获取小的对象
HashMap<Person,String> smallmap=map.get(bigkey1);
//获取小的key的集合
Set<Person> smallkeys=smallmap.keySet();
//获取迭代器对象
Iterator<Person> smallkey=smallkeys.iterator();
//判断
while(smallkey.hasNext()){
//获取每个小key
Person smallkey1=smallkey.next();
System.out.println(bigkey1+"..."+smallkey1+"..."+smallmap.get(smallkey1));
}
}*/
//3、entrySet遍历(增强for遍历)
//获取大的键值对所在的集合
/* Set<Map.Entry<String,HashMap<Person,String>>> bigkeys=map.entrySet();
//增强for循环遍历
for(Map.Entry<String,HashMap<Person,String>> entry:bigkeys){
//通过每个键值对获取每个大key
String bigkey=entry.getKey();
//获取每个小Map
HashMap<Person,String> smallmap=entry.getValue();
//获取每个小map的小key所在的集合
Set<HashMap.Entry<Person,String>> smallkeys=smallmap.entrySet();
//循环
for(HashMap.Entry<Person,String> smallkey:smallkeys){
//获取每个小key
Person smallkey1=smallkey.getKey();
//获取每个value
String value =smallkey.getValue();
System.out.println(bigkey+"..."+smallkey+"..."+value);
}
}*/
//4、entrySet迭代器遍历
//获取大的键值对所在的集合
Set<Map.Entry<String,HashMap<Person,String>>> bigmaps=map.entrySet();
//获取迭代器对象
Iterator<Map.Entry<String,HashMap<Person,String>>> bigmap=bigmaps.iterator();
//判断
while(bigmap.hasNext()){
//获得每一个键值对
Map.Entry<String,HashMap<Person,String>> bigmap1=bigmap.next();
//获取大key
String bigkey=bigmap1.getKey();
//获取小map
HashMap<Person,String> smallmap=bigmap1.getValue();
//获取小的键值对所在的集合
Set<HashMap.Entry<Person,String>> smallkeys=smallmap.entrySet();
//获取迭代器对象
Iterator<HashMap.Entry<Person,String>> smallkey=smallkeys.iterator();
//判断
while(smallkey.hasNext()){
//获取小键值对
HashMap.Entry<Person,String> smallkey1=smallkey.next();
//获取小key
Person smallkey2=smallkey1.getKey();
//获取小value
String value=smallkey1.getValue();
System.out.println(bigkey+"..."+smallkey1+"..."+value);
}
} }
}
十、集合继承体系的面向对象思想
1、接口:用来明确所有集合中该具有的功能,相当于在定义集合功能标准;
2、抽象类:把多个集合中功能实现方式相同的方法,抽取到抽象类实现,具体集合不再遍写,继承使用即可;
3、 具体类:继承抽象类,实现接口,重写所有抽象方法,达到具备指定功能的集合。每个具体集合类,根据自身的数据存储结构方式,对接口中的功能方法,进行不同方式的实现。
JAVA基础之Map接口的更多相关文章
- Java基础-通过POI接口处理xls
Java基础-通过POI接口处理xls 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任.
- Java基础-Collection子接口之Set接口
Java基础-Collection子接口之Set接口 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 学习Collection接口时,记得Collection中可以存放重复元素,也可 ...
- Java基础-Collection子接口之List接口
Java基础-Collection子接口之List接口 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 我们掌握了Collection接口的使用后,再来看看Collection接口中 ...
- Java基础关于Map(字典)的方法使用
Java基础关于Map(字典)的方法使用 java中一般用map与hashmap来创建一个key-value对象 使用前提是要导入方法包: import java.util.HashMap: impo ...
- 《Java基础——抽象与接口》
Java基础--抽象与接口 一.抽象: 规则: 关键字 abstract 修饰的类称为抽象类. 子类通过关键字extends实现继承. 关键字 abstract 修饰的方法称为抽象方法,抽 ...
- Java集合中Map接口的使用方法
Map接口 Map提供了一种映射关系,其中的元素是以键值对(key-value)的形式存储的,能够实现根据key快速查找value: Map中的键值对以Entry类型的对象实例形式存在: 建(key值 ...
- Java集合之Map接口
Map使用键值对来存储数据,将键映射到值对象,一个映射不能包含重复的键,每一个键最多只能映射到一个值.Map接口的具体实现类:HashMap,Hashtable,TreeMap,LinkedHashM ...
- 黑马程序员——JAVA基础之Map集合
------- android培训.java培训.期待与您交流! ---------- Map集合: 该集合存储键值对.一对一对往里存.而且要保证键的唯一性. 和Set很像,其实Set底层就是使用了M ...
- java 基础 --Collection(Map)
Map是不是集合?哈哈哈 java编程思想>的第11章,第216页,正数第13行,中原文:“……其中基本的类型是LIst.Set.Queue和Map.这些对象类型也称为集合类,但由于Java类库 ...
随机推荐
- 【Lintcode】011.Search Range in Binary Search Tree
题目: Given two values k1 and k2 (where k1 < k2) and a root pointer to a Binary Search Tree. Find a ...
- Python3解leetcode Symmetric Tree
问题描述: Given a binary tree, check whether it is a mirror of itself (ie, symmetric around its center). ...
- Spring 3.1新特性之三:Spring支持Servlet 3.0(待补充)
高效并发是JDK 1.6的一个重要主题,HotSpot虚拟机开发团队在这个版本上花费了大量的精力去实现各种锁优化技术,如适应性自旋(Adaptive Spinning).锁削除(Lock Elimin ...
- java.lang.NoClassDefFoundError: org/springframework/dao/support/DaoSupport
转自:https://blog.csdn.net/lzx159951/article/details/79753493 1. 缺少:org.springframework.transaction-3. ...
- thinkpad取消fn键功能
转自:https://bbs.thinkpad.com/thread-1834235-1-1.html 1就是一直觉得fn建自动开启很烦人,于是百度后得到 我们可以 控制面板 -- 键盘--think ...
- 塞尔达:旷野之息个人对比上古卷轴V:天际
上古卷轴5是我之前玩过最优秀的作品.玩塞尔达的时候就有跟上古卷轴5比对,真的都是神作.两个游戏的自由度都是真的高. 主线剧情上,老滚5印象不深了,当时就知道战斗,只记住了开头砍头现场,还有奥杜因这个龙 ...
- [xdoj1227]Godv的数列(crt+lucas)
解题关键:1001=7*11*13,模数非常小,直接暴力lucas.递归次数几乎为很小的常数.最后用中国剩余定理组合一下即可. 模数很小时,一定记住lucas定理的作用 http://acm.xidi ...
- 怎么查看linux系统是32还是64
1.getconf LONG_BIT or getconf WORD_BIT例如:2.file /bin/ls例如: 查看linux的版本:
- Linux 程式減肥(strip & objcopy)(转载)
转自:http://calamaryshop.blogspot.com/2011/11/linux-strip-objcopy.html 對於設計嵌入式Linux系統的研發人員來說,記憶體的空間是非常 ...
- EF中外键重命名,打破原先的约束规则
本人建议玩code frist的人多用用System.ComponentModel.DataAnnotations和System.ComponentModel.DataAnnotations.Sche ...