51工具盒子

依楼听风雨
笑看云卷云舒,淡观潮起潮落

Collection接口的特点与理解

# (一)概述 {#一-概述}

java集合是写代码时经常用到,面试时经常问到的一项基础知识。因此了解深入了解集合不管对写代码,或者是面试都有很大的帮助。作为一名合格的java程序员,你需要了解以下关于集合的知识:

  1. 集合的框架体系
  2. Collection接口的特点和使用
  3. List和Set接口的特点和使用
  4. List接口和Set接口的实现类学习
  5. Map接口的特点和使用
  6. Map接口的实现类学习
  7. Collections工具类的使用

集合的学习方向也分成两方面:

  1. 应用层面
  2. 理解层面

应用层面就是对集合的使用,比较简单。理解层面就相对来说比较复杂,需要看一些集合的源码,了解其中的底层实现逻辑。理解之后要能说出各个集合之间的对比,比如:

  1. Collection和Map的对比
  2. List和Set的对比
  3. ArrayList和Vector对比
  4. ArrayList和LinkedList对比
  5. HashMap和HashTable对比
  6. Collection和Collections对比 ......

# (二)集合的特点与好处 {#二-集合的特点与好处}

说到集合肯定就会想到数组,因为两者都是用来保存一组数据。但是在用数组保存数据(尤其是对象)时存在一些弊端:

  1. 数组的长度必须提前指定,并且该数组的长度不能修改
  2. 数组只能保存相同类型的元素。

相比之下,集合就不具备上面的弊端:

  1. 集合在使用时不用指定长度,可以实现自动扩容
  2. 集合在没有指定泛型时,保存的对象是Object类型,指定泛型后可以保存对应的类型。

数组比较适合保存基本类型的元素,集合适合保存引用类型的元素,即对象。

# (三)集合的划分 {#三-集合的划分}

集合主要分为两大块体系:Collection和Map。Collection保存单列的元素,Map保存双列的元素(键值对)

Collection接口:

  1. Set:元素无序不可重复
  2. List:元素有序可重复

Map接口:

  1. Key-Value键值对集合
  2. 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中提供了一系列静态的方法对集合进行操作,常见的排序操作:

  1. reverse(List):反转List

  2. shuffle(List):对List进行随机排序

  3. sort(List):按自然顺序对List集合进行升序排序

  4. 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); } }

查找、替换操作:

  1. Object max(Collection):取出最大值

  2. Object max(Collection,Comparator):按Comparator定制的条件取出最大值

  3. Object min(Collection):取出最小值

  4. Object min(Collection,Comparator)按Comparator定制的条件取出最小值

  5. int frequency(Collection,Object):出现频率

  6. void copy(List dest,List src):复制集合

  7. 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有帮助,而且在面试中也能轻易过了集合这一关。

赞(5)
未经允许不得转载:工具盒子 » Collection接口的特点与理解