Map集合_HashMap_TreeMap_等_小记
Map是一种依照键值对数据存储元素的容器。
Map中的元素是两个对象,一个对象作为键,一个对象作为值。一个键(key)和它对应的值构成map集合中的一个元素。Map集合的数据结构只跟键有关,键不可以重复,但是值可以重复。
—|Hashtable:
底层是哈希表数据结构,线程是同步的,不可以存入null键,null值。
效率较低,被HashMap 替代。
—|HashMap:
底层是哈希表数据结构,线程是不同步的,可以存入null键,null值。
要保证键的唯一性,需要覆盖hashCode方法,和equals方法。哈希表的数据结构保证了元素的唯一性,内在是因为重写了equal和HashCode方法。
—| LinkedHashMap:
该子类基于哈希表又融入了链表。可以Map集合进行增删提高效率。
—|TreeMap:
底层是二叉树数据结构。可以对map集合中的键进行排序。需要使用Comparable或者Comparator 进行比较排序。return 0,来判断键的唯一性。
Map
常用方法:
V put(K key, V value)添加键值对,第一次用put存储数据,返回null,第二次放置键相同的数据,返回第一次放置的值。
remove(K) 输入键值,移除键对应的值,并返回该值
clear() 清空集合对象
value get(key); 可以用于判断键是否存在的情况。当指定的键不存在的时候,返 回的是null。
boolean isEmpty() 判断是否为空,长度为0返回true否则false
boolean containsKey(Object key) 判断集合中是否包含指定的key
boolean containsValue(Object value) 判断集合中是否包含指定的value
Int size()
package Day16_HashMap;
import java.util.HashMap;
import java.util.Map.Entry;
import java.util.Set;
/**
* @author Aoman_Hao
*/
public class HashMapTest {
public static void main(String[] args) {
HashMap<Integer, String> Ha = new HashMap<Integer,String>();
String s1 = Ha.put(1, "刘诗诗");
String s2 = Ha.put(2, "诗诗");
String s3 = Ha.put(3, "涵");
String s4 = Ha.put(4, "TZRRY");
Ha.put(8, "TZRRY");
String s5 = Ha.put(5, "刘诗5");
Ha.put(5, "刘诗6");
//集中健的集合 keySet
Set<Integer> keySet = Ha.keySet();
for(Integer key:keySet){
System.out.println("编号:"+key+"\t"+"姓名:"+Ha.get(key));
}
System.out.println("--------------------------------");
//返回键值对的集合entrySet
Set<Entry<Integer, String>> entry = Ha.entrySet();
for(Entry<Integer, String> key2:entry ){
System.out.println("号="+key2.getKey()+"\t"+"名="+key2.getValue());
}
System.out.println("--------------------------------");
//判断是否包含键 containsKey
System.out.println("是否包含键2,"+Ha.containsKey(2));
System.out.println("是否包含键10,"+Ha.containsKey(10));
//判断是否包含值 containsValue
System.out.println("是否包含值‘刘诗诗’,"+Ha.containsValue("刘诗诗"));
System.out.println("是否包含值‘Aoman’,"+Ha.containsValue("Aoman"));
System.out.println("-----------------------");
//暴力清空
Ha.clear();
System.out.println(Ha);
}
}
输出:
编号:1 姓名:刘诗诗
编号:2 姓名:诗诗
编号:3 姓名:涵
编号:4 姓名:TZRRY
编号:5 姓名:刘诗6
编号:8 姓名:TZRRY
--------------------------------
号=1 名=刘诗诗
号=2 名=诗诗
号=3 名=涵
号=4 名=TZRRY
号=5 名=刘诗6
号=8 名=TZRRY
--------------------------------
是否包含键2,true
是否包含键10,false
是否包含值‘刘诗诗’,true
是否包含值‘Aoman’,false
-----------------------
{}
总:键相同,值覆盖,map集合的数据结构只跟键有关,如要存储不一样的数据,必须保证键值是不一样的,否则会导致存储数据跟预想的不一样,会丢失数据。map集合重写了tostring语句,所以可以有默认格式的输出,hash表的结构的特点是输出无序的,即存数据跟取数据的顺序是不一致的。
测试类
package Day16_HashMap;
import java.util.HashMap;
import java.util.Set;
/**
* @author Aoman_Hao
*/
public class HashMapTest2 {
public static void main(String[] args) {
//创建
HashMap<Star, Integer> StHa = new HashMap<Star,Integer>();
StHa.put(new Star("刘诗诗", 23, "女"), 01);
StHa.put(new Star("TZRRY", 24, "男"), 02);
StHa.put(new Star("涵", 25, "女"), 03);
StHa.put(new Star("刘六", 28, "男"), 04);
//打印成字符串
//键集合,转为数组类型,
Object[] array = StHa.keySet().toArray();
StringBuffer Sb = new StringBuffer();
for(Object key: array){
//强转star类型
Star s_Key=(Star)key;
//append拼接
Sb.append("个人信息:").append("姓名:").append(s_Key.getName()).append("\t")
.append("年龄:").append(s_Key.getAge()).append("\t")
.append("性别").append(s_Key.getGender()).append("\t")
.append("编号:").append(StHa.get(key)).append("\r\n");
}
System.out.println(Sb);
}
}
输出:
个人信息:姓名:TZRRY 年龄:24 性别男 编号:2
个人信息:姓名:刘六 年龄:28 性别男 编号:4
个人信息:姓名:涵 年龄:25 性别女 编号:3
个人信息:姓名:刘诗诗 年龄:23 性别女 编号:1
注:star是简单的姓名年龄性别的类。
LinkedHashMap的特点是元素有序,元素唯一。
有序性即存取数据的顺序是一致的,是靠链表完成的。
唯一性是靠哈希表完成的。
package Day16_HashMap;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.Set;
/**
* @author Aoman_Hao
*/
public class HashMapTest2 {
public static void main(String[] args) {
//创建
HashMap<Star, Integer> StHa = new LinkedHashMap<Star,Integer>();
StHa.put(new Star("刘诗诗", 23, "女"), 01);
StHa.put(new Star("TZRRY", 24, "男"), 02);
StHa.put(new Star("涵", 25, "女"), 03);
StHa.put(new Star("刘六", 28, "男"), 04);
//打印成字符串
//键集合,转为数组类型,
Object[] array = StHa.keySet().toArray();
StringBuffer Sb = new StringBuffer();
if(StHa!=null){
for(Object key: array){
//强转star类型
Star s_Key=(Star)key;
//append拼接
Sb.append("个人信息:").append("姓名:").append(s_Key.getName()).append("\t")
.append("年龄:").append(s_Key.getAge()).append("\t")
.append("性别").append(s_Key.getGender()).append("\t")
.append("编号:").append(StHa.get(key)).append("\r\n");
}
System.out.println(Sb);
}
}
}
输出:
个人信息:姓名:刘诗诗 年龄:23 性别女 编号:1
个人信息:姓名:TZRRY 年龄:24 性别男 编号:2
个人信息:姓名:涵 年龄:25 性别女 编号:3
个人信息:姓名:刘六 年龄:28 性别男 编号:4
注:增强for循环前定要对集合进行非空判断,否则会出现空指针异常。
HashMap嵌套串用,可与ArrayList搭配使用
package Day16_HashMap;
import java.util.HashMap;
import java.util.Set;
/**
*
*
* 集合嵌套之HashMap嵌套HashMap
偶像派(没演技)
杨幂 30 女
杨颖 30 女
实力派
刘诗诗 27 女
胡歌 30 男
* @author Aoman_Hao
*/
public class HashMapQT {
public static void main(String[] args) {
//创建小集合
HashMap<Star, String> Idol = new HashMap<Star,String>();
HashMap<Star, String> Actor = new HashMap<Star,String>();
//创建大集合
HashMap<String, HashMap<Star, String>> Hash = new HashMap<String,HashMap<Star, String>>();
//添加元素
Idol.put(new Star("杨幂", 30, "女"), "i1");
Idol.put(new Star("杨颖", 30, "女"), "i2");
Actor.put(new Star("刘诗诗", 27, "女"), "a1");
Actor.put(new Star("胡歌", 30, "男"), "a1");
Hash.put("偶像", Idol);
Hash.put("实力派", Actor);
Set<String> Hash_keyset = Hash.keySet();
//遍历大集合
for(String fen:Hash_keyset){
//得到大集合中元素,求的其键
HashMap<Star, String> Hash_son = Hash.get(fen);
Set<Star> Hash_son_keySet = Hash_son.keySet();
//格式打印
System.out.println("分类:"+fen);
System.out.println("\t"+"姓名:"+"\t"+"年龄:"+"\t"+"性别:"+"\t"+"编号:");
//建立缓冲区,append拼接
StringBuffer Sb = new StringBuffer();
//遍历小集合
for(Star key:Hash_son_keySet){
Sb.append("\t").append(key.getName()).append("\t")
.append(key.getAge()).append("\t")
.append(key.getGender()).append("\t")
.append(Hash_son.get(key)).append("\r\n");
}
System.out.println(Sb);
}
}
}
输出:
分类:实力派
姓名: 年龄: 性别: 编号:
胡歌 30 男 a1
刘诗诗 27 女 a1
分类:偶像
姓名: 年龄: 性别: 编号:
杨幂 30 女 i1
杨颖 30 女 i2
Collections常用法
public static void sort(List list): 排序,默认按照自然顺序
public static int binarySearch(List<> list,T key): 二分查找
public static T max(Collection<> coll): 获取最大值
public static void reverse(List<> list): 反转
public static void shuffle(List<> list): 随机置换

浙公网安备 33010602011771号