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

如果觉得本文对您有所帮助的话,就给俺推荐一个吧~
作者:I'm coding
链接:http://www.cnblogs.com/ACFLOOD/
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

走进Java中的持有对象(容器类)之一 容器分类的更多相关文章
- 走进Java中的持有对象(容器类)【二】Collection
概述 通过前文的学习,我们对容器的分类及常用容器类的作用有了基本的认识.本文将针对Collection容器的功能与使用进行细致分析. 基本操作 Collection集合抽象出的目的是为存放独立元素的序 ...
- java中对集合对象list的几种循环访问
java中对集合对象list的几种循环访问的总结如下 1 经典的for循环 public static void main(String[] args) { List<String> li ...
- Java中的函数对象
初次听说java中的函数对象可能,比较的陌生.可以类比着来理解一下,人们常说java中没有了指针,殊不知,java中的对象引用就是指针,有时候我们说一个对象往往指的就是这个对象的引用,也就是说基本上把 ...
- (转)java中对集合对象list的几种循环访问总结
Java集合的Stack.Queue.Map的遍历 在集合操作中,常常离不开对集合的遍历,对集合遍历一般来说一个foreach就搞定了,但是,对于Stack.Queue.Map类型的遍历,还是有一 ...
- Java中创建实例化对象的几种方式
Java中创建实例化对象有哪些方式? ①最常见的创建对象方法,使用new语句创建一个对象.②通过工厂方法返回对象,例:String s =String.valueOf().(工厂方法涉及到框架)③动用 ...
- Java中字节与对象之间的转换
近期公司里面用到了消息队列,而正如我们知道的是消息队列之间的是通过二进制形式的.以下就分享一下java中字节与对象之间的转换. 主要是用到了ByteArrayOutputStream和ObjectOu ...
- java中的string对象深入了解
这里来对Java中的String对象做一个稍微深入的了解. Java对象实现的演进 String对象是Java中使用最频繁的对象之一,所以Java开发者们也在不断地对String对象的实现进行优化,以 ...
- Java中创建的对象多了,必然影响内存和性能
1, Java中创建的对象多了,必然影响内存和性能,所以对象的创建越少越好,最后还要记得销毁.
- Java中利用MessageFormat对象实现类似C# string.Format方法格式化
我们在写C#代码的时候常常会使用到string.Format("待格式化字符串{0},{1},....",参数1,参数2,...),来格式化字符串,特别是拼接字符的时候,这种方式使 ...
随机推荐
- Linux命令学习总结:ls
命令简介: ls命令用来列出目标目录(缺省的话为当前目录)中所有的子目录和文件.指令英文原义:list 指令所在路径:/bin/ls 执行权限:All User 命令语法: ls [OPTION].. ...
- Cs231n-assignment 1作业笔记
KNN assignment1 KNN讲解参见: https://blog.csdn.net/u014485485/article/details/79433514?utm_source=blogxg ...
- Windows的GDI映射方式,逻辑坐标,设备坐标的理解
最近在学Win32的编程,看的是<Windows程序设计第5版>一书,这本书是台湾人翻译的,有些译法和大陆不一样,书中还有一些错误的地方,很多时候需要中英文对照阅读,下载请点击 https ...
- 批处理基础知识-EXIT
本文主要介绍批处理EXIT命令的使用. 阅读须知: 在开始阅读本文之前,您需要知道批处理CALL命令和ERRORLEVEL相关知识,若您没有接触过类似信息,建议goole或baidu. EXIT命令格 ...
- 我的第一个python web开发框架(22)——一个安全小事故
在周末的一个早上,小白还在做着美梦,就收到了小美的连环追魂call,电话一直响个不停. 小白打着哈欠拿起电话:早上好美女. 小美:出事了出事了,我们公司网站一早访问是一片空白,什么内容都没有了,你赶急 ...
- .net 添加api不能访问的问题
在一个.netmvc项目中,本身没有提供api后来想添加api就会出现问题.会发生添加的apicontrol不能访问的情况.这种情况一般是因为,global文件中,application_start( ...
- Storm入门(三)HelloWorld示例
一.配置开发环境 storm有两种操作模式: 本地模式和远程模式.使用本地模式的时候,你可以在你的本地机器上开发测试你的topology, 一切都在你的本地机器上模拟出来; 用远程模式的时候你提交的t ...
- DependencyInjection源码解读之ServiceProvider
var services = new ServiceCollection(); var _serviceProvider = services.BuildServiceProvider(); serv ...
- 分享Winform datagridview 动态生成中文HeaderText
缘起 很久以前给datagridview绑定列的时候都是手动的,记得以前用Display自定义属性来动态给datagridview绑定列.后来发现不行,于是还在博问发了问题: 后来热心网友帮我回答了这 ...
- OracleSql语句学习(四)
SELECT e.ename,m.ename,d.locFROM emp_weiyiji e JOIN emp_weiyiji m ON e.mgr=m.empnoJOIN dept_weiyiji ...