Java教程

JAVA集合之map

本文主要是介绍JAVA集合之map,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

目录

简介

HashMap

TreeMap

 Hashtable

JAVA并发容器ConcurrentSkipListMap和ConcurrentHashMap实现线程安全


简介

|————Map:双列数据,存储key-value对的数据,
         |————HashMap:作为Map主要实现类,线程不安全的,效率高,存储null的key和value
                  |————LinkedHashMap:保证遍历元素时,按照添加顺序实现遍历
                          原理:在原有HashMap底层结构基础上,添加一堆指针,频繁遍历操作,执行效率高于HashMap
         |————TreeMap:保证按照添加的key-value进行排序,实现排序遍历,此时考虑key的自然排序和定制排序,底层使用的是红黑树
         |————Hashtable:作为古老的实现类,线程安全的,效率低,不能存储null的key和value
                  |————Properties:常用来处理配置文件,key和value都是String类型

Map结构
   Map中的key:无序的、不可重复的,使用Set存储所有的key --->key所在的类要重写equals()和hashCode()(以HashMap为例
   Map中的value:无序的、可重复的,使用Collection存储所有的value   value所在类重写equals()
   一个键值对:key-value构成一个Entry对象
   Map中的entry:无序的,不可重复的,使用Set存储所有的entry

将Map中的数据,通过迭代器输出:Map —> Set  —> Iterator

  • 调用Map.entrySet()方法,将Map集合转换为Set集合,其中Set中的泛型为:Map.Entry<K,V>;
  • 调用Set.iterator()方法,将Set集合转换为Iterator迭代器,泛型依然是:Map.Entry<K,V>;
  • 调用Iterator的hasNext()、next()方法,循环取出Map.Entry<K,V>接口对象;
  • 调用Map.Entry接口的getKey()获取key、getValue()获取value。

=========================================================================

HashMap

HashMap的底层:jdk7及以前    数组加链表  
                              jdk8及以后    数组加链表加红黑树

 

=========================================================================

TreeMap

因TreeMap中添加key-value,要求key必须由同一个类创建的对象
因为要按照key进行排序,自然排序、定制排序

因TreeMap中添加key-value,要求key必须由同一个类创建的对象
因为要按照key进行排序,自然排序、定制排序

  @Test
    public void treeMapTest1() {
        TreeMap map = new TreeMap((o1, o2) -> {
            if (o1 instanceof StudentSet && o2 instanceof StudentSet) {
                StudentSet s1 = (StudentSet) o1;
                StudentSet s2 = (StudentSet) o2;
                return Integer.compare(s1.getAge(), s2.getAge());
            } else {
                throw new RuntimeException("类型错误");
            }
        });

        StudentSet st1 = new StudentSet(13, "lucky");
        StudentSet st2 = new StudentSet(10, "jack");
        StudentSet st3 = new StudentSet(23, "Tom");
        map.put(st1, 89);
        map.put(st2, 78);
        map.put(st3, 100);
//        方式一
        Set entrySet = map.entrySet();
        Iterator a = entrySet.iterator();
        while (a.hasNext()) {
            Object obj = a.next();
            Map.Entry entry = (Map.Entry) obj;
            System.out.println(entry.getKey() + "---->" + entry.getValue());
        }

//        方式二
        Set keySet = map.keySet();
        Iterator iterator = keySet.iterator();
        while (iterator.hasNext()) {
            Object key = iterator.next();
            Object value = map.get(key);
            System.out.println(key + "----" + value);
        }

    }

 =========================================================================

 Hashtable

HashTable中hash数组默认大小是11,增加的方式是 old*2+1

HashTable是将整个哈希表锁住,采用sychronized同步方法,所以性能很低;

  @Test
    public void propertiesTest()  {
        FileInputStream fileInputStream=null;
        try {
            Properties properties = new Properties();
            fileInputStream= new FileInputStream("jabc.properties");
            //加载流对应的文件
            properties.load(fileInputStream);

            String name=properties.getProperty("name");
            String password=properties.getProperty("password");
            System.out.println(name+"---"+password);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (fileInputStream != null) {
                try {
                    fileInputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

JAVA并发容器ConcurrentSkipListMap和ConcurrentHashMap实现线程安全

这篇关于JAVA集合之map的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!