• 集合类——Map集合、Properties属性文件操作


    1、Map集合

    Collection集合的特点是每次进行单个对象的保存,若要对一对对象来进行保存就只能用Map集合来保存。即Map集合中一次可以保存两个对象,且这两个对象的关系是key = value结构。这种结构最大的好处就是可以利用已知的key值找到对应的value值。

    Map接口的定义:public interface Map<K,V>

    常用方法:

    Map中追加元素: V put(K key, V value)

    根据指定的key值取得对应的value若没有返回nullV get(Object key)

    取得所有key信息,key不能重复:Set<K> keySet()

    取得所有value信息,value可重复:Collection<V> values()

    Map集合变为Set集合:Set<Map.Entry<K, V>> entrySet()

    MapCollection一样本身就是一个接口,需要使用子类来进行实例化,Map常用的子类有:HashMapHashTableTreeMapConcurrentHashMap

    (1)HashMap

    HashMapMap中的常用子类。

    HashMapKey值不允许重复,若重复则会把对应的value值进行更新;Keyvalue都允许为空,key为空有且只能有一个。

    基本操作:

    1. /*
    2. * HashMap
    3. * */
    4. public class Test{
    5. public static void main(String[] args) {
    6. Map<Integer,String> map = new HashMap<>();
    7. map.put(1, "num1");
    8. map.put(2, "num2");
    9. map.put(3, "num3");
    10. System.out.println("无重复值时:"+map);
    11. //重复的key值
    12. map.put(1, "num4");
    13. System.out.println("有重复值时:"+map);
    14. //重复的为null的key值
    15. map.put(null, null);
    16. map.put(null, "haha");
    17. System.out.println("有重复key = null"+map);
    18. //重复的为null的value值
    19. map.put(5, null);
    20. System.out.println("有重复value = null" +map);
    21. //获得key为2对应的value值
    22. System.out.println(map.get(2));
    23. //取得所有的key值
    24. System.out.println(map.keySet());
    25. //取得所有的value值
    26. System.out.println(map.values());
    27. }
    28. }

                                              

    HashMap的原理:在数据量小的时候(jdk1.8后阈值为8)按照HashMap是按照链式存储,当数据量变大时为了快速查找,会将链表变为红黑树(均衡二叉树)来进行数据保存,用hash码作为数据定位。

    (2)HashTable(最早实现二次偶对象存储)

    HashTalekeyvalue均不允许为null。当两者任意一个为null时,会报出如下异常:java.lang.NullPointerException

    1. /*
    2. * HashTable
    3. * */
    4. public class Test{
    5. public static void main(String[] args) {
    6. Map<Integer, String> map = new Hashtable<>();
    7. map.put(1, "key");
    8. map.put(2, "value");
    9. //重复的key值
    10. map.put(1, "value");
    11. //key值为null
    12. //map.put(null,"haha");
    13. //value值为null
    14. //map.put(3, null);
    15. System.out.println(map);
    16. }
    17. }

                               

    key值或者value值为空时:

             

    HashMapHashTable的区别:

    1.版本上:HashTablejdk1.0推出的;而HashMapjdk1.2推出的。

    2.性能上:HashTable属于同步处理,性能较低;而HashMap属于异步处理,性能较高

    3.安全性方面:HashTable是线程安全的;而HashMap是非线程安全的。

    4.null操作上:在HashTablekeyvalue都不允许为null,否则有NullPointException异常抛出;而HashMap允许keyvaluenull,且可keynull有且只有一个。

    (3)ConcurrentHashMap

    ConcurrrentHashMap具有HashTable的线程安全性同时也具有HashMap的高性能。且在ConcurrentHashMap中和HashTable一样都不想允许keyvaluenull

    1. /*
    2. * ConcurrentHashMap
    3. * */
    4. public class Test{
    5. public static void main(String[] args) {
    6. Map<Integer, String> map = new ConcurrentHashMap<>();
    7. map.put(1, "key");
    8. //重复key值
    9. map.put(1, "value");
    10. map.put(2, "value");
    11. System.out.println(map);
    12. }
    13. }

                        

    其使用也和之前的HashTableHashMap类似,因为他们都是Map的子类。

    其高性能主要表现在:

    a. 数据更新时,只能对特定的区域进行上锁,而其他区域不受影响。

    b. 在锁的区域使用读写锁,读异步而写同步,即便在同一个桶中,数据的读取仍然不受影响。

    (4)TreeMap

    TreeMapMap集合中唯一一个可用于排序的集合,是按照key值进行排序的。

    1. /*
    2. * TreeMap
    3. * */
    4. public class Test{
    5. public static void main(String[] args) {
    6. Map<Integer, String> map = new TreeMap<>();
    7. map.put(4, "key");
    8. //重复key值
    9. map.put(3, "value");
    10. map.put(2, "value");
    11. System.out.println(map);
    12. }
    13. }

                           

    实则排序的类必须实现Comparable接口,即实现CompareTo()方法,所以在上例中Integer类一定实现了Comparable接口。

    (5)Map使用Iterator进行集合输出

    MapCollection的接口不同,在Collection接口中提供有iterator()方法,使我们可以很方便的取到Iterator对象来进行输出,而在Map集合中并没有提供该方法,首先我们观察CollectionMap接口数据保存的区别:

                                

    Map中提供有一个重要的方法将Map集合转换成Set集合:

    Set<Map.Entry<K, V>> entrySet()

    Map要想调用Iterator进行输出,走的是一个间接使用的模式。

       

    1. /*
    2. * Map的Iterator输出
    3. * */
    4. public class Test{
    5. public static void main(String[] args) {
    6. Map<Integer, String> map = new HashMap<>();
    7. map.put(4, "key");
    8. //重复key值
    9. map.put(3, "value");
    10. map.put(2, "value");
    11. //将Map集合转换成Set集合
    12. Set<Map.Entry<Integer, String>> set = map.entrySet();
    13. //取得Iterator对象
    14. Iterator<Map.Entry<Integer,String>> iterator = set.iterator();
    15. while(iterator.hasNext()) {
    16. //取得每一个Map.Entry的对象
    17. Map.Entry<Integer, String> entry =iterator.next();
    18. //取得key和value
    19. System.out.println("key = "+entry.getKey()+",value = "+entry.getValue());
    20. }
    21. }
    22. }

    (6)关于Mapkey的说明

    在之前我们使用Map集合时都笼统的使用系统类作为keyIntregerString),实则我们也可以使用自定义类来作为Mapkey,此时一定要覆写Object类的hashCode()equals()两个方法。

    2、Properties属性文件操作

    Java中有一种属性文件(资源文件)的定义:.*properties文件,在这种文件中其内容的保存形式是“key = value”通过ResourceBundle类读取的时候只可以读取到内容,而若要对其内容进行编辑则需要Properties类来实现,这个类是专门做属性处理的。

    Properties类定义:

    public class Properties extends Hashtable<Object,Object>

    常用方法:

    设置属性:public synchronized Object setProperty(String key, String value)

    返回指定key对应的value值,若没有找到返回null

    public String getProperty(String key)

    返回指定key对应的value值,若没有对应的value则给个默认值(指的是返回给当前的默认值,并不会写入文件中):

    public String getProperty(String key, String defaultValue)

    向对应输出流保存属性: public void store(OutputStream out, String comments) throws IOException

    将属性从文件中读出:public synchronized void load(InputStream inStream) throws IOException


    1. /*
    2. * Properties属性文件操作
    3. * */
    4. public class Test{
    5. public static void main(String[] args) throws FileNotFoundException, IOException {
    6. Properties properties = new Properties();
    7. //设置属性
    8. properties.setProperty("XN", "xi an");
    9. properties.setProperty("BJ", "bei jing");
    10. File file = new File("C:\Users\lenovo\Desktop\test.properties");
    11. //向对应输出流中保存属性
    12. properties.store(new FileOutputStream(file), "test_properties");
    13. //在文件中读出属性
    14. properties.load(new FileInputStream(file));
    15. //返回key对应的value,不存在返回null
    16. System.out.println(properties.getProperty("XN"));
    17. System.out.println(properties.getProperty("SX"));
    18. //返回key对应的value,若没有找到对应的value则给出默认值,不会写入到资源文件中
    19. System.out.println(properties.getOrDefault("SX", "shanxi"));
    20. }
    21. }

                         

                           

    Properties只能操作String,它可以进行远程属性内容的加载。







  • 相关阅读:
    [MySQL] LIMIT 分页优化
    [Flutter] 因为不讲这个重点, 全网 flutter 实战视频沦为二流课程
    [Kafka] |FAIL|rdkafka#producer-1 : Receive failed: Disconnected
    [Flutter] lib/main.dart:1: Warning: Interpreting this as package URI, 'package:flutter_app/main.dart'.
    [Flutter] 写第一个 Flutter app,part1 要点
    [Go] 开始试探一门新语言的五点思考
    [转]Android进程间通信
    [转]android ANR产生原因和解决办法
    Android开发之旅(二)服务生命周期和广播接收者生命周期
    为什么要有handler机制?handler机制的原理
  • 原文地址:https://www.cnblogs.com/edda/p/12601234.html
Copyright © 2020-2023  润新知