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 } }
4、Map实现类之:IdentityHashMap与EnumMap
4.1 IdentityHashMap
- 键只以地址去重,而不是比较hashcode与equals
- 注意:键是常量池中的字符串
例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提供了三种方法
1、emptyXxx()空的不可变的集合
2、singletonXxx()一个元素不可以变的集合
3、unmodifiableXx()不可变的容器
例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
- Apache:Commons Collecton
6.
7、常用容器总结
6、常用容器总结
1、迭代器
1)java.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 泛型嵌套
六个接口
1、ArrayList:数组查看多于修改
add(元素)、add(索引,元素)、remove(索引)、set(索引,元素)、get(索引) for+get、foreach() Iterator ListIterator
2、LinkedList:链表,修改多于查看,多了些链头与链尾的方法
3、HashSet:重写hashcode+equals
add(元素)、remove(元素)
4、TreeSet:元素可以排序或者提供排序的业务类
5、HashMap:键不能重复必须重写hashcode +equals,值可以重复
put(k,v)、remove(k)、get(k)、containsKsycontainsValue
获取值:values() keySet()+get entrySet()+getValue()
获取键:keySet entrySet()+getKey()
获取键与值:keySet()+get entrySet()+getKey() getvalue()
6、properties:资源配置文件相对路径获取文件
7、Hashtable:建与值不能为null 线程安全
8、stack:栈
9、Collections:工具类