Java基础--容器类

面试官:Java的容器类你有什么了解吗? -:额,没有用过.... 面试官:你肯定用过,但你没有注意过.... -:应该是吧....

你知道什么是容器类吗?Java容器可以说是增强程序员编程能力的基本工具,本文将与您一起理解容器类,看完之后你也许会恍然大悟,这原来就是容器类啊,一起避免面试时的尴尬!!!!

1.容器的用途

如果对象的数量与生命周期都是固定的,自然我们也就不需要很复杂的数据结构。 我们可以通过创建引用来持有对象,如

Class clazz;

也可以通过数组来持有多个对象,如

Class[] clazs = new Class[10];

然而,一般情况下,我们并不知道要创建多少对象,或者以何种方式创建对象。数组显然只能创建固定长度的对象,为了使程序变得更加灵活与高效,Java类库提供了一套完整的容器类,具备完善的方法来解决上述问题。

2.容器的类别

容器的类别

]

观察上图,我们可以得出容器主要分为两种类型,两个接口Collection与Map定义了两类不同的对象存储方式。 Collection用以保存单一的元素,Map保存关联键值对。通过泛型来指定容器存放的数据类型。** Iterator 设计的目的是在未知容器具体的类型的情况下,用来遍历容器元素。剩下的容器类型都是继承了这两个接口。 在实际编码中,通过向上转型**为接口,在其与代码中都使用这个接口是非常普遍的使用方式。如下:

import java.util.*;

public class TestCollection {

    public static void main(String[] args){

        Collection<Integer> c = new ArrayList<Integer>();

        for(int i = 0; i < 10; i++){

            c.add(i);    

        }

        for(Integer i : c){

            System.out.print(i + ", ");

        }

    }

}

注:由于List接口的方法比Collection更为丰富,所以 实际应用中,ArrayList向上转型为List更为合适。 刚刚接触容器的朋友们可能会只把Collection与Map当做接口,实际上并非如此,容器中的接口其实有六个。

3. 容器中的七大接口

1.Collection接口 2.Map接口 3.Set接口 4.List接口 5.Queue接口 6.Iterator接口 7.Comparable接口

其中List, Queue和Set接口继承了Collection接口,剩下的接口之间都是相互独立的,无继承关系。List和Set接口主要是为了区分是否要包含重复元素,Iterater迭代器则是为了更灵活的迭代集合,与foreach一起使用。Comparable接口则用于比较。

4. 各类容器的功能(主要实现类分析)

  • .Collection接口
    • List接口(相比Collection, 添加了新的方法)
      • ArrayList 实现List接口,类似于动态数组,适用于大量随机访问的情况。但插入和删除的代价非常高昂
      • LinkedList 实现List接口,类似于链表,也提供了优化的顺序访问。在插入和删除方面代价低廉,随机访问代价较高
    • Set接口(方法与Collection完全相同)
    • HashSet HashSet使用了散列函数实现,极大的提高了访问速度,集合中的对象是没有顺序的。存入HashSet的对象必须定义hashCode()
    • TreeSet TreeSet使用红黑树来实现存储元素, 红黑树的好处是可以插入之后维持集合的有序性,从而保证在遍历的时候,按照递增的顺序获取对象。
    • LinkedHashSet 顾名思义,LinkedHashSet使用了链表来保持插入顺序,不过为了提高查询效率,也使用了散列
    • Queue接口
      • LinkedList LinkedList实现了Queue接口,提供了方法支持队列的行为,在以后的系列我们会深入讲解如何用LinkedList实现队列。
      • PriorityQueue 与普通队列不同,优先队列每次弹出的是优先级最高的元素。可以通过提供自己的Comparator来修改默认的优先级顺序。
  • Map接口
    • HashMap HashMap通过散列机制,用来快速访问,适用于添加、删除和定位映射关系。允许键对象为null,但因为键对象是唯一的,所以只允许有一个null。
    • TreeMap TreeMap保持"key"处于排序状态,不允许键值为null,访问速度不如HashMap
    • LinkedHashMap 。 LinkedHashMap保持元素插入时顺序,同时提供散列实现快速访问 。 关于Map的散列实现是非常重要的,实现Map的原理(关联数组等)。
import java.util.*;

public class IntegerSet{

  private static Random rand;

   public static void main(String[] args){

     rand = new Random(47);

      Set<Integer> intset = new HashSet<Integer>();

      for(int i = 0; i < 10000; i++){

          intset.add(rand.nextInt(30));

      }

      System.out.println(intset);

  }

}

5.总结

通过本文的回顾,相信读者对容器的用途,分类,以及容器的层次结构与一些常用容器的基本功能和用法有了较为清晰地了解。然而,想要更好的使用容器类,还必须了解每种容器具体的方法,源码,以及线程安全的实现,但是以上这些应对一下面试官应该还可以吧。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏walterlv - 吕毅的博客

从 “x is null 和 x == null” 的区别看 C# 7 模式匹配中常量和 null 的匹配

发布于 2017-11-06 15:24 更新于 2018-02...

681
来自专栏Java学习网

Java中提高代码复用性的方法及规范总结

一个好的程序员一定是用最少的代码实现最多的功能,代码复用是程序员所追求和期望的,这也是Java语言所提倡的;根据以往开发经验整理了一些能够提高代码复用性方法和规...

4047
来自专栏机器学习从入门到成神

设计模式之静态工厂、工厂方法和抽象工厂的联系与区别

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/sinat_35512245/articl...

832
来自专栏java学习

Java每日一练(2017/7/20)

最新通知 ●回复"每日一练"获取以前的题目! ●【新】Ajax知识点视频更新了!(回复【学习视频】获取下载链接) ●【新】HTML5知识点视频更新了!(回复【前...

2566
来自专栏自动化测试实战

接口测试基础——第7篇 简单的Python知识普及(二)之装饰器

43814
来自专栏老马说编程

计算机程序的思维逻辑 (14) - 类的组合

上节我们通过类Point介绍了类的一些基本概念和语法,类Point中只有基本数据类型,但类中的成员变量的类型也可以是别的类,通过类的组合可以表达更为复杂的概念。...

2209
来自专栏Python小屋

Python字符串处理小案例

连续5天30个小时的Python培训圆满结束,明天早上5点半出发赶飞机回烟台,晚上收拾行李的时候突然想起来20年前做过的一个C语言题目:假设有一个字符串,里面有...

2925
来自专栏恰同学骚年

设计模式的征途—21.迭代器(Iterator)模式

我们都用过电视机遥控器,通过它我们可以进行开机、关机、换台、改变音量等操作。我们可以将电视机看做一个存储电视频道的集合对象,通过遥控器可以对电视机中的频道集合进...

822
来自专栏Vamei实验室

Java基础04 封装与接口

总结之前的内容,对象(object)指代某一事物,类(class)指代象的类型。对象可以有状态和动作,即数据成员和方法。 到现在为止,数据成员和方法都是同时开放...

2017
来自专栏机器之心

码如其人,同学你能写一手漂亮的Python函数吗

与多数现代编程语言一样,在 Python 中,函数是抽象和封装的基本方法之一。你在开发阶段或许已经写过数百个函数,但并非每个函数都生而平等。写出「糟糕的」函数会...

1342

扫码关注云+社区

领取腾讯云代金券