JavaSE中级之集合五——Map接口

JavaSE中级之集合五

Map接口

常用方法

  • put、clear、remove、containsKey、containsValue、size、equals、isEmpty、get

    • put--------------->添加元素到集合
    • clear--------------->清除集合里面所有元素
    • remove--------------------->移除集合里的某一个元素
    • containsKey---------------------->查看集合中是否有某个key
    • containsValue---------------->查看集合中是否有某个Value
    • size------------->查看集合元素个数,Key值相同的只会记录一个
    • equals------------->判断集合中的值是否一致
    • isEmpty----------------------->判断集合是否为空
    • get------------------>得到集合中与Key值相对应的Value
    Map<String,Integer> map = new HashMap<>();
            System.out.println(map.put("lolp", 123));
            map.put("aszx",456);
            map.put("erdf",789);
            System.out.println(map.put("lolp", 900));
            map.put("zxc",123);
            map.put("plm",123);
            //map.clear();
            //map.remove("zxc");
            System.out.println(map.containsKey("plm"));
            System.out.println(map.containsValue(456));
            System.out.println(map.size());
            System.out.println(map);
            System.out.println("===============");
    
            Map<String,Integer> map1 = new HashMap<>();
            map1.put("lolp", 123);
            map1.put("aszx",456);
            map1.put("erdf",789);
            map1.put("lolp", 900);
            map1.put("zxc",123);
            map1.put("plm",123);
            System.out.println(map == map1);
            System.out.println(map.equals(map1));//对equals进行重写,判断集合中的值是否一致
            System.out.println(map.isEmpty());//判断集合是否为空
    
            System.out.println(map.get("erdf"));
    

Map接口遍历

增强for循环
  • 通过Set进行循环

    Set<String> set = map.keySet();
            for (String s : set) {
                System.out.println(s);
            }
    
  • 通过values进行循环

            System.out.println("===============");
            //方式一
            for (Integer value : map.values()) {
                System.out.println(value);
            }
            System.out.println("===============");
            //方式二
            Collection<Integer> values = map.values();
            for (Integer integer : values) {
                System.out.println(integer);
            }
    
  • 通过get(Object key) keySet()进行循环

    Set<String> set1 = map.keySet();
            for (String s : set1) {
                System.out.println(map.get(s));
            }
    
  • 通过entrySet进行循环

    Set<Map.Entry<String,Integer>> entries = map.entrySet();
            for (Map.Entry<String,Integer> entry : entries) {
                System.out.println(entry.getKey() + "-----" + entry.getValue());
            }
    

HashMap实现类

特点
  • 无序且唯一
  • 按照key排序,底层是哈希表结构
HashMapLinkedHashMapHashtable的区别
HashMap
  • HashMap出现在JDK1.2中
  • HashMap的效率高,但是线程不安全
  • key可以存null值,并且也遵循唯一的特点
  • 自定义数据类型需要对equalshashCode进行重写
Hashtable
  • Hashtable出现在JDK1.0中
  • Hashtable的效率低,但是线程安全
  • Hashtablekey不能存null
LinkedHashMap
  • 唯一且有序,并按照输入顺序输出
TreeMap的使用
特点
  • 唯一且有序,按照输入顺序输出

  • String类型

    Map<String,Integer> map = new TreeMap<>();
            map.put("wsx",123);
            map.put("qaz",234);
            map.put("edc",345);
            map.put("rfv",456);
            map.put("wsx",567);
            map.put("tgb",678);
            System.out.println(map.size());
            System.out.println(map);
    
  • 自定义引用数据类型

    • 内部比较器

      • 自定义类

         private int age;
            private String name;
            private double height;
        
            public Pretty() {
            }
        
            public Pretty(int age, String name, double height) {
                this.age = age;
                this.name = name;
                this.height = height;
            }
        
            public int getAge() {
                return age;
            }
        
            public void setAge(int age) {
                this.age = age;
            }
        
            public String getName() {
                return name;
            }
        
            public void setName(String name) {
                this.name = name;
            }
        
            public double getHeight() {
                return height;
            }
        
            public void setHeight(double height) {
                this.height = height;
            }
        
            @Override
            public String toString() {
                return "Pretty{" +
                        "age=" + age +
                        ", name='" + name + '\'' +
                        ", height=" + height +
                        '}';
            }
        
            @Override
            public int compareTo(Pretty o) {
                //return this.getAge() - o.getAge();
                //return this.getName().compareTo(o.getName());
                return ((Double) (this.getHeight())).compareTo((Double) (o.getHeight()));
            }
        
      • 测试类

        Map<Pretty,Integer> map = new TreeMap<>();
                map.put(new Pretty(18,"qwe",165.7),123);
                map.put(new Pretty(19,"rty",175.5),345);
                map.put(new Pretty(20,"asd",155.6),123);
                map.put(new Pretty(17,"zxc",166.0),123);
                map.put(new Pretty(21,"qwe",169.5),123);
                map.put(new Pretty(18,"fgh",172.3),123);
                System.out.println(map.size());
                System.out.println(map);
        
    • 外部比较器

      • 自定义类

        private int age;
            private String name;
            private double height;
        
            public Asked() {
            }
        
            public Asked(int age, String name, double height) {
                this.age = age;
                this.name = name;
                this.height = height;
            }
        
            public int getAge() {
                return age;
            }
        
            public void setAge(int age) {
                this.age = age;
            }
        
            public String getName() {
                return name;
            }
        
            public void setName(String name) {
                this.name = name;
            }
        
            public double getHeight() {
                return height;
            }
        
            public void setHeight(double height) {
                this.height = height;
            }
        
            @Override
            public String toString() {
                return "Asked{" +
                        "age=" + age +
                        ", name='" + name + '\'' +
                        ", height=" + height +
                        '}';
            }
        
      • 测试类

        Map<Asked,Integer> map = new TreeMap<>(new Comparator<Asked>() {
                    @Override
                    public int compare(Asked o1, Asked o2) {
                        //return o1.getAge() - o2.getAge();
                        //return o1.getName().compareTo(o2.getName());
                        return ((Double) (o1.getHeight())).compareTo((Double) (o2.getHeight()));
                    }
                });
                map.put(new Asked(18,"qwe",165.7),123);
                map.put(new Asked(19,"rty",175.5),345);
                map.put(new Asked(20,"asd",155.6),123);
                map.put(new Asked(17,"zxc",166.0),123);
                map.put(new Asked(21,"qwe",169.5),123);
                map.put(new Asked(18,"fgh",172.3),123);
                System.out.println(map.size());
                System.out.println(map);
        
HashMap面试题
  • 为什么装填因子、负载因子和加载因子的值是0.75
    • 设为1,空间利用率得到了很大的满足,很容易碰撞,碰撞会产生链表,然后导致查询效率低
    • 设为0.5,碰撞的概率低,扩容、产生链表的概率低,查询效率高,但是空间利用率太低了
  • 为什么主数组的长度必须为2^n
    • 为了防止哈希冲突和位置冲突
    • h & (lenght - 1)等效h % lenght的操作,但是前提是要lenght必须是2的整数倍
Collections工具类
  • 构造器私有化,不支持创建对象
常用类
  • add()、addll()、sort()、binarySearch()、copy()、fill()

    • add(); --------> 添加元素到集合中
    • addll(); -------> 添加大量的集合元素
    • sort(); -------> 将集合升序排列
    • binarySearch(); -------> 对集合内的某个元素进行二分查找
    • copy(); -------> 将一个集合内的元素替换为另一个集合的元素
    • fill(); -------> 将集合内的元素全部填充为一个元素
    ArrayList<String> arrayList = new ArrayList<>();
            arrayList.add("qq");
            arrayList.add("aa");
            arrayList.add("zz");
            Collections.addAll(arrayList,"xx","cc","vv");
            Collections.addAll(arrayList,new String[]{"bb","nn","mm"});
            System.out.println(arrayList);
    
            Collections.sort(arrayList);//升序排列
            System.out.println(arrayList);
            System.out.println(Collections.binarySearch(arrayList,"vv"));
    
            ArrayList<String> arrayList1 = new ArrayList<>();
            Collections.addAll(arrayList1,"ee","dd","ff");
            Collections.copy(arrayList,arrayList1);//a1的元素替换给a
            System.out.println(arrayList);
            System.out.println(arrayList1);
    
            Collections.fill(arrayList1,"ll");
            System.out.println(arrayList1);
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不想写代码的懒大王

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值