【转】Java基础——容器分类
Java容器可以说是增强程序员编程能力的基本工具,本系列将带您深入理解容器类。
- 容器的用途
如果对象的数量与生命周期都是固定的,自然我们也就不需要很复杂的数据结构。
我们可以通过创建引用来持有对象,如
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. 容器中的七大接口
- Collection接口
- Map接口
- Set接口
- List接口
- Queue接口
- Iterator接口
- 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基础——容器分类的更多相关文章
- java基础-容器
已经写了一段时间JAVA代码了,但仔细想来,却发现对JAVA的很多方面还是一片迷茫. 利用周末补一下基础知识吧. 大致列一下这个周末需要学习的内容 1 容器 (本节内容) 2 线程 3 流 目录 1 ...
- JAVA基础--容器 Set, List, Map
Colections接口, Iterator接口, Set接口, List接口, Comparable接口, Map接口 Collections类 容器:装各种对象. 所有容器都在java.util里 ...
- java基础-容器-Set
Set:set不存重复元素,如果是使用set存储java预定义的Integer,String等类型会很简单,如果是存储自定义类型的数据类型,就必须要重新定义equals()方法以确保set中保存的对象 ...
- java基础 容器 API
- 牛客网java基础题分类
http://www.cnblogs.com/tptptptp/p/5904075.html
- JAVA基础(9)——容器(3)——并发容器
转载:http://blog.csdn.net/weitry/article/details/52964509 JAVA基础系列规划: JAVA基础(1)——基本概念 JAVA基础(2)——数据类型 ...
- [Think In Java]基础拾遗3 - 容器、I/O、NIO、序列化
目录 第十一章 持有对象第十七章 容器深入研究第十八章 Java I/O系统 第十一章 持有对象 1. java容器概览 java容器的两种主要类型(它们之间的主要区别在于容器中每个“槽”保存的元素个 ...
- Java基础 -- 持有对象(容器)
一 容器的用途 如果对象的数量与生命周期都是固定的,自然我们也就不需要很复杂的数据结构. 我们可以通过创建引用来持有对象,如 Class clazz; 也可以通过数组来持有多个对象,如 Class[] ...
- java面试:java基础、Io、容器
1.java基础 1.JDK 和JRE有什么区别 JDK:java开发工具包,java开发运行环境.包含了JRE. JRE:java运行环境,包含java虚拟机,java基础类库. 2.jav ...
随机推荐
- Linux 系统故障排查和修复技巧
Linux 系统故障排查和修复技巧 我发现Linux系统在启动过程中会出现一些故障,导致系统无法正常启动,我在这里写了几个应用单用户模式.GRUB命令操作.Linux救援模式的故障修复案例帮助大家了解 ...
- JavaScript 浮点数运算的精度问题
问题描述 在 JavaScript 中整数和浮点数都属于 Number 数据类型,所有数字都是以 64 位浮点数形式储存,即便整数也是如此. 所以我们在打印 1.00 这样的浮点数的结果是 1 而非 ...
- Leetcode:003 无重复字符串
Leetcode:003 无重复字符串 关键点:给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度.示例 1:输入: "abcabcbb"输出: 3 解释: 因为无重复 ...
- truffle框架的简单使用
truffle 给大家介绍一下这个框架怎么使用,其实把这个框架就是你们看我之前有一个教程是教你们怎么用remix-ide来连接私有链,编译,配置合约,然后进行调用的,truffle其实就是把这个步骤放 ...
- Redo丢失的4种情况及处理方法
这篇文章重点讨论Redo丢失的几种情况,及每种情况的处理方法. 一.说明:1.以下所说的当前日志指日志状态为CURRENT,ACTIVE,非当前日志指日志状态为INACTIVE2.不用考虑归档和非归档 ...
- face recognition[Euclidean-distance-based loss][FaceNet]
本文来自<FaceNet: A Unified Embedding for Face Recognition and Clustering>.时间线为2015年6月.是谷歌的作品. 0 引 ...
- Project Tungsten:让Spark将硬件性能压榨到极限(转载)
在之前的博文中,我们回顾和总结了2014年Spark在性能提升上所做的努力.本篇博文中,我们将为你介绍性能提升的下一阶段——Tungsten.在2014年,我们目睹了Spark缔造大规模排序的新世界纪 ...
- 热泪盈眶的五十岁 | James Altucher
我是一名程序员,但我不爱看技术博客,因为要吸取知识点,看源代码.官方文档和书永远比看技术博客要好.对于博客这种偏碎片的媒介,我倾向于看一些短小精炼.有一点深度的叙述,Altucher刚好符我目前的品味 ...
- Arduino通过MAX9814实现录音
如果通过Arduino进行录音不是单纯地接一个驻极电容MIC就可以的,因为自然界中的声音非常复杂,波形极其复杂,通常我们采用的是脉冲代码调制编码.即PCM编码.PCM通过抽样.量化.编码三个步骤将连续 ...
- NFV组播实验对照
一 论文题目:Approximation and Online Algorithms for NFV-Enabled Multicasting in SDNs 发表时间:2017 期刊来源:Inter ...