# (一)概述 {#一-概述}
java集合是写代码时经常用到,面试时经常问到的一项基础知识。因此了解深入了解集合不管对写代码,或者是面试都有很大的帮助。作为一名合格的java程序员,你需要了解以下关于集合的知识:
- 集合的框架体系
- Collection接口的特点和使用
- List和Set接口的特点和使用
- List接口和Set接口的实现类学习
- Map接口的特点和使用
- Map接口的实现类学习
- Collections工具类的使用
集合的学习方向也分成两方面:
- 应用层面
- 理解层面
应用层面就是对集合的使用,比较简单。理解层面就相对来说比较复杂,需要看一些集合的源码,了解其中的底层实现逻辑。理解之后要能说出各个集合之间的对比,比如:
- Collection和Map的对比
- List和Set的对比
- ArrayList和Vector对比
- ArrayList和LinkedList对比
- HashMap和HashTable对比
- Collection和Collections对比 ......
# (二)集合的特点与好处 {#二-集合的特点与好处}
说到集合肯定就会想到数组,因为两者都是用来保存一组数据。但是在用数组保存数据(尤其是对象)时存在一些弊端:
- 数组的长度必须提前指定,并且该数组的长度不能修改
- 数组只能保存相同类型的元素。
相比之下,集合就不具备上面的弊端:
- 集合在使用时不用指定长度,可以实现自动扩容
- 集合在没有指定泛型时,保存的对象是Object类型,指定泛型后可以保存对应的类型。
数组比较适合保存基本类型的元素,集合适合保存引用类型的元素,即对象。
# (三)集合的划分 {#三-集合的划分}
集合主要分为两大块体系:Collection和Map。Collection保存单列的元素,Map保存双列的元素(键值对)
Collection接口:
- Set:元素无序不可重复
- List:元素有序可重复
Map接口:
- Key-Value键值对集合
- Collection接口的继承树如下所示:
Map接口的继承树如下所示
# (四)Collection接口的特点 {#四-collection接口的特点}
Collection接口没有自己的实现类,具体的实现类都在他的子接口中,如List和Set。Collection中提供了一系列操作集合的方法,比如增加、删除等等,对于Collection中提供的方法,可以在官方文档中查阅(java PlatForm SE 8)
# (五)Collection的常用方法 {#五-collection的常用方法}
Collection提供的方法并不多,这里介绍一下常用的几个:
public class TestMethod {
public static void main(String[] args) {
//创建collection子接口的对象,这里用ArrayList
Collection collection=new ArrayList();
//method1.add
collection.add("zhangsan");
collection.add(18);
System.out.println(collection);
//method2.addall
Collection collection2=new ArrayList();
collection2.addAll(collection);
System.out.println(collection2);
//method3.contains
boolean contains = collection.contains(18);
System.out.println(contains);
//method4.containsAll
boolean containsall = collection.containsAll(collection2);
System.out.println(containsall);
//method5.isEmpty
System.out.println(collection.isEmpty());
//method6.remove
collection.remove(18);
System.out.println(collection);
//method7.size
System.out.println(collection.size());
//method8.clear
collection.clear();
System.out.println(collection);
}
}
需要注意的是Collection的遍历,Collection继承了Iterable接口,使得它可以通过迭代器来遍历元素。迭代器的遍历有三步:
Collection collection=new ArrayList();
collection.add("zhangsan");
collection.add(18);
collection.add("lisi");
//1.获取迭代器对象,此时迭代器指向集合最上面元素的上一位
Iterator iterator=collection.iterator();
//2.使用hasNext()判断下一位还有没有对象
while (iterator.hasNext()){
//3.使用next()遍历
System.out.println(iterator.next());
}
为了简化语法也可以用增强for遍历集合,增强for本质上就是迭代器
for (Object o:collection){
System.out.println(o);
}
在迭代过程中。不能通过集合的remove去删除对象集合,不然就会报ConcurrentModificationException错误。如果一定要在迭代中删除元素,建议使用迭代器自带的remove方法删除。
# (六)Collection和Collections的区别 {#六-collection和collections的区别}
Collection是一个接口,Collections是操作List、Set、Map的工具类。
Collections中提供了一系列静态的方法对集合进行操作,常见的排序操作:
-
reverse(List):反转List
-
shuffle(List):对List进行随机排序
-
sort(List):按自然顺序对List集合进行升序排序
-
swap(List,int,int):交换List元素两个位置的元素
public class CollectionsTest1 { public static void main(String[] args) { List list=new ArrayList(); list.add("a"); list.add("b"); list.add("c"); list.add("d"); System.out.println("原始:"+list); Collections.reverse(list); System.out.println("resverse:"+list); Collections.shuffle(list); System.out.println("shuffle:"+list); Collections.sort(list); System.out.println("sort:"+list); Collections.swap(list,0,3); System.out.println("swap:"+list); } }
查找、替换操作:
-
Object max(Collection):取出最大值
-
Object max(Collection,Comparator):按Comparator定制的条件取出最大值
-
Object min(Collection):取出最小值
-
Object min(Collection,Comparator)按Comparator定制的条件取出最小值
-
int frequency(Collection,Object):出现频率
-
void copy(List dest,List src):复制集合
-
boolean replaceAll(List list,Object oldVal,Object newVal):替换所有对象
public class CollectionsTest2 { public static void main(String[] args) { List list=new ArrayList(); list.add("a"); list.add("b"); list.add("c"); list.add("d"); String max = (String) Collections.max(list); System.out.println("max:"+max); String min = (String) Collections.min(list); System.out.println("min:"+min); int frequency = Collections.frequency(list, "a"); System.out.println("frequency:"+frequency); List list2=new ArrayList(Arrays.asList(new Object[list.size()])); Collections.copy(list2,list); System.out.println("copy:"+list2); Collections.replaceAll(list,"a","b"); System.out.println("replaceAll:"+list); } }
# (七)总结 {#七-总结}
虽然在工作中集合的使用很简单,但是集合的原理一定要很扎实的掌握。集合的源码不算很难,因此看懂集合的部分源代码不仅更加深刻理解java有帮助,而且在面试中也能轻易过了集合这一关。