介绍
Map在Java⾥边是⼀个接⼝,常⻅的实现类有HashMap、LinkedHashMap、TreeMap和ConcurrentHashMap
内嵌类
Map是java中的接口,Map.Entry是Map的一个内部接口
Map集合封装键值对类型的数据,在Map集合的底层,每一个Key-Value键值对都被封装到一个Entry类型的子容器中,一个Entry对象只包含一个键值对,Map集合底层使用entry对象来存储这些键值对,在遍历Map集合时,可以通过遍历Key来遍历Map集合,还可以通过遍历entry对象来遍历集合。
Entry接口提供了getKey()方法和getValue()方法,用来获取entry对象存储的key和value值。
map 中的key使用set来进行存放的,注意由于是set来进行存储的, 那么不允许key是重复的
Map 接口提供三种collection 视图,允许以键集、值集或键-值映射关系集的形式查看某个映射的内容。
k,v默认是object类型
常用API
包含键/值
存储/复制存储/如果不存在则存储否则返回当前值
移除
三种视图
结论:使用键值映射关系集,entry视图
键值映射关系集
推荐 直接通过Entry对象获取键和值,一个Entry只存储一个键值对
1 @Test 2 public void mapTest() { 3 HashMap<String,Object>map=new HashMap<>(); 4 map.put("1号",1); 5 map.put("2号","222"); 6 map.put("3号",666); 7 for(Map.Entry<String,Object> e:map.entrySet() 8 ){ 9 System.out.println(e.getKey()+"="+e.getValue()); 10 } 11 }
键集
只获取Map的键,返回Set
1 //返回键的set视图 2 Set<String>se=map.keySet(); 3 for(String a:se 4 ){ 5 System.out.println("k:"+a+map.get(a)); 6 }
值集
只获取Map的值,返回Collection,而且没有通过值找键的直接API
1 //返回值的Collection视图 2 Collection<Object>k=map.values(); 3 for(Object o:k 4 ){ 5 //该视图没有通过值找键的方法,Entry里面有直接获取键、值的方法 6 System.out.println(o); 7 }
HashMap
结果和hashset一样,无序,不能保证映射的顺序
通过hashcode和equals来判断键是否重复
基于hash表的Map接口实现,HashMap底层数据结构是数组+链表/红⿊树
此实现提供所有可选的映射操作,并允许使用null值和null键
HashMap类大致相当于Hashtable ,除了它是不同步的,并允许null
构造方法
负载因子是在容量自动增加之前允许哈希表得到满足的度量
通常,默认负载因子(0.75)提供了时间和空间成本之间的良好折衷。 更高的值会减少空间开销,但会增加查询条目的时间成本
常用API
HashTable
此类实现一个哈希表,该哈希表将键映射到相应的值。任何非 null 对象都可以用作键或值
为了成功地在哈希表中存储和获取对象,用作键的对象必须实现 hashCode 方法和 equals 方法。
维护着一个运行于所有条目的双重链接列表
Hashtable是同步的。 如果不需要线程安全的实现,建议使用HashMap代替Hashtable 。 如果需要线程安全的并发实现,那么建议使用ConcurrentHashMap代替Hashtable 。
LinkedHashmap
Map 接口的哈希表和链接列表实现,具有可预知的迭代顺序
此链接列表定义了迭代顺序,该迭代顺序通常就是将键插入到映射中的顺序(插入顺序)。
底层数据结构是数组+链表/红⿊树+双向链表
TreeMap
根据键的自然排序进行排序
自定义类可以自定义排序(和treeset相似),
- 实现comparable接口,重写comparetTo方法
- 定义比较器,实现comparator接口,重写compare方法
底层数据结构是红⿊树
排序
例子对象类
1 package map; 2 //对象类 3 public class Users implements Comparable<Users>{ 4 private String name; 5 private Integer age; 6 7 @Override 8 public int compareTo(Users o) { 9 // this-传入对象 顺序排列 10 int i=this.age-o.age; 11 return i==0?this.name.compareTo(o.name):i; 12 } 13 14 @Override 15 public String toString() { 16 return "Users{" + 17 "name='" + name + '\'' + 18 ", age=" + age + 19 '}'; 20 } 21 22 public Users() { 23 } 24 25 public Users(String name, Integer age) { 26 this.name = name; 27 this.age = age; 28 } 29 30 public String getName() { 31 return name; 32 } 33 34 public void setName(String name) { 35 this.name = name; 36 } 37 38 public Integer getAge() { 39 return age; 40 } 41 42 public void setAge(Integer age) { 43 this.age = age; 44 } 45 }
两种排序
package map; import java.util.Comparator; import java.util.Map.Entry; import java.util.TreeMap; //TreeMap两种排序方法,同treeset public class TreeMaps { public static void main(String[] args) { // test1(); new TreeMaps().test2(); } //此方法创建TreeMap private static TreeMap<Users,Object> creat(){ TreeMap<Users,Object> tre=new TreeMap<>(); tre.put(new Users("张",22),1); tre.put(new Users("李",12),"2号"); tre.put(new Users("王",26),"3号"); return tre; } //遍历方法-通过映射的set视图,k对象实现comparable,重写compareTo,为自定义自然排序 public static void test1(){ for (Entry<Users,Object> en:creat().entrySet() ) { System.out.println(en.getKey()+":"+en.getValue()); } } //自定义排序,通过自定义的比较器 private void test2(){ //传入比较器时,传的是实例化的比较器 TreeMap<Users,Object> ttt=new TreeMap<>(new Com() ); //复制映射关系到此映射中 ttt.putAll(creat()); System.out.println(ttt); } } //自定义比较器类 class Com implements Comparator<Users> { @Override public int compare(Users o1, Users o2) { int i = o1.getName().length() - o2.getName().length(); return i== 0 ? o1.getAge()-o2.getAge() : i; } }
标签:Map,name,map,age,TreeMap,集合,public From: https://www.cnblogs.com/deity-night/p/17131750.html