在 Java2中,有一套设计优良的接口和类组成了Java集合框架Collection,使程序猿操作成批的数据或对象元素极为方便。这些接口和类有非常多对抽象数据类型操作的API,而这是我们经常使用的且在数据结构中熟知的。比如Map。Set,List等。

而且Java用面向对象的设计对这些数据结构和算法进行了封装,这就极大的减化了程序猿编程时的负担。程序猿也能够以这个集合框架为基础,定义更高级别的数据抽象。比方栈、队列和线程安全的集合等,从而满足自己的须要。

Java2的集合框架。抽其核心。主要有三种:List、Set和Map。

例如以下图所看到的:

须要注意的是,这里的 Collection、List、Set和Map都是接口(Interface)。不是详细的类实现。 List lst = new ArrayList(); 这是我们寻常常常使用的创建一个新的List的语句,在这里, List是接口,ArrayList才是详细的类。

经常使用集合类的继承结构例如以下:
Collection<--List<--Vector
Collection<--List<--ArrayList
Collection<--List<--LinkedList
Collection<--Set<--HashSet
Collection<--Set<--HashSet<--LinkedHashSet
Collection<--Set<--SortedSet<--TreeSet
Map<--SortedMap<--TreeMap
Map<--HashMap

-----------------------------------------------SB切割线------------------------------------------

List:
List是有序的Collection,使用此接口可以精确的控制每一个元素插入的位置。用户可以使用索引(元素在List中的位置。类似于数组下 >标)来訪问List中的元素,这类似于Java的数组。

Vector:
基于数组(Array)的List,事实上就是封装了数组所不具备的一些功能方便我们使用,所以它难易避免数组的限制,同一时候性能也不可能超越数组。所以。在可能的情况下,我们要多运用数组。另外非常重要的一点就是Vector是线程同步的(sychronized)的,这也是Vector和ArrayList 的一个的重要差别。

ArrayList:
同Vector一样是一个基于数组上的链表,可是不同的是ArrayList不是同步的。所以在性能上要比Vector好一些,可是当执行到多线程环境中时,可须要自己在管理线程的同步问题。

LinkedList:
LinkedList不同于前面两种List,它不是基于数组的,所以不受数组性能的限制。
它每个节点(Node)都包括双方面的内容:
1.节点本身的数据(data);
2.下一个节点的信息(nextNode)。
所以当对LinkedList做加入,删除动作的时候就不用像基于数组的ArrayList一样,必须进行大量的数据移动。仅仅要更改nextNode的相关信息就能够实现了。这是LinkedList的优势。

List总结:

  • 全部的List中仅仅能容纳单个不同类型的对象组成的表,而不是Key-Value键值对。

    比如:[ tom,1,c ]

  • 全部的List中能够有同样的元素,比如Vector中能够有 [ tom,koo,too,koo ]
  • 全部的List中能够有null元素,比如[ tom,null,1 ]
  • 基于Array的List(Vector。ArrayList)适合查询,而LinkedList 适合加入,删除操作

--------------------------------------NB切割线------------------------------------

Set:
Set是一种不包括反复的元素的无序Collection。

HashSet:
尽管Set同List都实现了Collection接口。可是他们的实现方式却大不一样。List基本上都是以Array为基础。

可是Set则是在 HashMap的基础上来实现的。这个就是Set和List的根本差别。HashSet的存储方式是把HashMap中的Key作为Set的相应存储项。

看看 HashSet的add(Object obj)方法的实现就能够一目了然了。

Java代码  
  1. public boolean add(Object obj) {
  2. return map.put(obj, PRESENT) == null;
  3. }

这个也是为什么在Set中不能像在List中一样有反复的项的根本原因。由于HashMap的key是不能有反复的。

LinkedHashSet:
HashSet的一个子类,一个链表。

TreeSet:
SortedSet的子类,它不同于HashSet的根本就是TreeSet是有序的。它是通过SortedMap来实现的。

Set总结:

  • Set实现的基础是Map(HashMap)
  • Set中的元素是不能反复的。假设使用add(Object obj)方法加入已经存在的对象,则会覆盖前面的对象

--------------------------------------2B切割线------------------------------------

Map:
Map 是一种把键对象和值对象进行关联的容器,而一个值对象又能够是一个Map,依次类推。这样就可形成一个多级映射。对于键对象来说,像Set一样,一个 Map容器中的键对象不同意反复,这是为了保持查找结果的一致性;假设有两个键对象一样,那你想得到那个键对象所相应的值对象时就有问题了,可能你得到的并非你想的那个值对象,结果会造成混乱,所以键的唯一性非常重要,也是符合集合的性质的。当然在使用过程中,某个键所相应的值对象可能会发生变化,这时会依照最后一次改动的值对象与键相应。对于值对象则没有唯一性的要求,你能够将随意多个键都映射到一个值对象上,这不会发生不论什么问题(只是对你的使用却可能会造成不便,你不知道你得到的究竟是那一个键所相应的值对象)。

Map有两种比較经常使用的实现:HashMap和TreeMap。

HashMap也用到了哈希码的算法,以便高速查找一个键,

TreeMap则是对键按序存放,因此它便有一些扩展的方法,比方firstKey(),lastKey()等,你还能够从TreeMap中指定一个范围以取得其子Map。
键和值的关联非常easy。用put(Object key,Object value)方法就可以将一个键与一个值对象相关联。用get(Object key)可得到与此key对象所相应的值对象。

--------------------------------------JB切割线------------------------------------

其他:
一、几个经常使用类的差别
1.ArrayList: 元素单个。效率高,多用于查询
2.Vector: 元素单个,线程安全,多用于查询
3.LinkedList:元素单个。多用于插入和删除
4.HashMap: 元素成对,元素可为空
5.HashTable: 元素成对。线程安全。元素不可为空

二、Vector、ArrayList和LinkedList
大多数情况下,从性能上来说ArrayList最好。可是当集合内的元素须要频繁插入、删除时LinkedList会有比較好的表现。可是它们三个性能都比不上数组,另外Vector是线程同步的。所以:
假设能用数组的时候(元素类型固定。数组长度固定),请尽量使用数组来取代List;
假设没有频繁的删除插入操作。又不用考虑多线程问题,优先选择ArrayList。
假设在多线程条件下使用,能够考虑Vector。
假设须要频繁地删除插入。LinkedList就有了用武之地;
假设你什么都不知道,用ArrayList没错。

三、Collections和Arrays
在 Java集合类框架里有两个类叫做Collections(注意。不是Collection。)和Arrays,这是JCF里面功能强大的工具。但刚開始学习的人往往会忽视。

按JCF文档的说法,这两个类提供了封装器实现(Wrapper Implementations)、数据结构算法和数组相关的应用。
想必大家不会忘记上面谈到的“折半查找”、“排序”等经典算法吧。Collections类提供了丰富的静态方法帮助我们轻松完毕这些在数据结构课上烦人的工作:
binarySearch:折半查找。

sort:排序,这里是一种类似于高速排序的方法,效率仍然是O(n * log n)。但却是一种稳定的排序方法。

reverse:将线性表进行逆序操作,这个但是从前数据结构的经典考题哦!

rotate:以某个元素为轴心将线性表“旋转”。

swap:交换一个线性表中两个元素的位置。

……
Collections另一个重要功能就是“封装器”(Wrapper),它提供了一些方法能够把一个集合转换成一个特殊的集合,例如以下:

unmodifiableXXX:转换成仅仅读集合,这里XXX代表六种基本集合接口:Collection、List、Map、Set、SortedMap和SortedSet。假设你对仅仅读集合进行插入删除操作。将会抛出UnsupportedOperationException异常。

synchronizedXXX:转换成同步集合。

singleton:创建一个仅有一个元素的集合,这里singleton生成的是单元素Set,
singletonList和singletonMap分别生成单元素的List和Map。

空集:由Collections的静态属性EMPTY_SET、EMPTY_LIST和EMPTY_MAP表示。

这次关于Java集合类概述就到这里,下一次我们来解说Java集合类的详细应用。如List排序、删除反复元素。

原文出自:http://skyuck.iteye.com/blog/526358

转载于:https://www.cnblogs.com/zfyouxi/p/5135258.html

Java Collection相关推荐

  1. Java·Collection内部细剖

    1. Java·Collection内部细剖 文章目录 1. Java·Collection内部细剖 1.1. 大纲 1.1.1. Collection 1.1.2. Iterable 1.1.3. ...

  2. 2021-06-19复习java Collection集合 Iterator接口_迭代器 增强for循环 泛型

    2021-06-19复习java Collection集合 Iterator接口_迭代器 增强for循环 泛型 Collection集合 java.util.coLlection接口 所有单列集合的最 ...

  3. Java Collection框架—List\ set \map 的异同世界

    Java集合是多个对象的容方法.集合(容方法).简单点,事实上就是一个对象,能将具有同样性质的多个元素汇聚成一个总体. Collections Framwork是用来表现和操纵集合的一个统一的体系结构 ...

  4. Java - Collection

    Collection层次结构 Collection [plain] view plaincopy print? 子接口 Set,List 集合中只能放置对象的引用,不能放置原生数据类型, 我们需要使用 ...

  5. Java Collection 学习

    定义:Java 作为面向对象语言,对象的操作必比然是重中之重.要操作一个对象容易,如果需要存储多个对象,则需要一个容器,存储多个对象可以使用数组,但是数组的长度是不可变的.所以有了集合的概念.Coll ...

  6. Java Collection类型的forEach方法

    countryList是一个List接口,扩展自Collection: 后者又扩展自Iteratable, forEach就是Iterable提供的方法. forEach接受的方法参数为Consume ...

  7. Java—Collection、Map、树

    Collection  <类型> List 可以重复,有顺序   可存放多个null值 ArrayList     主选 结构:数组      特点:查找快,增删慢         线程不 ...

  8. java collection详解_java 7 collection 详解(一)

    一.综述 java集合框架定义了几个接口,这些接口决定了collection类的基本特性.不同的是,具体类仅仅是提供了标准接口的不同实现,如图, java集合框架接口图 从图可知,java集合类的主要 ...

  9. 设计: ListView 接口,and the missing read-only interfaces in java collection framework

    Java的集合框架以其成功易用的设计征服了很多人(包括我),并且教科书式的诠释了泛型的应用方式. 我也是被 Joshua Bloch 的书引领入门,从中得益良多.我当然不会认为自己在设计上比他懂得更多 ...

最新文章

  1. 什么是main方法?
  2. mysql的查询、子查询及连接查询
  3. Matlab2018a求解一元二次方程
  4. V3S代码整合中遇到的一个奇怪问题
  5. 【论文解读】​YOLOX: Exceeding YOLO Series in 2021
  6. arm学习笔记五(c/c++与arm汇编混合编程)
  7. [蓝桥杯]算法提高 第二点五个不高兴的小明(记忆化搜索||动态规划)
  8. jdk+Tomcat环境搭建
  9. 移动开发在路上-- IOS移动开发系列 多线程一 [转]
  10. iOS 10 推送的简单使用
  11. 基于PCA进行多光谱和全色图像融合
  12. 水电缴费系统php源码_CBMS水电预付费系统
  13. plsql连接不上64位oracle,PLSQL Developer 不能连接 64位 Oracle 11g 的解决办法
  14. Linux中巧用zip命令压缩和解压缩文件
  15. 改变销售预测准确率的4个最佳实践!
  16. 死磕宠物食品安全,京东你凭什么?
  17. 【论文笔记】DeiT论文阅读笔记
  18. 涨知识!中国天眼一秒钟要用多少度电?
  19. string转LPCTSTR
  20. word如何调整字间距离_Word如何快速调整行间距和字间距?

热门文章

  1. 数据绑定控件之Repeater
  2. php显示TABLE数据
  3. HDFS文件系统基本文件命令、编程读写HDFS
  4. SQL 简单,复杂查询,基本函数查询
  5. 算法--删除链表的倒数第N个节点
  6. 已解决:Unable to register authentication agent: GDBus.Error:org.freedesktop.PolicyKit1.Error.Failed:
  7. DevOps笔记-04:DevOps工具和文化缺一不可
  8. 中断服务子程序(ISR)
  9. 基于stm32f103zet6的DS1302学习
  10. 汇编:从键盘读取字符