java基础 之 Map集合

Map集合

  • map集合是一个双列集合,一个元素包含两个值(一个key,一个Value)。
  • map集合中的元素,key和value的数据类型可以相同,也可以不同。
  • map集合中的元素,key不允许重复,value是可以重复的。
  • map集合中的元素,key和value事一一对应的。
成员方法:
  • public V put(K key, V value): 把指定的键与指定的值添加到Map集合中。
public class MapDemo {
    public static void main(String[] args) {
        demo();
    }
     /*`public V put(K key, V value)`:  把指定的键与指定的值添加到Map集合中。
        返回值V
            存储的key不重复的时候,返回值V是null
            存储的key重复,会使用心得value替换map中重复的value,返回被替换的value。
      */
    private static void demo() {
        //创建map集合,使用多态
        Map<String,String> m=new HashMap<>();
        String s1=m.put("fjc","ltf");
        System.out.println(s1);
        //key重复,会使用心得value替换map中重复的value,返回被替换的value。
        String s2=m.put("fjc","ltf1");
        System.out.println(s2);
        //重写了toString方法
        System.out.println(m);
    }
}

运行结果:

null
ltf
{fjc=ltf1}
  • public V remove(Object key): 把指定的键 所对应的键值对元素 在Map集合中删除,返回被删除元素的值。
private static void demo() {
        //创建map集合,使用多态
        Map<String,String> m=new HashMap<>();
        m.put("fjc","ltf");
        m.put("杨过","小龙女");
        System.out.println(m);
        //`public V remove(Object key)`: 把指定的键 所对应的键值对元素 在Map集合中删除,返回被删除元素的值。
        m.remove("fjc");
        System.out.println(m);
    }

运行结果:

{杨过=小龙女, fjc=ltf}
{杨过=小龙女}
  • public V get(Object key) 根据指定的键,在Map集合中获取对应的值。
//* `public V get(Object key)` 根据指定的键,在Map集合中获取对应的值。
        String s=m.get("fjc");
        System.out.println(s);
    }
  • boolean containsKey(Object key) 判断集合中是否包含指定的键。
// `boolean containsKey(Object key)  ` 判断集合中是否包含指定的键。
        boolean s=m.containsKey("fjc");
        boolean s1=m.containsKey("fff");
        System.out.println(s);
        System.out.println(s1);

运行结果:

true
false
  • public Set<K> keySet(): 获取Map集合中所有的键,存储到Set集合中。
// `public Set<K> keySet()`: 获取Map集合中所有的键,存储到Set集合中。
        //获取所有的键  获取键集
        Set<String> keys = m.keySet();
        for(String key:keys) {
            String value=m.get(key);
            System.out.println(key+"的值是"+value);
        }
  • public Set<Map.Entry<K,V>> entrySet(): 获取到Map集合中所有的键值对对象的集合(Set集合)。
Map.Entry<K,V>
  • 在Map接口中有一个内部接口Entry
  • 当Map集合一创建,那么就会在Map集合中创建一个Entry对象,用来记录键与值。
方法:
  • set<Map.Entry<K,V>> entrySet() 把map集合内部的多个Entry对象取出来,储存到一个Set集合中。
  • public K getKey():获取Entry对象中的键。
  • public V getValue():获取Entry对象中的值。
private static void demo() {
        //创建map集合,使用多态
        Map<String,String> m=new HashMap<>();
        m.put("fjc","ltf");
        m.put("杨过","小龙女");
        m.put("aaa","bbb");
        Set<Map.Entry<String, String>> set=m.entrySet();
        for(Map.Entry<String, String> s:set){
            String key=s.getKey();
            System.out.println(key);
            String value=s.getValue();
            System.out.println(value);
        }

HashMap

  • 基于哈希表的,查询速度特别快。
  • 是一个无序的集合,存储元素和取出元素可能不一致。
@Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (!(o instanceof Student)) return false;
        Student student = (Student) o;
        return age == student.age &&
                name.equals(student.name);
    }

    @Override
    public int hashCode() {
        return Objects.hash(name, age);
    }
public static void main(String[] args) {
        show();
    }
    private static void show() {
        //创建HashMap对象
        HashMap<Student,String> map=new HashMap<>();
        map.put(new Student("fjc",18),"山西");
        map.put(new Student("ltf",20),"湖南");
        map.put(new Student("lwh",20),"浙江");
        map.put(new Student("fjc",18),"浙江");
        Set<Student> set=map.keySet();
        for (Student s:set){
            System.out.println(s+":"+map.get(s));
        }
    }
  • 重写hashCode和equals方法来保证key的唯一。

LinkHashMap

  • 基于哈希表+链表(保证了迭代的顺序)
  • 是一个有序的集合,存储元素和取出元素一致。

HashTable

  • 实现了Map接口
  • HashTable底层是一个哈希表,是一个线程安全的集合,是单线程集合,速度慢。不可以存储null值,null键。
  • HashMap底层是一个哈希表,是一个线程不安全的集合,是多线程集合,速度快。可以存储null值,null键。

map集合练习

public class MapTest {
public static void main(String[] args) {
        System.out.println("请录入一个字符串:");
        String line = new Scanner(System.in).nextLine();
        // 定义 每个字符出现次数的方法
        findChar(line);
    }
    private static void findChar(String line) {
        //1:创建一个集合 存储  字符 以及其出现的次数
        HashMap<Character, Integer> map = new HashMap<Character, Integer>();
        //2:遍历字符串
        for (int i = 0; i < line.length(); i++) {
            char c = line.charAt(i);
            //判断 该字符 是否在键集中
            if (!map.containsKey(c)) {//说明这个字符没有出现过
                //那就是第一次
                map.put(c, 1);
            } else {
                //先获取之前的次数
                Integer count = map.get(c);
                //count++;
                //再次存入  更新
                map.put(c, ++count);
            }
        }
        System.out.println(map);
    }
}

JDK9对集合的优化

  • List接口,Set接口,Map接口里面增加了一个静态方法,可以集合一次性添加多个元素。
  • of方法只适用于List接口,Set接口,Map接口,不适用于他的实现类。
  • 长度固定,不能使用add,remove,put等方法。
  • set接口不能传入重复的元素,否则会抛出异常。
List<String> l=new List.of("a","b");
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值