Map
1.Map是一个接口类,没有继承自Collection,存储的是<K,V>结构的键值对,K唯一且不重复
注意:
- Map是一个接口,不能直接实例化对象,要想实例化对象只能实例化Map的实现类TreeMap和HashMap
- Map中存放的K不能重复,V可以重复
- 在Map中插入键值对时K不能为空,否则抛异常,但是V可以为空
- Map键值对中K不能直接修改,V可以修改,要想修改只能先删除K再插入
TreeMap的实现
package map_set;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;
public class TreeMapDemo {
public static void main(String[] args) {
Map<String,String> map=new TreeMap<>();
System.out.println("map中键值对的个数:"+map.size());
map.put("apple","苹果");
map.put("orange","橘子");
map.put("banana","香蕉");
System.out.println("map中键值对的个数:"+map.size());
//遍历map
for (Map.Entry<String,String> e:map.entrySet()) {
System.out.println(e+" ");
}
//如果map中有相同的键那么就会覆盖之前的键对应的值
map.put("apple","大苹果");
System.out.println("map中键值对的个数:"+map.size());
System.out.println(map);
//通过键获取值
System.out.println(map.get("banana"));
//返回对应键的值,key不存在就返回默认值
System.out.println(map.getOrDefault("caomei","草莓"));
//如果插入的键值对键为null就报错,这里捕获了异常
try {
map.put(null,"null");
}catch (Exception e){
System.out.println("不能插空的键");
}
//打印所有key
for (String key:map.keySet()) {
System.out.println(key);
}
//打印所有value
for (String value:map.values()) {
System.out.println(value);
}
}
}
map中键值对的个数:0
map中键值对的个数:3
//跟插入的顺序不一致,因为TreeMap对于key是有序的
apple=苹果
banana=香蕉
orange=橘子
map中键值对的个数:3
{apple=大苹果, banana=香蕉, orange=橘子}
香蕉
草莓
不能插空的键
apple
banana
orange
大苹果
香蕉
橘子
HashMap实现
package map_set;
import java.util.HashMap;
import java.util.Map;
public class HashMapDemo {
public static void main(String[] args) {
//HashMap:无序
Map<String,String> m1=new HashMap<>();
m1.put("peach","桃子");
m1.put("orange","橘子");
m1.put("apple","苹果");
System.out.println(m1.size());
//如果插入的键值对的key存在,value不同那么就会value覆盖
m1.put("orange","橙子");
System.out.println(m1);
System.out.println(m1.put("caomei","草莓"));
//key值不能为空,否则造成空指针异常
// m1.put(null,"香蕉");
//value值可以为空
m1.put("banana","香蕉");
System.out.println(m1.get("apple"));
System.out.println(m1.getOrDefault("apple","苹果手机"));
System.out.println(m1.getOrDefault("watermelon","西瓜"));
System.out.println(m1);
System.out.println(m1.remove("bananan"));
if (m1.containsKey("banana")){
System.out.println("存在");
}else {
System.out.println("不存在");
}
System.out.println(m1.remove("banana"));
//找key时间复杂度:O(logN),挨个遍历
if (m1.containsKey("banana")){
System.out.println("存在");
}else {
System.out.println("不存在");
}
//打印所有key
//keySet()将所有key放在set中返回
for (String s:m1.keySet()){
System.out.println(s+" ");
}
//打印所有value
for (String s:m1.values()) {
System.out.println(s+" ");
}
//打印所有键值对
for (Map.Entry<String,String> e:m1.entrySet()) {
System.out.println(e+" ");
}
}
}
3
{orange=橙子, apple=苹果, peach=桃子}
null
苹果
苹果
西瓜
{orange=橙子, banana=香蕉, apple=苹果, peach=桃子, caomei=草莓}
null
存在
香蕉
不存在
orange
apple
peach
caomei
橙子
苹果
桃子
草莓
orange=橙子
apple=苹果
peach=桃子
caomei=草莓
TreeMap和HashMap区别
Set
Set和Map主要的不同有两点:
1.set继承自Collection接口类
2.set中只存储了key
注意:
- Set是继承自Collection的一个接口类
- Set中只存储了key,并且要求key一定要唯一
- Set的底层是使用Map来实现的,其使用key与Object的一个默认对象作为键值对插入到Map中的
- Set最大的功能就是对集合中的元素进行去重
- 实现Set接口的常用类有TreeSet和HashSet,还有一个LinkedHashSet,LinkedHashSet是在HashSet的基础
上维护了一个双向链表来记录元素的插入次序。 - Set中的Key不能修改,如果要修改,先将原来的删除掉,然后再重新插入
- Set中不能插入null的key。
- TreeSet和HashSet的区别
TreeSet实现
import java.util.TreeSet;
import java.util.Iterator;
import java.util.Set;
public static void TestSet(){
Set<String> s = new TreeSet<>();
// add(key): 如果key不存在,则插入,返回ture
// 如果key存在,返回false
boolean isIn = s.add("apple");
s.add("orange");
s.add("peach");
s.add("banana");
System.out.println(s.size());
System.out.println(s);
isIn = s.add("apple");
// add(key): key如果是空,抛出空指针异常
//s.add(null);
// contains(key): 如果key存在,返回true,否则返回false
System.out.println(s.contains("apple"));
System.out.println(s.contains("watermelen"));
// remove(key): key存在,删除成功返回true
// key不存在,删除失败返回false
// key为空,抛出空指针异常
s.remove("apple");
System.out.println(s);
s.remove("watermelen");
System.out.println(s);
// 抛出空指针异常
// s.remove(null);
Iterator<String> it = s.iterator();
while(it.hasNext()){
System.out.print(it.next() + " ");
}
System.out.println();
}