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.  总结

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

原文来自: http://www.cnblogs.com/ACFLOOD/ 

【转】Java基础——容器分类的更多相关文章

  1. java基础-容器

    已经写了一段时间JAVA代码了,但仔细想来,却发现对JAVA的很多方面还是一片迷茫. 利用周末补一下基础知识吧. 大致列一下这个周末需要学习的内容 1 容器 (本节内容) 2 线程 3 流 目录 1 ...

  2. JAVA基础--容器 Set, List, Map

    Colections接口, Iterator接口, Set接口, List接口, Comparable接口, Map接口 Collections类 容器:装各种对象. 所有容器都在java.util里 ...

  3. java基础-容器-Set

    Set:set不存重复元素,如果是使用set存储java预定义的Integer,String等类型会很简单,如果是存储自定义类型的数据类型,就必须要重新定义equals()方法以确保set中保存的对象 ...

  4. java基础 容器 API

  5. 牛客网java基础题分类

    http://www.cnblogs.com/tptptptp/p/5904075.html

  6. JAVA基础(9)——容器(3)——并发容器

    转载:http://blog.csdn.net/weitry/article/details/52964509 JAVA基础系列规划: JAVA基础(1)——基本概念 JAVA基础(2)——数据类型 ...

  7. [Think In Java]基础拾遗3 - 容器、I/O、NIO、序列化

    目录 第十一章 持有对象第十七章 容器深入研究第十八章 Java I/O系统 第十一章 持有对象 1. java容器概览 java容器的两种主要类型(它们之间的主要区别在于容器中每个“槽”保存的元素个 ...

  8. Java基础 -- 持有对象(容器)

    一 容器的用途 如果对象的数量与生命周期都是固定的,自然我们也就不需要很复杂的数据结构. 我们可以通过创建引用来持有对象,如 Class clazz; 也可以通过数组来持有多个对象,如 Class[] ...

  9. java面试:java基础、Io、容器

    1.java基础 1.JDK 和JRE有什么区别 ​ JDK:java开发工具包,java开发运行环境.包含了JRE. ​ JRE:java运行环境,包含java虚拟机,java基础类库. 2.jav ...

随机推荐

  1. influxdb问题解决

    一.influxdb启动不了? 清空数据文件夹: cd /var/lib/influxdb/data rm -rf * 清除完就可以启动了,然后查看/var/lib/influxdb下data和met ...

  2. PHP程序员的能力水平层次

    PHP程序员的能力水平层次 之前看过很多篇关于服务端工程师和PHP开发者的能力模型介绍,每篇都对能力有侧重点. 下面我们来详细谈谈以开发能力为基准点的PHP程序员的能力水平层次. 层层递进 1.功能开 ...

  3. Linux CenterOS安装mysql-5.6.12-linux-glibc2.5-x86_64.tar.gz步骤

    1.首先配置IP. Cd /etc/sysconfig/network-scripts/ vim ifcfg-ens32 将ONBOOT=no,改为ONBOOT=yes.(开机启动激活网卡) 2.构建 ...

  4. 当web应用包含了websocket长连接,如何在web应用前加一层nginx转发

    1 通过在web应用的前面加一层nginx ,可以实现一台主机部署多个应用,每个应用都可以用不同的域名去访问,并且端口都是80 2 nignx 转发websocket长连接 1 每个web应用,他们运 ...

  5. [matlab] 10.最小覆盖

    clear all; close all; clc; n=100; p=rand(n,2); p1=p(1,:); %取第一行的值 P1点 p2=p(2,:); %取第二行的值 P2点 r=sqrt( ...

  6. Oracle补丁术语介绍

    在使用Oracle的技术支持服务的时候,经常会遇到补丁相关的术语.现在对这些术语做些解释说明: Interim patch/One-off patch:是我们常说的小补丁,为了修复某(几)个Bug而发 ...

  7. 14.swing

    一.开发架构1.最外层是一个jframe的框架2.可以在框架中添加任意组件3.组件分为两大类: a.容器类型:可以继续在该容器中添加其他组件.例如:jpanel 面板,可以多个面板添加到同一个框架中 ...

  8. ActiveMQ发布订阅模式 转发 https://www.cnblogs.com/madyina/p/4127144.html

    ActiveMQ的另一种模式就SUB/HUB即发布订阅模式,是SUB/hub就是一拖N的USB分线器的意思.意思就是一个来源分到N个出口.还是上节的例子,当一个订单产生后,后台N个系统需要联动,但有一 ...

  9. Vim 中使用 vimim 来输入中文

    Vim 中输入中文,要来回切换中英文,偶尔不慎的切换和按键,可能导致误删不能恢复的错误,一直是个很头疼的问题.现在有了 vimim 这个插件,整个世界清净了. 插件官方网站:http://www.vi ...

  10. bsxfun, arrayfun, cellfun, spfun, structfun

    在使用matlab进行矩阵计算的时候,经常会遇到要使用for循环的情况.但其实很多操作可以用内部的一些函数代替.今天总结一些几个函数的用法: bsxfun, arrayfun, cellfun, sp ...