[Java基础]——集合
此篇博客主要整理集合的使用。
集合分为Collection 和 Map 两种体系:
Collection单列数据,分为List和Set两类。 List ,元素有序、可重复的集合;Set ,元素无序、不可重复的集合。
Map 双列数据, 保存有映射关系的键值对的集合。
一、Collection
Collection接口是List、Set、Queue接口的父接口,该接口里定义的方法既可以用于操作Set的集合,也可以用于操作List和Queue的集合。
接口方法:
1、添加:add(Object obj) 、addAll(Collection coll)
2、获取有效元素的个数: int size( )
3、清空集合: void clear( )
4、判断集合是否为空: boolean isEmpty( )
5、是否包含某个元素: boolean contains(Object obj) ,通过调用元素的equals方法
6、删除: boolean remove(Object obj) 通过元素的equals方法判断再删除
boolean removeAll(Collection c): 取两个集合的差集
7、取两集合的交集 : boolean retainAll(Collection c)
8、集合是否相等 : boolean equals( Object obj)
9、转成对象数组 : Object[ ] toArray( )
10、遍历: iterator,返回迭代器对象,用于集合遍历
Iterator迭代器的使用:
一般的使用方法如下:
Iterator iterator = collection.iterator( );
while(iterator.hasNext( )){ //用hasNext()判断iterator的下一个是否有数据
System.out.println(iterator.next( ));
}
二、List
List 集合类特点,元素有序,可重复。
常用的实现类有: ArrayList 、LinkedList 、 Vector
List的常用方法:
1、void add( int index, Object ele) : 再指定index位置插入ele元素
2、boolean addAll( int index, Collection eles) : 从index位置开始插入eles中的所有元素
3、Object get( int index) : 获取指定index位置处的元素
4、int indexOf( Object obj) : 返回obj 在集合中首次出现的位置
5、int lastIndexOf(Object obj) : 返回obj 在集合中末次出现的位置
6、Object remove( int index) : 移除指定index位置的元素,并返回此元素
7、Object set( int index, Object ele) : 设置指定index位置的元素为ele
8、List subList( int fromindex, int toIndex) : 返回从fromIndex到 toIndex 位置的子集合
ArrayList : 是List 接口的典型、主要实现类。jdk1.8 创建一个长度为0的数组,添加第一个元素时创建一个容量为10的数组
LinkedList : 底层使用双向链表存储,频繁插入或者删除元素时使用,效率高
Vector :Vector与Arraylist 几乎时完全相同的,唯一区别就是Vector 是同步类。扩容方面,Vector每次扩容为原空间的两倍,而ArrayList是1.5倍。
三、Set
- Set接口时Collection 的子接口,没提供额外的方法。
- 元素无序,不可重复。
- 在判断是否重复的是否,根据equals( ) 进行判断,所以如果添加自定义的类需要重写equals( )。
- 主要实现类 HashSet 、 LinkedHashSet 、 TreeSet
1、HashSet
特点:不保证元素的排列顺序,线程不安全, 集合元素可以时null。
注意:使用HashSet存放对象,对应的类不仅需要重写equals( )方法,还要重写hashCode( )方法
HashSet 添加元素的过程:
当向HashSet 集合中存入一个元素时, HashSet会调用该对象的hashCode( )方法,得到它的hashCode值,再计算其散列函数得到该对象的 底层数组中的存储位置。如果两个元素的hashCode值相同,会调用equals方法,true就添加失败;false就继续在该数组位置以链表的方式存储。
2、LinkedHashSet
LinkedHashSet是 HashSet的子类,依然是根据元素的hashCode值来决定元素的存储位置,唯一不同的是每个元素使用双向链表方式记录前一个元素和后一个元素,使其看起来是顺序的。LinkedHash的插入性能略低于SetHashSet,迭代访问时性能较好。
3、TreeSet
特点:是SortSet 接口的实现类,TreeSet可以保证集合元素处于排序状态。底层使用红黑树进行存储。
排序方式:自然排序,调用集合的compareTo(Object obj)方法来比较大小
定制排序,重写类的compare方法。 int compare(T o1, T o2) 返回正整数,则o1 大于 o2 ; 返回0则相等;返回负整数,o1小于o2
四、Map
特点:1、Map中存放键值对(key -- value ) 每一个key对应一个value ,类似于函数。
2、key使用Set存储,不允许重复;value使用Collection存储。Map对象所对应的类必须重写hashCode() 和equals( )
3、常用实现类,HashMap 、 TreeMap 、LinkedHashMap
常用方法:
1、Object put (Object key, Object value) : 添加键值对
2、void putAll(Map m) : 将m中所有的键值对添加到当前map中
3、Object remove (Object key) : 移除给定key对应的键值对
4、void clear( ) : 清空当前map 的所有元素
5、Object get(Object key) : 获取指定key 对应的value
6、boolean containsKey(Object key)
7、boolean containsValue(Object value)
8、int size( )
9、boolean isEmpty( )
10、boolean equals(Object obj)
11、Set KeySet( ) 返回所有Key 构成的Set 的集合
12、Collection values( ) : 返回所有的value 构成的 Collection 集合
这个地方返回的是collection接口,使用的时候需要实例化。最简单的方式是利用list的构造函数实现,List =ArrayList(Collection<? extends E>) 。
1、HashMap :Map 接口使用频次最高的实现类
特点:允许使用null键和null值。无序。key使用Set存储,无序不可重复,对象所在类要重写equals()和hashCode(); values使用Collection存储,无序可重复,对象所在类要重写equals()。
面试题:对HashMap中put /get 方法的认识?
HashMap的扩容机制? 默认大小是多少? 什么是负载因子(或填充比)?
什么是吞吐临界值(或阈值、threshole)?
2、 LinkedHashMap
特点:Hashmap的子类,在原基础上使用双向链表来记录添加元素的顺序
3、 TreeMap
特点:存储键值对时,需要根据键值对进行排序,保证所有键值对均处于有序的状态。排序时根据key的compareTo函数进行比较,可以自定义重写。
4、Hashtable
特点:线程安全、不允许使用null作为键值对,古老的map实现类
5、properties
特点:Hashtable的子类,用于处理属性文件
五、Collections工具类
Collections是一个操作Set、List和Map等集合的工具类,(特别注意是可以操作map的)
- Collections的常用方法,均是静态的
- reverse(List) : 反转List中元素的顺序
- shuffle(List) : 对List 集合元素进行随机的排序
- sort(List, comparator) : 根据指定的Comparable产生的顺序对List 集合元素进行排序
- swap(List, int , int ) : 将指定list位置的两个元素进行交换
- Object max(Collection) : 根据元素的自然顺序,返回给定集合中的最大元素
- Object max(Collection , Comparator) : 根据Comparator指定的顺序,返回元素中的最大值
- int frequency (Collection , Object ) : 返回指定集合中指定元素出现的次数
- void copy(List dest, List src)
- boolean replaceAll(List list , Object oldVal, Object newVal) : 使用新值替代所有旧值