集合 Collection
Posted lloney0
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了集合 Collection相关的知识,希望对你有一定的参考价值。
Java提供的两大接口:Collection接口和Map接口,其他的集合类都是由这两个接口衍生
Collection接口
Collection接口定义了一个包含一批对象的集合。该接口的主要方法包括:
- size() 集合内的对象数量
- add(E)/addAll(Collection) 向集合内添加单个/批量对象
- remove(Object)/removeAll(Collection) 从集合内删除单个/批量对象
- contains(Object)/containsAll(Collection) 判断集合中是否存在某个/某些对象
- toArray() 返回包含集合内所有对象的数组
Map接口
Map接口在Collection的基础上,为其中的每个对象指定了一个key,并使用Entry保存每个key-value对,以实现通过key快速定位到对象(value)。Map接口的主要方法包括:
- size( ) 集合内的对象数量
- put(K,V)/putAll(Map) 向Map内添加单个/批量对象
- get(K) 返回Key对应的对象
- remove(K) 删除Key对应的对象
- keySet( ) 返回包含Map中所有key的Set
- values( ) 返回包含Map中所有value的Collection
- entrySet( ) 返回包含Map中所有key-value对的EntrySet
- containsKey(K) / containsValue(V) 判断Map中是否存在指定key/value
常用集合类List
List接口继承自Collection,用于定义以列表形式存储的集合,List接口为集合中的每个对象分配了一个索引(index),标记该对象在List中的位置,并可以通过index定位到指定位置的对象。
List在Collection基础上增加的主要方法包括:
- get(int) 返回指定index位置上的对象
- add(E)/add(int, E) 在List末尾/指定index位置上插入一个对象
- set(int, E) 替换置于List指定index位置上的对象
- indexOf(Object) 返回指定对象在List中的index位置
- subList(int,int) 返回指定起始index到终止index的子List对象
List接口的常用实现类:
ArrayList
ArrayList基于数组来实现集合的功能,其内部维护了一个可变长的对象数组,集合内所有对象存储于这个数组中,并实现该数组长度的动态伸缩,ArrayList使用数组拷贝来实现指定位置的插入和删除。
LinkedList
LinkedList基于链表来实现集合的功能,其实现了静态类Node,集合中的每个对象都由一个Node保存,每个Node都拥有到自己的前一个和后一个Node的引用
两者的区别:
- ArrayList的随机访问更高,基于数组实现的ArrayList可直接定位到目标对象,而LinkedList需要从头Node或尾Node开始向后/向前遍历若干次才能定位到目标对象
- LinkedList在头/尾节点执行插入/删除操作的效率比ArrayList要高
- 由于ArrayList每次扩容的容量是当前的1.5倍,所以LinkedList所占的内存空间要更小一些
- 二者的遍历效率接近,但需要注意,遍历LinkedList时应用iterator方式,不要用get(int)方式,否则效率会很低
Set常用类
Set接口也继承Collection接口,里面不能存放重复元素,所以加入元素的时候必须要重写equals( )方法
HashSet:
HashSet中add方法调用的是底层HashMap中的put()方法,而如果是在HashMap中调用put,首先会判断key是否存在,如果key存在则修改value值,如果key不存在这插入这个key-value。而在set中,因为value值没有用,也就不存在修改value值的说法,因此往HashSet中添加元素,首先判断元素(也就是key)是否存在,如果不存在这插入,如果存在着不插入,这样HashSet中就不存在重复值
HashSet通过重写equals( )方法和hashcode( )方法来判断元素是否重复
TreeSet:
- 不能有重复的元素
- 具有排序功能
- TreeSet中的元素必须实现Comparable接口并重写compareTo()方法,TreeSet判断元素是否重复 、以及确定元素的顺序 靠的都是这个方法:
①对于java类库中定义的类,TreeSet可以直接对其进行存储,如String,Integer等,因为这些类已经实现了Comparable接口);
②对于自定义类,如果不做适当的处理,TreeSet中只能存储一个该类型的对象实例,否则无法判断是否重复。
以上是关于集合 Collection的主要内容,如果未能解决你的问题,请参考以下文章