转载自 https://www.cnblogs.com/ACFLOOD/p/5555555.html

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

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

走进Java中的持有对象(容器类)之一 容器分类相关推荐

  1. java容器类_走进Java中的持有对象(容器类)之一 容器分类

    Java容器可以说是增强程序员编程能力的基本工具,本系列将带您深入理解容器类. 容器的用途 如果对象的数量与生命周期都是固定的,自然我们也就不需要很复杂的数据结构. 我们可以通过创建引用来持有对象,如 ...

  2. java 字符串是对象吗_解析Java中的String对象的数据类型

    解析Java中的String对象的数据类型 2007-06-06 eNet&Ciweek 1. 首先String不属于8种基本数据类型,String是一个对象. 因为对象的默认值是null,所 ...

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

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

  4. js解析java对象数组_js接收并转化Java中的数组对象的方法

    在做项目时,要向ocx控件下发命令,就要在js中得到java中的对象,然后拼成一种格式,下发下去...当对象是一个时比较简单,但如果对象是一个数组时,就略显麻烦了. 开始我以为有简单的方式,可以直接进 ...

  5. Java中的dozer对象转换

    Java中的dozer对象转换 1.dozer介绍 Dozer是Java Bean到Java Bean映射器,它以递归方式将数据从一个对象复制到另一个对象. dozer是用来对两个对象之间属性转换的工 ...

  6. java object大小_在Java中,确定对象object大小的最佳方法是什么? - Break易站

    例如,假设我有一个应用程序,它可以读取包含一堆数据行的CSV文件.我根据数据类型向用户提供行数摘要,但是我想确保不读取太多数据行并导致OutOfMemoryErrors.每一行都会翻译成一个对象.有没 ...

  7. java中如何获取对象的内存地址

    java中如何查看对象地址:使用  System.identityHashCode("对象") 即可 eg: Integer i = new Integer(5);System.i ...

  8. java定义对象数组初始化_怎么定义对象数组 JAVA中怎么初始化对象数组?

    java类怎样定义数组对象数组 在c++编程中,怎么定义对象数组的指针? JAVA中怎么初始化对象数组? java中怎么创建对象数组?比如我创建了一个学生类Sclass Student{ } 类中怎么 ...

  9. java中的持有引用

    Thinking in java对这个地方说得不清楚,随便在网上找了几篇文章也没看太明白. 是说想要在以后访问某个对像,但现在又想先回收了它,就可以使用持有引用来实现,而问题是回收就是回收了,怎么才能 ...

最新文章

  1. 收藏 | 2018年AI三大顶会中国学术成果全链接(附视频、PPT、论文)
  2. 软件工程的实践项目课程的自我目标
  3. 博客园T恤PP泄漏版(附图)
  4. 学过物理的人才能看懂的笑话,你能看明白几个?
  5. 2019-03-14-算法-进化(移动零)
  6. CSS学习笔记11 CSS背景
  7. 荒芜的周六-PHP之面向对象(三)
  8. 深度之眼 alexnet_AlexNet带给了深度学习的世界
  9. 利用Python的sympy包求解一元三次方程
  10. 计算机研究生论文多少字,研究生一篇论文需要多少字?
  11. Bmob 萌新也能简易上手 之一 注册登录- *2020版 (有demo)
  12. 敏感词工具(sensitive word)的使用
  13. flink常用参数说明
  14. 【Python 脚本报错】AttributeError:‘module‘ has no attribute ‘xxx‘的解决方法
  15. 关于new Map()
  16. BGP知识手册-华为-华三-思科
  17. siri语音功能测试点
  18. 原有人陪你颠沛流离 昨日书
  19. mathematica结果c语言形式,Mathematica表达式及其运算规则
  20. 楼天城、清华邓志东激辩自动驾驶:近在咫尺还是遥遥无期?| 清华AI Time

热门文章

  1. [SDWC2018 Day1]网格
  2. TCP Fast Open知识
  3. 4.OD-调试示例1
  4. OpenCV 中的图像处理 004_平滑图像
  5. LevelDB 源码剖析(三)公共基础:内存管理、数值编码、Env家族、文件操作
  6. python新式类和经典类的区别?
  7. C语言登顶!|2021年7月编程语言排行榜
  8. 面试官灵魂拷问:为什么 SQL 语句不要过多的 join?
  9. 求1+2+3+...+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)
  10. 【城市沙龙】LiveVideoStack Meet|杭州:多媒体新黄金时代