java之集合
java集合是一个特别有用的工具类,可以存储数量不等的对象,并可以实现常用的数据结构,如栈, 队列等, 除此还可以保存具有映射关系的关联数组。集合类也被称为容器类,其存在于java.until 包下。
java集合大致可以可以分为Set, list , Queue, Map ,
list代表有序,重复的集合, Set代表无序不可重复的集合。Map :代表具有映射关系的集合, Queue:代表一种队列集合实现
java集合类主要由两个接口派生而出,Collection 与 Map
如果访问list集合的元素可以根据元素的索引来访问,访问map中的元素则可以通过key 来访问value ,如果访问Set集合的元素则只能根据元素本身来访问。
Collection接口
Collection接口是List ,Map, Set 接口的父接口。
Iterator :iterator接口也是java集合框架的成员,其主要用于遍历(迭代访问)Colleaction集合中的元素。
Set集合:
Set集合通常不能记住元素的顺序,Set集合不允许包含相同的元素,如果试图把相同的元素添加到set()集合中,则会添加失败,add 会返回false。
HashSet 类:
hashSet:
1:不能保证元素的排列顺序,顺序可能与添加顺序不同,顺序也可能发生变化
2:HashSet不是同步的,如果多个线程同时访问一个HashSet,假如有两个或者多个以上的线程同时修改了HashSet集合时,则必须通过代码保证其同步。
3:集合元素可以是null;
当向hashSe添加一个元素的时候,hashSet会调用HasCode()方法来得到该对象的hasCode()值,然后根据该hasCode ()值决定该对象的在HashSet ()中的位置,如果有两个元素通过equals ()比较返回true, 但他们的hasCode ()值却不一样,hashSet ()会将它们存储在不同的位置。依然可以添加成功。
LinkedHashSet :HashSet的子类,LinkedHashSet集合也是根据元素的hasCode值来决定元素的位置,但是其同时使用链表来维护元素的次序,这样元素插入是按照一定的次序。当遍历LinkedHashSet时,其会按照插入顺序输出的,但是因为其是要维护元素的插入顺序的,因此性能比HashS底。但是在迭代访问set里的全部元素时 ,具有优势。
TreeSet:
TreeSet是SortSeet接口的实现类,TreeSet可以确保集合元素处于排序状态,其方法与hashSet类似
各种Set性能分析:
HashSet的性能总体来说比Treeset性能好,(特别是插入,删除时)因为TreeSet需要额外的红黑树算法来维护集合元素的次序,只有需要一个排序的Set的时候才使用TreSet,否则都是用HashSet 。hashSet,TreeSet ,都是线程不安全的,
List集合:
List集合代表一个有序,可重复 ,集合中每个元素都有其对应的顺序索引,List集合允许使用重复元素,可以通过索引来访问指定位置集合的元素。List集合默认按元素的添加顺序设置元素的索引。例如添加第一个为0 ,则依次会增加。
ArrayList与Vector:
ArrayList与Vector都是基于数组实现的List类,所以ArrayList和Vectror都封装了一个动态的允许在分配的、object[]数组,Vector有很多缺点,ArrayList作为List的主要实现类,
ArrayList与Vector的显著区别:
ArrayList是线程不安全的,当多个线程访问同一个ArrayList时,如果有超过一个线程修改了ArrayList集合,则程序必须手动保证该集合的同步性,因为Vector是线程安全的所以其性能比ArrayList性能低,即使需要保证List线程安全,也同样不推荐使用Vector,通过Collections会将ArrayList变成线程安全的。
Queue集合
Queue集合用于模仿队列这种数据结构,队列是指FIFO的容器,通常队列不允许随机访问队列中的元素,
PriorityQueue :是一个比较标准的队列,其保存队列元素顺序并不是按添加入队的元素而是按照队列元素的大小进行重新排序,因此调用出栈方法并不是并不是取出最先出栈的元素。
Deque 接口与ArryDeque实现类:
Deque接口是Queue接口的子类,代表一个双端队列,Deque接口里定义了一些双端队列的方法,这写方法允许从两端来操作队列的元素。
ArrayList与ArrayDeque 的底层都是采用一个动态的,可重新分配的Object[]数组来存储集合元素,当元素超出容量系统会重新分配。
ArrayDeque 不仅可以当做队列也可以当做栈来使用,
LinkedList :
LinkedList类是List 接口的实现类,这意味着其是一个List集合,可以根据索引来访问集合中的元素,而且LinkedList即可以被当做栈来实现也可以被当做队列来使用,
LnkedList ,ArrayList, ArrayDeque 的性能分析:
ArrayList, ArrayDequ内部是以数组形式来保存集合元素的因此随机访问元素时的性能会更好,而LinkedList是以链表的形式保存集合元素的,所以随机访问是性能差,但是在插入删除元素的时候性能比较出色。
ArrayList的性能比LinkedList的性能好,因此大部分的时候应该考虑使用ArrayList。
如果有多个线程需要同时访问?list集合的元素的时候,可以考虑使用Collections将集合包装成线程安全的集合。
Map集合
Map用于保存具有映射关系的数据,因此Map集合里保存着两组值,一组用于保存Map里的key 一组用于保存Map里的value,key和value都可以是任何引用的数据类型,Map里的key不允许重复。key 与value之间存在一对一的关系,即通过指定的key,总能找到唯一的values,
HashMap是线程不安全的实现,
LinkedHashMap
HashMap的子类,使用双向链表来维护key-value对的次序,该链表负责维护Map的迭代顺序,迭代顺序与key-value的插入顺序一致,输出会按照插入顺序输出。
使用ProPerties读写文件属性
Properties类是hashSet的子类,该对象在处理属性文件是特别方便,Properties类可以把Map对象和属性文件关联起来从而可以把Map对象和属性文件关联起来,从而可以Map对象中的key-value写入属性文件。也可以吧属性文件中的属性名=属性值加载到map对象中,属性文件里的属性名属性值都是字符串类型,所以Propertites里的key values都是字符串类型
各类Map的选择:
程序应多考虑使用HashMap,因为HahMap正是为快速查询设计的,但是如果需要总是排好序的,则应该考虑使用TreeMap 。
操作集合的工具 Collections
java提供了一个操作Set ,List, Map 等集合的工具类, Collection,该集合提供了大量的方法对集合元素进行排序,查询,修改等操作,还提供了将集合对象设置为不可变,对集合对象实现同步控制等方法。
重要用法:同步控制
Collections类提供了多个synchronizationedXxx ()方法,该方法可以将指定集合包装成线程同步的集合,从而解决多线程并发访问访问集合时线程安全的问题,
java中常用集合框架中的实现类:HashSet(),ArrayList(),TreeSet (),ArrayDeque(),LinkedList(),HashMap(),TreeMap()都是线程不安全的。Colleactions提供了多个方法可以把它们包装成线程同步的集合。
java 之泛型
在没有泛型之前,一旦把一个对象丢进java集合中,集合就会忘记对象的类型,把所有的对象当成Object类型处理,当程序从集合取出对象后,就需要进行强制类型转换,这种强制类型容易使代码变得臃肿,而且容易引起ClassCastException 异常。
增加了泛型编程后,完全可以记住集合中元素的类型,并可以在编译时检查集合中元素的类型,如果视图向集合中添加不满足类型要求的对象,编译器就会提示错误。这样就会使代码更加简洁,程序更加健壮。
使用泛型:
java引入了“参数化类型”的概念,允许程序在创建的时候指定集合的元素的类型,java的参数化类型被称为泛型。
类型统配符:
为了表示各种泛型List的父类,可以使用类型通配符,类型通配符是一个问号(?)将一个问号作为类型实参传递给List集合,写作List (
意思是元素类型未知的list) 这个问号被称为通配符,它的元素类型可以匹配任何类型。
这种用法可以使用在适用任何支持泛型声明的接口和类。如下:set>,Colleaction >, Map ,?>;