java集合整理

集合
java集合类汇总
一、集合和数组
  数组(可以储存基本数据类型)是用来存现对象的一种容器,不适合在对象数量未知的情况下使用集合只能存储对象,对象类型可以不一样 长度可变,可在多数情况下使用

 二、层次关系


  Collection接口是集合类的根接口,java中没有提供这个接口的直接的实现类,但是却让其被继承产生了两个接口,就是Set和List.Set中不能包含重复的元素,List是一个有序的集合,可以包含重复的元素,提供了按照索引访问的方式

  Map是javautil包中的另一个接口,他和Collection接口没有关系,是相互独立的,但是都属于集合类的一部分。Map包含了key-value对,Map不能包含重复的key,但是可以包含相同的value

 Iterator 所有类的集合类,都实现了iterator接口,他是一个用于遍历集合中元素的接口,主要包含以下三个方法
1.hasNext()是否还有下一个元素 
2.next()返回下一个元素
3.remove()删除当前的元素
三、几种重要的接口和类简介
1、list有序 可重复
  List存放的对象是有序的,同时也是可以重复的,list关注的是索引。拥有一系列和索引相关的方法,查询速度快,因为往list集合里插入或删除数据时,会伴随着后面数据的移动,所有插入删除数据速度慢。
2.Set 无序 不能重复
set存放的对象是无序的,不能重复的,集合中的对象不按特定的方式排序,只是简单的吧对象加入集合中。
3.Map键值对 键唯一 值不唯一

Map集合中存储的是键值对,键不能重复,值可以重复,根据键得到的值,对map集合遍历时先得到键的Set集合,对Set集合进行遍历,得到相对应的值。

 四、遍历
在集合中提供了以下四种的常见输出方式
1.iterator 迭代输出 是使用最多的输出方式
2.ListIterator 是Iterator的子接口,专门用于输出list中内容
3,foreach输出,jdk1.5 提供的新功能,可以输出数组或集合
4 for 循环
五、ArrayList和LinkedList
ArrayList和LinkedList在用法上没有区别,但是在功能上还是有区别的,linkedList经常用在增加和删除较多而查询很少的情况下,ArrayList则是相反。
六、Map集合
实现类 HashMap Hashtable LinkedHashMap和TreeMap
HashMap是最常用的map他根据键的HashCode值存储数据,根据键可以直接获取他的值,具有很快的访问速度,遍历时,获取数据的顺序是完全随机的,因为键对象不可以重复,所以HashMap最多值允许一条记录的键是Null 允许多条记录的值为Null 是非同步的。
HashTable
HashTable与HashMap类似 是HashMap的线程安全版,它支持线程的同步,既任意时刻只有一个线程能写HashTable 因此也导致了HashTable在写入时会比较慢,他继承Diction类不同的是它不允许记录的键或者值是Null,同时效率比较低

    ConcurrenHashMap
线程安全 并且锁分离,ConcurrenHashMap内部使用端类表示这些不同的部分,这个端其实就是一个小的hashTable 他们有自己的锁,只要多个修改操作发生在不同的端上,他们就可以并发进行。

LinkedHashMap
LinkedHashMap保存了记录的插入顺序,在用Iterator遍历LinkedHashMap时,先得到的记录肯定是先插入的,(栈)在遍历的时候会比HashMap慢,有hashMap的全部特性
TreeMap
TreeMap实现了SortMap接口,能够把它保存的记录根据键排序,


       Map的遍历
keySet() 第一种方式
将map中所有的键存入到Set集合中,因为Set具备迭代器,所以可以迭代方式取出所有的键,在根据get方法,获取每一个键对应的值,keySet();迭代后只能通过get取key,取到的结果会乱序,是因为取出数据行主键的时候,使用了hashMap.keySet方法而这个方法返回的Set结果,里面的数据时乱序排放的。


entrySet 第二种方式
Set<Map,Entry<k,v>> entrySet() //返回此映射中包含的映射关系的Set视图 一个关系就是一个键值对 就是把key value作为一个整体一对一对的存放到Set集合中 Map.entry表示映射关系,entrySet()迭代后可以getKey对于keySet其实是遍历了2次,一次是转为iterator 一次就是从hashMap中取出key所对应的value 而entrySet只是遍历了第一次,它把key和value 都放到了entry中,所以快了 两种的遍历的遍历实际相差还是很明显的


主要实现类区别小结
Vector和ArrayList
1.Vector是线程同步的,所以它也是线程安全的,而ArrayList是线程异步的,是不安全的,如果不考虑线程的安全因素,一般用ArrayList效率是比较高的,
2.如果集合中的元素的数目大于目前集合数组的长度时,vector增长率为目前数组程度的100% 而ArrayList增长率为数组长度的50%,如果在集合中使用数据量比较大的数据,用vector有一定的优势。
3.如果查找一个指定位置的数据,vector和ArrayList使用的时间是相同的,如果频繁的访问数据,这个时候使用vector和ArraList都是可以的。而如果移动一个指定位置会导致的元素都发生了移动,这个时候就应该考虑使用LinkList,因为它移动一个指定位置的数据其他元素不移动、ArrayList和Vector是采用数组方式存储数据。此数组元素数大于实际存储的数据一遍增加和插入元素,都允许直接序号索引元素,但是插入数据要设计到数组元素移动等内存操作,所以索引数据块,插入数据慢,Vector由于使用了synchronized方法 线程安全,所以性能上比ArrayList要差,LinedList使用双向链表实现存储,按序号索引数据需要进行向前或向后遍历,但是插入数据时只需要记录本项的前后项即可,所以插入速度较快。


ArrayList和linkedList
1.ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构。
2.对于随机访问get和set ArrayList要优先于LinedList,因为linkedList要移动指针
 3.对于新增和删除操作add和romove lindList比较占优势,因为ArrayList要移动数据,这一点要看实际情况,若只对单条数据插入或删除,ArrayList的速度反而要优先于linkedList 但是若是批量随机的插入和删除,linedList的速度大大优于ArrayList因为ArrayList每插入一条数据,要移动的插入点及之后的所有数据。


HashMap与treemap
1.hashMap通过hashCode对其内容进行快速查找,而treeMap中所有的元素都保持着某种固定的顺序,如果你需要得到一个有序的结果你应该使用treeMap(HashMap的排序时不固定的)
2 在Map中插入删除和定位元素,HashMap是最好的选择,但如果您要按自然顺序或自定义顺序便遍历键,那么treeMap会更好,使用HashMap要求添加的键类明确定义了hashcode和equals的实现两个map中的元素一样,但是顺序不一样,导致hashCode不一样。

猜你喜欢

转载自blog.csdn.net/jia970426/article/details/79538921