• 集合框架学习之其他容器


    1、队列Queue 与 Deque

    1.1 Queue:单向

    • 队列通常FIFO(先进先出)
    • 优先级队列和堆栈LIFO(后进先出)

    1.2  Deque:双向 两端访问

    全面double-ended queue,是一种具有队列和栈的性质的数据结构。双端队列中的元素可以从两端弹出,其限定插入和删除操作在表的两端进行。

          - 此接口扩展了Queue接口,在将双端队列用作队列时,将得到FIFO(先进先出)行为

    • 可用作LIFO(后进先出)堆栈

    2、Hashtable 与 Peoperties

    2.1 Hashtable

    Map实现类,与HashMap操作相同

    区别

    HashMap

    Hashtable

    线程安全

    线程不安全

    线程安全

    null

    键最多一个null,

    值可以为多个null

    键与值都不能为null

    父类

    AbstractMap

    Dictionary

    2.2 Properties 键与值只能为字符串

    Hashtable子类。  

    作用:读写资源配置文件,要求键与值只能为字符串

    常用方法

    • getProperty(String key)

              用指定的键在此属性列表中搜索属性。

    • setProperty(String key, String value)

              调用 Hashtable 的方法 put。

    • store(OutputStream out, String comments)

              以适合使用 load(InputStream) 方法加载到 Properties 表中的格式,将此 Properties表中的属性列表(键和元素对)写入输出流。

    • storeToXML(OutputStream os, String comment)

              发出一个表示此表中包含的所有属性的 XML 文档。

    • load(Reader reader)

              按简单的面向行的格式从输入字符流中读取属性列表(键和元素对)。

    • loadFromXML(InputStream in)

              将指定输入流中由 XML 文档所表示的所有属性加载到此属性表中。

    2.2.1 后缀:

    .properties

    .xml

    2.2.2 相对路径与绝对路径

    1、绝对路径: 盘符:/

    2、相对路径: 当前项目、工程

    2.2.3 类路径加载资源文件

    类所在的根路径

    1、类.class.getResourceAsStream("/")

    2、Thread.currentThread().getContextClassLoader()

    .getResourceAsStream("");

      

    3、引用类型(强、软、弱、虚)与WeakHashMap

     引用分类

    • 强引用:StrongReference:引用指向对象,gc(Garbage collection)运行时不回收,比如说字符串常量池
    • 软引用:SoftTrference gc运行时可能回收(JVM内存不够) 可作于缓存
    • 弱引用:WeakReference gc运行时立即回收
    • 虚引用:PhantomReference 类似于无引用,主要跟踪对象被回收的状态,不能单独使用,必须与引用队列(ReferenceQueue)联合使用

    目的:

    避免对象长期驻留在内存中,解决垃圾回收机制回收时间问题

    例1: 

     1 /**
     2  * 强-弱 引用
     3  * @author qjc
     4  *
     5  * 2016-3-12
     6  */
     7 public class RefDemo {
     8     /**
     9      * 强引用
    10      */
    11     public static void testStrong(){
    12         //字符串常量池 共享(不能回收)
    13         String str = "abcd";
    14         //弱引用管理对象
    15         WeakReference<String> wr = new WeakReference<String>(str);
    16         System.out.println("gc运行前:"+wr.get());
    17         //断开引用
    18         str = null;
    19         //通知回收
    20         System.gc();
    21         System.runFinalization();
    22         System.out.println("gc运行后:"+wr.get());
    23     }
    24     public static void testStrong2(){
    25         //字符串常量池 
    26         String str = new String("abcd");
    27         //弱引用管理对象
    28         WeakReference<String> wr = new WeakReference<String>(str);
    29         System.out.println("gc运行前:"+wr.get());
    30         //断开引用
    31         str = null;
    32         //通知回收
    33         System.gc();
    34         System.runFinalization();
    35         //对象被回收
    36         System.out.println("gc运行后:"+wr.get());
    37     }
    38     public static void main(String[] args) {
    39         testStrong();
    40         /*
    41          *输出结果: 
    42             gc运行前:abcd
    43             gc运行后:abcd
    44         */
    45         testStrong2();
    46         /*
    47          *输出结果: 
    48             gc运行前:abcd
    49             gc运行后:null
    50         */
    51     }
    52 }

    3.1 Map实现类之:WeakHashMap

    键为弱引用,回收键后自动删除key-value对象

    2

    /**
     * WeakHashMap 键为弱类型,gc运行立即回收
     * @author qjc
     *
     * 2016-3-12
     */
    public class WeakHashMapDemo {
        public static void main(String[] args) {
            WeakHashMap<String, String> map = new WeakHashMap<>();
            //常量池对象,不会回收
            map.put("a", "b");
            map.put("c", "d");
            //gc运行 已被回收
            map.put(new String("e"), "f");
            map.put(new String("g"), "h");
            //通知回收
            System.gc();
            System.runFinalization();
            System.out.println(map.size());
            //输出结果: 2
        }
    }

    4Map实现类之:IdentityHashMapEnumMap

    4.1  IdentityHashMap

    • 键只以地址去重,而不是比较hashcodeequals
    • 注意:键是常量池中的字符串

    3

    /**
     * IdentityHashMpa 键以地址去重
     * @author qjc
     *
     * 2016-3-12
     */
    public class IdentityHashMapDemo {
        @Test
        public void test(){
            IdentityHashMap<String, String> map = new IdentityHashMap<>();
            //常量池中的"a"
            map.put("a", "a1");
            map.put("a", "a2");
            System.out.println(map.size()); //打印: 1
            map.put(new String("a"), "a1");
            map.put(new String("a"), "a1");
            System.err.println(map.size()); //打印:3
        }
    }

    4.2 Map实现类之:EnumMap

    • 键必须为枚举的值
    • 构造器:public EnumMap(指定枚举class对象)

    4

    /**
     * EnumMap 要求键为枚举
     * @author qjc
     *
     * 2016-3-12
     */
    public class EnumMaoDemo {
        @Test
        public void test(){
            EnumMap<Season, String> map = new EnumMap<>(Season.class);
            map.put(Season.SPRING, "春困");
            map.put(Season.SUMMER, "夏无力");
            map.put(Season.AUTUMN, "秋乏");
            map.put(Season.WINTER, "冬眠");
            System.out.println(map.size());
        }
    }
    enum Season{
        SPRING,SUMMER,AUTUMN,WINTER
    }

    5、同步控制与只读设置

    5.1 同步控制:多线程并发访问集合的线程安全

    • 常用容器 ArrayList HashSet HashMap 等都是线程不安全的
    • Collections提供了synchronizedXxx()方法,将指定容器包装秤同步

    synchronizedList(List<T> list)

    synchronizedSet(Set<T> s)

    synchronizedMap(Map<K,V> m)

     

    5.2不可变设置:“只读”访问,Collections提供了三种方法

    1emptyXxx()空的不可变的集合

    2singletonXxx()一个元素不可以变的集合

    3unmodifiableXx()不可变的容器

    5

    /**
     * 只读设置
     * @author qjc
     *
     * 2016-3-12
     */
    public class Demo {
        @Test
        public void testUnmodifiableMap(){
            Map<String, String> map = new HashMap<>();
            map.put("a", "aaa");
            map.put("b", "bbb");
            //只读控制
            Map<String, String> map2 = Collections.unmodifiableMap(map);
            map2.put("c", "ccc");//报错:java.lang.UnsupportedOperationException
            System.out.println(map.size());
        }
        @Test
        public void testSingletonList(){
            //一个元素的容器测试
            List<String> list = Collections.singletonList(new String());
            list.add("a");
            list.add("b"); ////报错:java.lang.UnsupportedOperationException
            System.out.println(list.size());
        }
        public Set<String> oper(Set<String> set){
            //外部获取避免NullPointerException
            if(null==set){
                return Collections.EMPTY_SET;
            }
            return set;
        }
    }

    6、开源工具包:

    • Guava : Google Collection
    • ApacheCommons Collecton

    6.

    7、常用容器总结

     

    6、常用容器总结

    1、迭代器

    1java.util.iterator + hasNext() next()remove()

    2) foreach:java.lang.Iterable+iterator()

    2、比较器

    1)实体类可以排序 java.lang.Comparable + compareTo

    2) 排序比较器(解耦、多种排序规则)java.util.Comparator+ compare

    3、泛型<> 泛型类、泛型方法、泛型接口、泛型擦除、通配符? extends super 泛型嵌套

    六个接口

    1ArrayList:数组查看多于修改

    add(元素)add(索引,元素)remove(索引)set(索引,元素)get(索引) for+getforeach() Iterator ListIterator

    2LinkedList:链表,修改多于查看,多了些链头与链尾的方法

    3HashSet:重写hashcode+equals

    add(元素)、remove(元素)

    4TreeSet:元素可以排序或者提供排序的业务类

    5HashMap:键不能重复必须重写hashcode +equals,值可以重复

    put(k,v)remove(k)get(k)containsKsycontainsValue

    获取值:values() keySet()+get entrySet()+getValue()

    获取键:keySet entrySet()+getKey()

    获取键与值:keySet()+get entrySet()+getKey() getvalue()

    6properties:资源配置文件相对路径获取文件

    7Hashtable:建与值不能为null 线程安全

    8stack:

    9Collections:工具类


  • 相关阅读:
    Netty3实现服务端和客户端
    Nio实现服务端
    python学习笔记8-邮件模块
    python学习笔记8-异常处理
    python学习笔记8--面向对象编程
    python番外篇--sql注入
    python学习笔记7-网络编程
    python学习笔记7-excel操作
    python学习笔记6--双色球需求实现
    python学习笔记6--操作redis
  • 原文地址:https://www.cnblogs.com/dooor/p/5285485.html
Copyright © 2020-2023  润新知