java集合(下)

java集合(下)

AarryList与Vector

  • ArrayList和Vector类都是基于数组实现的List类,所以ArrayList和Vector类封装了一个动态再分配的Object[]数组的长度。当向ArrayList或Vector中添加元素时,它们的capacity会自动增加
  • rrayList和Vector的显著区别是;AarryList是线程不安全的,当多条线程访问同一个ArrayList集合时,如果有超过一条线程修改了ArrayList集合,则程序必须手动保证该集合的同步性。但Vector集合则是线程安全的,无需程序保证该集合的同步性

固定长度的List

  • Arrays工具类里提供了asList(Object…a)方法,该方法可以把一个数组、或指定个数的对象转换成为一个List集合,这个List集合既不是ArrayList实现类的实例,也不是Vector实现类的实例,而是Arrays的内部类ArrayList的实例。
  • Arrays.ArrayList是一个固定长度的List集合,程序只能遍历访问该集合里的元素,不可增加、删除该集合里的元素

Queue接口

  • Queue用于模拟了队列这种数据结构,队列通常是指“先进先出”(FIFO)的容器。队列的头部保存在队列中存放时间最短的元素。新元素插入(offer)到队列的尾部,访问元素(poll)操作会返回队列头部的元素。通常,队列不允许随机访问队列中的元素

LinkedList

  • 它是List接口的实现类——这意味着它是一个List集合,可以根据索引来随机访问集合中的元素。除此之外,LinkedList还实现Deque接口,Deque接口是Queue接口的子接口,它代表一个双端队列
  • LinkedList不仅可以当成双端队列使用,也可以当成"栈"使用,因为该类里还包含了pop(出栈)和push(入栈)两个方法。除此之外,LinkedList实现了List接口,所以还当成List使用

ArrayList与LinkedList

  • LinkedList与ArrayList、Vector的内部实现机制完全不同,ArrayList、Vector内部以数据的形式类保存集合中的元素,因此随机访问集合元素上有较好的性能;而LinkedList内部以链表的形式来保存集合中的元素,因此随机访问集合元素时性能较差,但在插入、删除元素时性能非常出色(只需改变指针所指的地址即可)

类Stack

  • java.util
  • 类Stack
  • java.lang.Object
  • java.util.AbstractCollection
  • java.util.AbstractList java.util.Vector
  • java.util.Stack
  • 所有已实现的接口:
  • Serializable,Cloneable,Iterable
  • Collection,List,RandomAcess

接口Queue

  • java.util
  • 接口Queue
  • 类型参数:
  • E—参数中所保存元素的类型
  • 所有的超级接口:
  • Collection,Iterable
  • 所有已知子接口:
  • BlockingQueue
  • 所有已知实现类:
  • AbstractQueue,ArrayBlockingQueue,ConcurrentLinkedQueue,DelayQueue,LinkedBlockingQueue,LinkedList,PriorityBlockingQueue,PriorityQueue,SynchronousQueue

PriorityQueue

  • PriorityQueue是一个比较标准的队列实现类,之所以说他是比较标准的队列实现,而不是绝对标准的队列实现是因为:
    priorityQueue保存队列元素的顺序并不是按加入队列的顺序,而是按队列元素的大小进行重新排序。因此当调用peek方法或者poll方法来取出队列中的元素时,并不是取出最先进入队列的元素是,而是取出队列中最小的元素

理解Map

  • Map里key集和Set集合里元素的存储形式也很像,Map子类和Set子类在名字也惊人地相似:如Set接口下有HashSet、LinkedHashSet、SortedMap(接口)、TreeMap、EnumMap等实现类和子接口中key集存储形式和对应Set集合中元素的存储形式完全相同。
  • 如果把Map所有value放在一起来看,它们又非常类似于一个List:元素与元素之间可以重复,每个元素可以根据索引来查找,只是Map中的索引不再使用整数值,而是以另一个对象来最为索引。如果需要从List集合中取出元素,需要提供该元素的数字索引。

HashMap和Hashtable

  • HashMap和Hashtable都是Map接口的典型实现类,它们的区别区别如下:
  • Hashtable是一个线程安全的Map的实现,但HashMap是线程不安全的实现,所以HashMap比Hashtable的性能高一点;但如果有多条线程访问同一个Map对象时,使用Hashtable实现会更好
  • Hashtable不允许使用null作为key和value,如果试图把null值放进Hashtable中,将会引发NullPointerException异常;但HashMap可以使用null作为key或value

LinkedHashMap

  • LinkedHashMap也使用双向链表来维护key-value对的次序,该链表定义了迭代顺序,该迭代顺序与key-value对的插入顺序保持一直
  • LinkedHashMap可以避免需要要对HashMap、Hashtable里的key-value对进行排序(只要插入key-value对保持顺序即可)。同时又可避免使用TreeMap所增加的成本

Map接口

  • Map用于保存具有映射关系的数据,因此Map集合里保存着两组值,一组值用于保存Map里的key,另外一组值用于保存Map里的value,key和value都可以是任何引用类型的数据。Map的KEY不允许重复,即同一个Map对象的任何两个key通过equals方法比较总是返回false
  • key和value之间存在单向一对一关系,即通过指定的key,总能找到唯一的、确定的value。从Map中取出数据时,只要给出指定的key,就可以取出对应的value

Properties类

  • Properties类是Hashtable类的子类,正如它的名字所暗示的,该对象在处理属性文件特别方便(Windows操作平台上的ini文件就是一种属性文件)。Properties类可以把Map对象和属性文件关联起来,从而可以把Map对象中的key-value对写入到属性文件,也可以把属性文件中的属性名=属性值加载到Map对象中。由于属性文件里的属性名、属性值只能是字符串类型,所以Properties里的key、value都是字符串类型,该类提供了如下方法来修改Properties里的key、value值
  • String getProperty(String key):获取Properties中指定属性名对应的属性值,类似于Map的get(Object key)方法
  • String getProperty(String key,String defaultValue):该方法与前一个方法基本相似。该方法多一个功能,如果Properties中不存在指定key时,该方法返回默认值。
  • Object setProperty(String key,String value):设置属性值,类似Hashtable的put方法

TreeMap

  • Map接口也派生了一个SortedMap子接口,SortedMap也有一个TreeMap实现类。
  • 与TreeSet类似的是,TreeMap也是基于红黑树对TreeMap中所有key进行排序,从而保证TreeMap也有两种排序方式:
  • 自然排序:TreeMap的所有key必须实现Comparable接口,而且所有key应该是同一个类的对象,否则将会抛出ClassCastException异常
  • 定制排序:创建TreeMap时,传入一个Comparator对象,该对象负责对TreeMap中所有key进行排序。采用定制排序时不要求Map的key实现Comparable接口

WeakHashMap

  • WeakHashMap与HashMap的用法基本相似。但与HashMap的区别在于,HashMap的key保留对实际对象的强引用,这意味着只要该HashMap对象不被销毁,该HashMap对象所有key所引用的对象不会被垃圾回收,HashMap也不会自动删除这些key所对应得key-value对象;
  • 但WeakHashMap得key只保留对实际对象得弱引用,这意味着如果该WeakHashMap对象所有key所引用得对象没有被其他强引用变量所引用,则这些key所引用得对象可能被垃圾回收,WeakHashMap也可能自动删除这些key所对应得key-value对象

IdentityHashMap

  • IdentityHashMap实现类的实现机制与HashMap基本相似,但它在处理两个KEY相等时比较独特:在IdentityHashMap中,当且仅当两个Key严格相等(key=key2)时,IdentityHashMap才认为两个键相等
  • 对于普通的HashMap而言,只要key1和key2通过equals比较范围true,且它们的hashCode值相等即可

EnumMap

  • EnumMap是一个与枚举类一起使用的Map实现EnumMap中所有的key都必须时单个枚举类的枚举值。创建EnumMap时必须显式或隐式指定它所对应的枚举类
  • EnumMap在内部以数组形式保存,所以这种实现形式非常紧凑、高效
  • EnumMap根据key的自然顺序(及枚举值在枚举类中的定义顺序)来维护key-value对的次序。当程序通过keySet()、entrySet()、values()等方法来遍历EnumMap时即可看到这种顺序
  • EnumMap不允许使用null作为key值,但允许使用null作为value。如果试图使用null作为key将抛出NullPointerException异常。如果仅仅只是查询是否包含值为null的key、或者仅仅只是使用删除值为null的key,都不会抛出异常

HashSet和HashMap的性能

  • 因为HashSet和HashMap、Hashtable都是用hash算法来决定其元素(对HashMap则是key)的存储,因此HashSet、HashMap的hash表包含如下属性:
  • 容量(capacity):hash表中桶的数量
  • 初始化容量(intital capacity):创建hash表时桶的数量。HashMap和HashSet都允许在构造器中指定初始化容量
  • 尺寸(size):当前散列表中记录的数量
  • 负载因子(load factor):负载因子等于“size/capacity”。负载因子为0,表示空的hash表,0.5表示半满的散列表,以此类推。轻负载的散列表具有冲突少,适宜插入与查询的特点(但是使用Iterator迭代元素时速度较慢)

Collections

  • Java提供了一个操作Set、List和Map等集合的工具类:Collections该工具类里提供了大量方法对集合的元素进行排序、查询和修改等操作
  • Collections还提供了将集合对象设置不可变,对集合对象实现同步控制等方法

JDK 9新增的不可变的集合

  • 程序调用的Set、List、Map的of()方法即可创建包含N个元素的不可变集合,这样一行代码就可创建包含N个元素的集合
  • 不可变意味着程序不能向集合添加元素,也不能从集合中删除元素。
  • 创建不可变的Map集合有两个方法:使用of()方法只要依次传入多组key、value对即可;另外还可以使用ofEntries()方法,该方法可接受多个Entry对象

Enumeration接口

  • Enumeration接口时Iterator迭代器的“古老版本”,从JDK1.0开始,Enumeration接口就已经存在了(Iterator从JDK 1.2才出现)Enumeration接口被Iterator小,只有两个名字很长的方法:
  • boolean hasMoreElements():如果此迭代器还有剩下的元素则返回true
  • Object nextElement():如果该迭代器的下一个元素,如果还有的话(否则抛出异常)

算法

  • Collections类中的静态方法
  • 用于排序、搜索、混排和数据操纵
  • 方法的第一个参数是要执行操作的集合
  • 重要异常
  • ClassCastException
  • UnsupportedOperationException
class AlgorithmExample
{
    public class void main(String[] args)
    {
        LinkedList link=new LinkedList();
        link.add(new Integer(10));
        link.add(new Integer(35));
        link.add(new Integer(23));
        link.add(new Integer(54));
        link.add(new Integer(36));
        Comparator cmp=Collections.reverseOrder();
        Collections.sort(link,cmp);
        Iterator it=link.iterator();
        System.out.println("逆序排序的列表为:");
        while (it.hasNext())
        {
            System.out.println(it.next());
        }
        System.out.println("给定列表中的最大值为:"+Collection.max(link));
        System.out.println("给定列表中的最小值为:"+Collections.min(link));
    }
}


集合框架的有点

  • 提供一组可用的集合接口
  • 提供有效的数据结构和方法
  • 可以方便地扩展或改写集合
  • 接口的实现都是可以交换的
  • 使设计新的API的工作降到最少
  • 接口和算法的可重用性
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值