java集合框架:
1. 什么是框架:类库的集合
2.集合框架:用来表示和操作的统一的架构,包含了实现集合的接口与类
3.集合:存放数据的容器
集合框架包含了两部分:
一部分是接口,一部分是类
4.为什么会出现接口:因为集合框架中的很多类 功能是相似的【所以用接口来规范类】
主要结构图:
Java在设计集 合结构时,把集合划成 3类:第一种 Set,普通的无序集;第二种 List,偏序集;第三种 Map,有序对的集合。 其中 Set和 List都继承自 Collection接口, Map没有从 Collection继承。这样做 也是没办法的事,因为 Map并不是一个通常意义的集合,它的元素是一个 key-value-pair,而 Collection根本就不是 Map,它还没有 key的概念。虽然 Collection和 Map彼此没有继承关系,但它们有大量 同名的方法。值得注意的是, Map提供了 keySet()和 values()两个方法,分别返回一 个 key的集合和值的集合。Collection与Map关系如下:
Collection
├List
│├LinkedList
│├ArrayList
│└Vector
│ └Stack
└Set
Map
├Hashtable
├HashMap
└WeakHashMap
注:在"集合框架"中,接口 Map 和 Collection 在层次结构没有任何亲缘关系,它们是截然不同的。
不要简单的认为集合类就这些,jdk中集合类有很多这些不过是我们经常用到的而已
Collection、List、Set、Queue和Map都是接口(Interface),不是具体的类实现。
二、比较
Vector与ArrayList
Vector的方法都是同步的(Synchronized),是线程安全的(thread-safe),而ArrayList的方法不是,由于线程的同步 必然要影响性能,因此,ArrayList的性能比Vector好。 当Vector或ArrayList中的元素超过它的初始大小时,Vector会将它的容量翻倍,而ArrayList只增加50%的大小,这 样,ArrayList就有利于节约内存空间。
Hashtable与HashMap
它们的性能方面的比较类似 Vector和ArrayList,比如Hashtable的方法是同步的,而HashMap的不是。
ArrayList和LinkedList
对于处理一列数据项,Java提供了两个类ArrayList和LinkedList,ArrayList的内部实现是基于内部数组Object[],所以 从概念上讲,它更象数组,但LinkedList的内部实现是基于一组连接的记录,所以,它更象一个链表结构,所以,它们在性能上有很大的差别。
(1) 从上面的分析可知,在ArrayList的前面或中间插入数据时,你必须将其后的所有数据相应的后移,这样必然要花费较多时间,所以,当你的操作是在一列 数据的后面添加数据而不是在前面或中间,并且需要随机地访问其中的元素时,使用ArrayList会提供比较好的性能。
(2)而访问链表中的某个元素时,就必须从链表的一端开始沿着连接方向一个一个元素地去查找,直到找到所需的元素为止,所以,当你的操作是在一列 数据的前面或中间添加或删除数据,并且按照顺序访问其中的元素时,就应该使用LinkedList了。
(3)如果在编程中,1,2两种情形交替出现,这时,你可以考虑使用List这样的通用接口,而不用关心具体的实现,在具体的情形下,它的性能由 具体的实现来保证。
三、理解
1. 接口
整个Java容器类的基础是容器接口(例如Collection,Map等接口),而不是类。使用接口的最大好处在于将容器的实现与容 器的接口分开,这就意味着你可以使用相同的方法访问容器而不用关心容器是由什么样的数据结构实现的。同样,Iterator接口也使得用户可以使用相同的 方法访问不同的容器类。以上这些是通用算法的基础。
1.1 Collection接口
Collection接口有如下基本方法:
boolean add(Object obj):如果添加对象后,集合确实发生了变化,则返回true;否则返回false
Iterator iterator():返回一个实现了Iterator接口的对象
此外,还有int size(),boolean isEmpty(),boolean contains(Object obj),void clear()等许多有用的方法
1.2 Map接口
Map用于存放关键字/值对。有如下基本方法:
Object get(Object key)
Object put(Object key,Object balue)
Set keySet()
Set entrySet()
此外,还有其他有用的方法。需要注意的是,从表面看它似乎就是一种由键值对构成的集合,但实际上并不是这样。不过另一方面假如将Map的某一部分看作集合,有时候也还是显得非常方便的。换言之你可以创建一个集合用它来表达Map的那一部分。综上所述,一个Map可以返回的东西包括它的键值构成的一个Set、由 它的值构成的一个集合或者由它的键值对构成的一个Set。
1.3 Iterator接口
Iterator接口有下面3个基本方法:
Object next():返回迭代器刚越过的元素的引用
boolean hasNext():判断容器内是否还有可供访问的元素
void remove():删除迭代器刚越过的元素
注意:Java中的迭代器 与STL中的迭代器在概念上有很重要的区别。在STL中,迭代器类似于数组的索引,使用这种迭代器可以查看存放在该位置上的元素(类似于通过数组索引i来 访问c[i]一样)。Java中的迭代器并不这样运行。查看与位置的变化紧密的结合在一起。每次通过next()访问一个元素的同时,迭代器的位置会自动 向前走一步。
这个问题可以这样理解:Java中的迭代器指向的位置并不是元素,而是元素之间。这样,每次调用next()时,迭代器便越过下一个 元素,同时返回它刚越过的那个元素的引用。
迭代器的典型应用
Iterator it=c.iterator();
while(it.hasNext())
{
Object obj=it.next();
// TODO
}
1.4 子接口
1.4.1 List接口
List从Collection接口中分立出来是因为List的特点——有序的集合。这里指的有 序并不是按照大小排好序的(Sorted),而是指集合是可以以确定的顺序访问的序列。针对List的这个特点,它比Collection接口增加了通过 索引进行操作的方法。例如,add、remove、get、set等方法的参数表中都可以加入索引的数值,从而操作处在索引位置处的元素。
1.4.2 Set 接口
Set与List的不同,它里面的元素是无序的;所以,不能通过任何索引的方法来操作Set对象
1.4.3 ListIterator 接口
使用与List的迭代器,比Iterator接口增加了一些方法(例如add()等)。此外,由于List是双向表,所以还增加了 Object previous()和boolean hasPrevious()方法,用法与next()和hasNext()一样。
1.4.4 SortedMap 接口
包含如下基本方法:
Comparator comparator()
Object firstKey()
Object lastKey()
2. 抽象容器类
2.1 抽象容器类包括AbstractCollection,AbstractList,AbstractSet等等
2.2 为 什么要有抽象结合类?
例如Collection接口中定义了许多有用的方法,如果实现Collection接口的每个类都自行实现这么多的方法, 那将是非常麻烦的。为了使实现Collection接口的类的实现更容易,AbstractCollection类让一些基本方法(比如add()和 iterator())变成了抽象的方法,而利用这些基本方法的其他方法(例如addAll()等等)则具体实现了。
3. 具体的容器
3.1 ArrayList 与LinkedList
都是实现了List接口的类,是有序集。List接口支持通过索引的方法来访问元素,对于这一点,ArrayList没有 任何问题;但是对于LinkedList则有很大的问题,链表本身不应该支持随机存储,但是作为List的一个实现,链表也提供了对随机访问的支持,但是 效率很低。每次通过索引的方法都是进行一次遍历。我认为,其实就不应该让链表支持随机访问;而Java这样实现我想是因为整个集合框架的体系,使得链表与 数组可以使用同样的方法使用。综上所述,对于LinkedList最好不使用随机访问,而使用迭代器。
3.2 TreeSet
3.2.1 TreeSet 是SortedSet的一个实现。
根据数据结构的知识可以知道,树的效率非常高,而且Java标准库中有TreeSet这样的类,以后应该尽量使用 TreeSet来提高程序的效率。
3.2.2 需要注意的是:TreeSet作为有序集,它通过compareTo或者Comparator来将 集合元素排序。
任何具有相同比较值的元素(无论它们是否equals()),在TreeSet中都作为同一个元素,从而不能有重复。这样以来,即使是不同 的对象也不能加入到集合中,这一点有时候很不方便。我在编写A*算法时,不同状态有时候对应着同一个启发函数值,那么这些不同的状态就无法加入到 TreeSet中。
3.3 HashSet
3.3.1 HashSet是非常高效的数据结构
与TreeSet不同,HashSet是比 较对象的equals()方法来区分不同的对象。这样只有真正不同的对象才能不被重复的加入到集合中。
3.3.2 需要注意的是
HashSet 效率非常高,但是对象的hashCode函数不好确定。一般默认的对象的hashCode函数是根据对象的内存地址得到的。好的hashCode函数是 HashSet成功运用的关键。
分享到:
相关推荐
对于java中集合框架的详细解释说明,对于java开发中集合这一块不太清楚的适合学习
Java集合框架是Java编程语言中一个非常重要的组成部分,它为开发者提供了存储和管理对象的统一方式。这个框架包括了一系列接口、抽象类以及实现类,帮助程序员处理各种数据结构,如列表、集合、映射等。 首先,我们...
Java集合框架中的容器主要包括Collection、List、Set和Map四个主要接口。 1.1.2 **容器的分类** - **Collection**:是最基本的接口,所有单值容器的基类,如List和Set都继承自Collection。 - **List**:有序的...
6.java集合框架.zip6.java集合框架.zip6.java集合框架.zip6.java集合框架.zip6.java集合框架.zip6.java集合框架.zip6.java集合框架.zip6.java集合框架.zip6.java集合框架.zip6.java集合框架.zip6.java集合框架.zip6....
5. **Iterator**: 集合框架中的迭代器接口,用于遍历集合中的元素,提供了`next()`和`remove()`等方法。使用迭代器可以避免`ConcurrentModificationException`。 6. **Collections**: 这是一个包含各种集合操作的...
xmind格式的Java集合框架学习导图,包括Collection接口/Map接口以及具体实现类。 同样包含大厂面试题,也在导图中有所体现。 能学到什么: 更加成体系的知识框架,更加全面的、系统的知识。 思维导图: 思维导图具有...
在Java集合框架中,主要有六种核心接口:`Collection`, `Set`, `List`, `Queue`, `Deque`, 和 `Map`。此外,还有五个抽象类以及多个实现类,它们共同构成了Java集合框架的基础。 #### 二、核心接口介绍 1. **`...
7. **多态**:Java集合框架中的多态性体现在,所有实现了同一接口的类都可以被视为接口类型,这使得我们可以在不关心具体实现的情况下编写通用代码。例如,`List<?> list = new ArrayList(); list.add(new Integer(1...
Java集合框架是Java编程中不可或缺的一部分。通过理解这些接口和类的特性及其相互间的关系,可以更高效地编写出健壮的应用程序。同时,合理利用抽象类和迭代器等工具能够进一步提高代码的质量和可维护性。
JAVA学习 Java集合框架.ppt
集合是将多个元素组成一个单元的...Java集合框架,为我们提供了一套性能优良、使用方便的接口和类,我们不必再重新发明轮子,只需学会如何使用它们,就可以处理实际应用中出现的问题了Java集合框架位于java.util包中
面渣逆袭 Java 集合框架篇.pdf面渣逆袭 Java 集合框架篇.pdf面渣逆袭 Java 集合框架篇.pdf面渣逆袭 Java 集合框架篇.pdf面渣逆袭 Java 集合框架篇.pdf面渣逆袭 Java 集合框架篇.pdf面渣逆袭 Java 集合框架篇.pdf面渣...
在集合框架中,枚举可用于创建固定大小的集合,如EnumSet和EnumMap。EnumSet是高效且类型安全的集合,适用于存储枚举类型;EnumMap则以枚举类型为键,提供快速访问和操作。 在PPT详解中,可能会详细讲述以下内容: ...
在集合框架中,还有其他关键接口和类,例如`Iterator`用于遍历集合,`Comparator`用于自定义排序规则,以及`EnumSet`和`EnumMap`针对枚举类型的优化集合实现。`Collections`和`Arrays`工具类提供了许多静态方法,...
JAVA常用集合框架讲解JAVA常用集合框架讲解JAVA常用集合框架讲解JAVA常用集合框架讲解JAVA常用集合框架讲解JAVA常用集合框架讲解JAVA常用集合框架讲解JAVA常用集合框架讲解JAVA常用集合框架讲解JAVA常用集合框架讲解
一个扑克游戏,用于Java集合框架练习一个扑克游戏,用于Java集合框架练习 一个扑克游戏,用于Java集合框架练习一个扑克游戏,用于Java集合框架练习 一个扑克游戏,用于Java集合框架练习一个扑克游戏,用于Java集合...
这篇学习笔记将深入探讨Java集合框架的基础概念、主要类库以及常见应用场景。 首先,Java集合框架分为两种基本类型:List(列表)和Set(集)。List接口代表有序的集合,允许重复元素,如ArrayList和LinkedList;而...