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()

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);

  }

}

      本例中,intset中插入了10000次,由于不保留重复元素最后输出结果数目<=30。

  • TreeSet

     TreeSet使用红黑树来实现存储元素, 红黑树的好处是可以插入之后维持集合的有序性

import java.util.*;

public class SortIntegerSet {

  private static Random rand;

   public static void main(String[] args) {

     rand = new Random(47);

     Set<Integer> sintset = new TreeSet<Integer>();

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

          sintset.add(rand.nextInt(20));

       }

       System.out.println(sintset);

  }

}
  • LinkedHashSet

      顾名思义,LinkedHashSet使用了链表来保持插入顺序,不过为了提高查询效率,也使用了散列

  • Queue接口
    • LinkedList

     LinkedList实现了Queue接口,提供了方法支持队列的行为,在以后的系列我们会深入讲解如何用

     LinkedList实现队列。

  • PriorityQueue

     与普通队列不同,优先队列每次弹出的是优先级最高的元素。可以通过提供自己的Comparator来修改

    默认的优先级顺序。       

  • Map接口
    • HashMap

HashMap通过散列机制,用来快速访问

  • TreeMap

    TreeMap保持"key"处于排序状态,访问速度不如HashMap

  • LinkedHashMap

    LinkedHashMap保持元素插入时顺序,同时提供散列实现快速访问

关于Map的散列实现是非常重要的,实现Map的原理(关联数组等),hashCode()方法的理解,本系列后面会一一分析。

5.  总结

通过本文的学习,相信读者对容器的用途,分类,以及容器的层次结构与一些常用容器的基本功能和用法有了较为清晰地了解。然而,想要更好的使用容器类,还必须了解每种容器具体的方法,源码,以及线程安全的实现。在本系列的后续部分,将带大家继续深入讨论这些内容。

如果觉得本文对您有所帮助的话,就给俺推荐一个吧~

作者:I'm coding
链接:http://www.cnblogs.com/ACFLOOD/
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

走进Java中的持有对象(容器类)之一 容器分类的更多相关文章

  1. 走进Java中的持有对象(容器类)【二】Collection

    概述 通过前文的学习,我们对容器的分类及常用容器类的作用有了基本的认识.本文将针对Collection容器的功能与使用进行细致分析. 基本操作 Collection集合抽象出的目的是为存放独立元素的序 ...

  2. java中对集合对象list的几种循环访问

    java中对集合对象list的几种循环访问的总结如下 1 经典的for循环 public static void main(String[] args) { List<String> li ...

  3. Java中的函数对象

    初次听说java中的函数对象可能,比较的陌生.可以类比着来理解一下,人们常说java中没有了指针,殊不知,java中的对象引用就是指针,有时候我们说一个对象往往指的就是这个对象的引用,也就是说基本上把 ...

  4. (转)java中对集合对象list的几种循环访问总结

    Java集合的Stack.Queue.Map的遍历   在集合操作中,常常离不开对集合的遍历,对集合遍历一般来说一个foreach就搞定了,但是,对于Stack.Queue.Map类型的遍历,还是有一 ...

  5. Java中创建实例化对象的几种方式

    Java中创建实例化对象有哪些方式? ①最常见的创建对象方法,使用new语句创建一个对象.②通过工厂方法返回对象,例:String s =String.valueOf().(工厂方法涉及到框架)③动用 ...

  6. Java中字节与对象之间的转换

    近期公司里面用到了消息队列,而正如我们知道的是消息队列之间的是通过二进制形式的.以下就分享一下java中字节与对象之间的转换. 主要是用到了ByteArrayOutputStream和ObjectOu ...

  7. java中的string对象深入了解

    这里来对Java中的String对象做一个稍微深入的了解. Java对象实现的演进 String对象是Java中使用最频繁的对象之一,所以Java开发者们也在不断地对String对象的实现进行优化,以 ...

  8. Java中创建的对象多了,必然影响内存和性能

    1, Java中创建的对象多了,必然影响内存和性能,所以对象的创建越少越好,最后还要记得销毁.

  9. Java中利用MessageFormat对象实现类似C# string.Format方法格式化

    我们在写C#代码的时候常常会使用到string.Format("待格式化字符串{0},{1},....",参数1,参数2,...),来格式化字符串,特别是拼接字符的时候,这种方式使 ...

随机推荐

  1. 【转载】FPGA算法设计随笔

    FPGA设计算法依次需要完成MATLAB浮点仿真 MATLAB定点仿真 verilogHDL定点运算以及数据对比的流程.其中浮点到定点的转换尤为重要,需要在数据表示范围和精度之间做出权衡.另外掌握定点 ...

  2. LeetCode算法题-Array Partition I(Java实现)

    这是悦乐书的第262次更新,第275篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第129题(顺位题号是561).给定一个2n个整数的数组,你的任务是将这些整数分组为n对 ...

  3. Elixir 分布式平台

    概述 分布式平台的核心在于并发,容错. 而 Elixir 的优势正是在于对于并发和容错的处理. 分布式模型 CSP(Communicating Sequential Process) 模型 :: 多个 ...

  4. Maven构建项目出现No compiler is provided in this environment. Perhaps you are running on a JRE rather than a JDK?

    No compiler is provided in this environment. Perhaps you are running on a JRE rather than a JDK? 你应该 ...

  5. ubuntu18.04搭建hive

    hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供简单的sql查询功能,可以将sql语句转换为MapReduce任务进行运行. 其优点是学习成本低,可以通过 ...

  6. vue slot插槽的使用

    slot插槽的使用场景 父组件向子组件传递dom时会用到插槽   作用域插槽:当同一个子组件想要在不同的父组件里展示不同的状态,可以使用作用域插槽.展示的状态由父组件来决定   注:想要修改父组件向子 ...

  7. Django组件 之中间件

    -------------------------------------------------------------------落花不是无情物,待到山花烂漫时. 中间件 中间件的概念 中间件顾名 ...

  8. 深入剖析Redis系列: Redis集群模式搭建与原理详解

    前言 在 Redis 3.0 之前,使用 哨兵(sentinel)机制来监控各个节点之间的状态.Redis Cluster 是 Redis 的 分布式解决方案,在 3.0 版本正式推出,有效地解决了 ...

  9. html2canvas截屏在H5微信移动端踩坑,ios和安卓均可显示

    1.最近在做移动端开发,框架是vue,一产品需求是,后台返回数据,通过qrcode.js(代码比较简单,百度上已经很多了)生成二维码,然后通过html2canvas,将html元素转化为canvas, ...

  10. openstack搭建之-cinder配置(12)

    一. base节点配置 mysql -u root -proot CREATE DATABASE cinder; GRANT ALL PRIVILEGES ON cinder.* TO 'cinder ...