Java-集合Map及其子类

1.Map及其子类特点

 

Map: 双列数据 key value对数据 类似于函数
        HashMap :Map主要实现类:线程不安全,效率高,可以存储null的键值对
             LinkedHashMap:保证遍历时,按照存储的顺序。
                         原因:LinkedHashMap在底层中添加了一对指针,分别指向前后                                                        元素对于频繁的遍历操作,效率高于HashMap

        TreeMap:保证按照添加的key—value 排序的顺序存储,并实现排序遍历。
                    底层是红黑树
        Hashtable:古老实现类1.0  线程安全,效率低,不能存储null的键值对
            Properties:常用来处理配置文件,key和value都是String类型;

        HashMap: 底层  数组+链表 jdk7以前
                        数组+链表+红黑树 jdk8 

  Map结构理解: key:是无序的,不可重复的,用set存放key。

        key所在的类要重写equals()和hashCode();方法;以HashMap 为例

        Map中的value是无序的、可重复的,使用colletion存储。value所在的类重写equals();

        一个键值对Entry 一个key —value 构成一个键值对

entry 是无序不重复的,用set存放

默认扩容原来的2倍;

高频面试题: HashMap 底层实现原理? jdk7为例:

HashMap map = new HashMap();

实例化以后,底层创建了长度16的一维数组Entry[]

map.put(key1,value1)

首先调用hashCode();计算哈希值,经过某种算法以后得到在Entry存放的位置,

        如果此位置上为空则添加成功;

        如果不为空,则比较key1和该位置上一个或多个数据的哈希值。

                如果key1的和其它哈希值不相同,添加成功

                 如果key1的和某个数据哈希值相同,则调用key所在类的equals();方法比较。                          如果为false,添加成功

                         如果为true,便是key值相同,vlue1,替换掉对应数据的value(添加操作变成替换)

jdk8和jdk7区别:

        1.new HashMap(); jdk8没有立即创建长度16的数组

         2.jdk8 底层数组是Node[],不是entry[]

        3.jdk8 首次put添加时,创建长度16的数组

        4.jdk7 底层 数组+链表 jdk8 底层: 数组+链表+红黑树 当某一个索引位置上链条位置上元素个数 > 8,且当前数组长度>64时, 此时,该索引位置上所有数据改为使用红黑树存储。 

//常用方法
        Map map = new HashMap();

        //put(),添加
        map.put("aa", "123");
        map.put("bb", "143");
        System.out.println(map);//{aa=123, bb=143}
        //put(),添加已存在key值的元素,为修改
        map.put("aa", "666");
        System.out.println(map);//{aa=666, bb=143}

        //putAll(Map map) 添加
        Map map1 = new HashMap();
        map1.put("cc","523");
        map1.put("gg","562");
        map1.put("hh","952");
        map1.put("jj","842");

        map.putAll(map1);
        System.out.println(map);//{aa=666, bb=143, cc=523, gg=562, hh=952, jj=842}

        //remove();删除对应key值的元素
        map.remove("aa");
        System.out.println(map);

        //get(Object key) 查询对应key值的元素
        Object obj =  map.get("bb");
        System.out.println(obj);//143

        //containsKey() containsValue();判断是否存在对应的key 或者value值
        if(map.containsKey("cc")){
            System.out.println("查询到对应的key值cc");
        }

        // int size(); 返回map中键值对个数
        int count = map.size();

        //isEmpty(); 判断map其中元素是否为空
        boolean b = map.isEmpty();

         //equals(Object obj); 判断两个Map是否相等, 那么这两个Map中元素相同
        Map map2 = new HashMap();
        map2.put("cc","523");
        map2.put("gg","562");
        map2.put("hh","952");
        Map map3 = new HashMap();
        map3.put("cc","523");
        map3.put("gg","562");
        map3.put("hh","952");
        if (map2.equals(map3)) {
            System.out.println("两个Map相等");
        }

遍历 

  Map map = new HashMap();
        map.put("cc","523");
        map.put("gg","562");
        map.put("hh","952");
        map.put("jj","842");
        map.put("aa", "123");
        map.put("bb", "143");

        //keySet(); 返回key值中的set集合
        Set set = map.keySet();
        System.out.println(set);//[cc, gg, hh, jj, aa, bb]

        Iterator iterator  = set.iterator();
        while (iterator.hasNext()) {
            System.out.println(iterator.next());
        }

        Collection coll = map.values();
        System.out.println(coll);//[523, 562, 952, 842, 123, 143]
        for (Object obj :
                coll) {
            System.out.println(obj);
        }

        Set entrySet = map.entrySet();
        System.out.println(entrySet);//[cc=523, gg=562, hh=952, jj=842, aa=123, bb=143]
        Iterator iterator1 = entrySet.iterator();
        while (iterator1.hasNext()) {
            Object object = iterator1.next();
            Map.Entry entry = (Map.Entry) object;
            System.out.println("key :"+entry.getKey()+"--vlaue :"+entry.getValue());
        }
 @Test
    public  void  testTreeMap(){
        //向 TreeMap中添加键值对,必须时同一个类的元素
            //自然排序, 自定义排序
        TreeMap map = new TreeMap(new Comparator() {
            @Override
            public int compare(Object o1, Object o2) {
                if (o1 instanceof Person && o2 instanceof Person) {
                    Person person1 = (Person) o1;
                    Person person2 = (Person) o2;
                    if (person1.getName().compareTo(person2.getName()) != 0) {
                        return person1.getName().compareTo(person2.getName());
                    } else {
                        return Integer.compare(person1.getAge(), person2.getAge());
                    }
                } else {
                    throw new RuntimeException("输入数据有误");
                }
            }
        });
        Person p1 = new Person("Javk", 5);
        Person p2 = new Person("Jim", 6);
        Person p3 = new Person("Tom", 12);
        Person p4 = new Person("Rose", 21);
        Person p5 = new Person("Ceasar", 24);
        map.put(p1,23);
        map.put(p2,34);
        map.put(p3,85);
        map.put(p4,23);
        map.put(p5,98);

        System.out.println(map);

    }

 

 

 Properties处理配置文件

 

 @Test//处理配置文件
    public void  testProperties() throws IOException {
        //Properties 处理配置文件, key -value 都是String类型
        Properties properties = new Properties();
        FileInputStream fis = new FileInputStream("jdbctest.properties");
        properties.load(fis);

        String name = properties.getProperty("name");
        String password = properties.getProperty("password");

        System.out.println("name:"+name+"--password:"+password);


    }

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值