集合框架学习之其他容器

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:工具类


原文地址:https://www.cnblogs.com/dooor/p/5285485.html