首先,为啥要有集合?集合和数组比起来有哪些好处?
数组的长度是固定的,而在我们开发中,一组数据的长度是不固定的,因此更方便的存储和操作数据,JDK的API中提供了集合,所有集合类都位于java.util包中,与数组不同的是,集合中不能存放基本类型数据,而只能存放对象的引用。
集合的特点:
1.可存放不同类型的对象(必须是对象)
数组只能存放同一类型数据,但是可以存放基本类型数据
2.集合的长度可以自动增加
数组的长度一旦确定,就不能再改变
3.集合对象中有众多方法可以直接调用进行元素(数据)操作
数组对象中没有方法可以对数据进行操作
4.java.util包中的辅助工具类Colletions,也能对集合中的元素进行操作
java.util包中的辅助工具类Arrays,是用来对数组中的元素进行操作的.
集合的分类
引入一个概念:Iterable接口,实现了该接口的对象,都可以使用foreach语句进行循环遍历.并且接口中提供了一个方法一个迭代器对象,迭代器对象在这里的作用就是循环遍历集合中的每一个元素;
public Iterator iterator();
以下两张图是我总结的集合的分类:主要就是List,Set和Map各自的实现类
Collection接口
Collection接口继承了Iterable接口.因此它的实现类都可以或者子接口的实现类都可以使用foreach和迭代器遍历集合;具体说明会在下面实现类中讲到;
List接口和Set接口
List接口和Set接口都是Collection接口的子接口;他们有各自的实现类;
List集合主要有ArrayList、LinkedList、Vector等实现类;
1.ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构
2.对于数据的随机访问,ArrayList效率优于LinkedList,因为LinkedList要移动指针
3.对于新增和删除操作add和remove,LinedList比较占优势,因为ArrayList要移动数据
4.Vector是线程安全的集合,但是速度慢
5.查看API可知,List接口中是这些集合中共有的方法,而且每个集合类中又有一些自己独有的方法。
Set接口常见的实现类有:HashSet、LinkedHashSet
HashSet集合中元素的特点 :无序不可重复
LinkedHashSet集合中元素的特点:有序不可重复
SortedSet接口是Set接口的子接口,除了拥有Set集合的一些基本特点之外,还提供了排序的功能。
TreeSet类就是SortedSet接口的实现类;但是TreeSet集合中的排序默认是从小到大进行排序的,因此我们可以通过改变元素自身的比较性
1.自然排序(元素自身实现Comparable接口,重写其中的compareTo方法)
2.比较器排序(使用匿名内部类的形式实现Comparator接口)
具体排序功能下次会说OVO
List和Set集合的遍历:
1.使用集合中提供的迭代器
List list = new ArrayList();
//调用add方法存数据
Iterator iterator = list.iterator();
while(iterator.hasNext()){
Object obj = iterator.next();
System.out.println(obj);
}
2.List集合的特有方式:get方法通过下标访问元素(仅适用于List集合)
List list = new ArrayList();
//调用add方法存数据
for(int i=0;i<list.size();i++){
System.out.println(list.get(i));
}
3.foreach循环(增强for循环)
List list = new ArrayList();
//调用add方法存数据
for(Object o:list ){
System.out.println(o);
}
Collection类型集合的工具类:Collections
java.util.Collections类是一个工具类,类中提供了很多的静态方法对Collection类型的集合进行操作;
fill():使用指定元素替换指定列表中的所有元素;
max(),根据元素的自然顺序,返回给定集合的最大元素;
sort(),根据元素的自然顺序,对指定列表按升序进行排序;
reverse(),反转集合中的元素;
注意!面试题常问到Collection和Collections的区别!
Map集合
Map类型的集合与Collection类型的集合不同,Map类型的集合存储数据的时候,要使用Key-Value的形式(键值对),且Key值不能重复,否则会覆盖原来的键值对;Map接口没有继承Iterable接口
Map接口的常见实现类:HaspMap,HashTable,Map子接口SortedMap的实现类:TreeMap
1.HashMap是线程不安全的,Hashtable是线程安全的
2.HashMap允许key值或者value值为null,但是Hashtable中的key值或者value值都不允许为null,否则报错.
3.TreeMap默认对key值进行自然排序或者比较器排序,用法和TreeMap是一样的,TreeMap中允许value值为null,但不允许key为null
注意:map中的key和value都必须是Object
Map集合的遍历
1.使用keySet方法,可以返回该Map集合中的所有key值的set类型集合
Map map = new HashMap();
//调用put方法存值
for(Object key:map.keySet()){
System.out.println(key+" : "+map.get(key));
}
2.使用values方法,可以返回该Map集合中所有value值的Collection类型集合
Map map = new HashMap();
//调用put方法存值
for(Object value:map.values()){
System.out.println(value);
}
3.使用entrySet方法,可以返回该Map集合中,包含所有Entry类型对象的Set集合
Map map = new HashMap();
//调用put方法存值
Set entrySet = map.entrySet();
for(Object obj:entrySet){
//需要强转成Entry类型
Entry entry = (Entry)obj;
System.out.println(entry.getKey());
System.out.println(entry.getValue());
}