一、 集合:集合是一个用于管理其他多个对象的对象
1、Collection 接口:集合中每一个元素为一个对象,这个接口将这些对象组织在一起,形成一维结构。
2、List 接口:描述了线性表结构,就是集合元素有先后次序,元素有序号,元素允许重复。
3、Set 接口:是数学中集合的概念:其元素无序,且不可重复。(正好与List 对应)
4、SortedSet 接口 :会按照数字将元素排列,为“可排序集合”。
5、Map 接口 :接口中每一个元素不是一个对象,而是一个键对象和值对象组成的键值对(Key-Value)。 经常用于数据的快速查找的算法。
6、SortedMap 接口:如果一个Map 可以根据key 值排序,则称其为SortedMap。
注意:在“集合框架”中,Map 和Collection 没有任何亲 缘关系。
•Map 的典型应用是访问按关键字存储的值。它支持一系列集合操作的全部,但操作的是键-值对,而不是单个独立的元素。因此Map 需要支持get() 和put() 的基本操作,而Set 不需要。
•返回Map 对象的Set 视图的方法:
Set set = aMap.keySet()
《常用集合列表》
List Set SortedSet Map SortedMap
存放元素 Object Object Object Object(key)—Object(value) Object(key)—Object(value)
存放顺序 有序 无序 无序 Key 无序 无序,有排序
元素可否重复 可 不可 不可 Key 不可,value 可 Key 不可,value 可
遍历方式 迭代 迭代 迭代 对Key 迭代 对 Key 迭代
排序方式 Collections.sort() SortedSet 已排序 SortedMap 已对键值排序
各自实现类 ArrayList LinkedList HashSet TreeSet HashMap TreeMap
注:以上有序的意思是指输出的顺序与输入元素的顺序一致,HashSet、HashMap 通过hashCode(),equals()来判断重复元素
在java 中指定排序规则的方式只有两种:1、实现java.util 包下的Comparator 接口 2、实现java.lang 包下的 Comparable 接口
四、 ArrayList 和LinkedList 集合
1、ArrayList 底层是object变长数组,变长增加:50%。所以ArrayList 具有数组的查询速度快的优点以及增删速度慢(增删时涉及移位)的缺点。 线程不安全。
Vector 底层实现也是数组,变长增加:100%。但他是一个线程安全的重量级组件,故比ArrayList稍慢。
2、而在LinkedList 的底层是一种双向循环链表。在此链表上每一个数据节点都由三部分组成:前指针(指向前面的节点的位置), 数据,后指针(指向后面的节点的位置)。最后一个节点的后指针指向第一个节点的前指针,形成一个循环。 线程不安全。
3、双向循环链表的查询效率低但是增删效率高。所以LinkedList 有查询效率低但增删效率高的特点。
4、ArrayList 和LinkedList 在用法上没有区别,但是在功能上还是有区别的。
LinkedList 经常用在增删操作较多而查询操作很少的情况下:队列和堆栈。
队列:先进先出的数据结构。
堆栈:后进先出的数据结构。
(堆栈就是一种只有增删没有查询的数据结构)
注意:使用堆栈的时候一定不能提供方法让不是最后一个元素的元素获得出栈的机会。
LinkedList 提供以下方法:(ArrayList 无此类方法)
addFirst();
removeFirst();
addLast();
removeLast();
在堆栈中,push 为入栈操作,pop 为出栈操作。Push 用addFirst();pop 用removeFirst(),实现后进先出。 用isEmpty()--其父类的方法,来判断栈是否为空。
在队列中,put 为入队列操作,get 为出队列操作。 Put 用addFirst(),get 用removeLast()实现队列。
List 接口的实现类(Vector )(与ArrayList 相似,区别是Vector 是重量级的组件,使用使消耗的资源比较多。)
结论:在考虑并发的情况下用Vector (保证线程的安全)。 在不考虑并发的情况下用ArrayList (不能保证线程的安全)。
5、面试经验(知识点):
java.util.stack (stack 即为堆栈)的父类为Vector 。可是stack 的父类是最不应该为Vector 的。因为Vector的底层是数组,且Vector 有get 方法(意味着它可能访问到并不属于最后一个位置元素的其他元素,很不安全)。
对于堆栈和队列只能用push 类和get 类。
Stack 类以后不要轻易使用。
!!!实现堆栈一定要用LinkedList。
(在JAVA1.5 中,collection 有queue 来实现队列。)
二、 HashSet 集合
1.、HashSet 是无序的,允许存null,没有下标这个概念。HashSet 集合中元素不可重复(元素的内容不可重复);
2、HashSet 底层采用散列表实现。
3、HashSet 如何保证元素不重复?--Hash 算法和equals 方法。
当向数组中利用add(Object o)添加对象的时候,系统先找对象的hashCode:
int hc=o.hashCode(); //返回的hashCode 为整数值。
Int I=hc%n; //(n为数组的长度),取得余数后,利用余数向数组中相应的位置添加数据,以n 为6 为例,
如果I=0 则放在数组a[0]位置,如果I=1,则放在数组a[1]位置。如果equals()返回的值为true,则说明数据重复。如果equals()返回的值为false,则再找其他的位置进行比较。这样的机制就导致两个相同的对象有可能重复地添加到数组中,因为他们的hashCode不同。如果我们能够使两个相同的对象具有相同hashcode,才能在equals()返回为真。
结论:如将自定义类用hashSet 来添加对象,一定要覆盖hashcode()和equals(),覆盖的原则是保证当两个对象hashcode返回相同的整数,而且equals()返回值为True。 如果偷懒,没有设定equals(),就会造成返回hashCode 虽然结果相同,但在程序执行的过程中会多次地调用equals(),从而影响程序执行的效率。
我们要保证相同对象的返回的hashCode 一定相同,也要保证不相同的对象的hashCode尽可能不同 (因为数组的边界性,hashCode 还是可能相同的)。例子:
public int hashCode(){
return name.hashcode()+age;
}
三、 TreeSet 集合
1、 TreeSet 是 SortedSet 的实现类TreeSet 通过实现 Comparable 接口来实现元素不重复。底层采用二叉排序树实现。
2、 TreeSet 由于每次插入元素时都会进行一次排序,因此效率不高。
3、 从集合中以有序的方式抽取元素时,可用TreeSet,添加到TreeSet 的元素必须是可排序的。“集合框架”添加对Comparable 元素的支持。一般说来,先把元素添加到HashSet,再把集合转换为TreeSet 来进行有序遍历会更快。
四、 HashMap 集合
1. HashMap 就是用hash 算法来实现的Map
2. 在实际开发中一般不会用自定义的类型作为Map 的 Key。做Key 的无非是八种封装类。
3. HashMap 的三组操作:
【1】改变操作允许您从映射中添加和除去键-值对。键和值都可以为null。但是,您不能把Map 作为一个键或值添加给自身。
–Object put(Object key, Object value)
–Object remove(Object key)
–void clear()
【2】查询操作允许您检查映射内容:
-Object get(Object key)
–intsize()
–boolean isEmpty()
【3】最后一组方法允许您把键或值的组作为集合来处理。
–public Set KeySet();
–public Collection values()
4、 HashMap 和HashTable 的区别等同于ArrayList 和Vector的区别。只不过HashTable 中的Key 和Value 不能为空,而HashMap 可以。
5、 HashMap 底层也是用数组,HashSet 底层实际上也是HashMap,HashSet 类中有HashMap 属性,HashSet 实际上为(key.null)类型的HashMap。有key 值而没有value 值。
五、HashMap 类和TreeMap 类
•集合框架提供两种常规Map 实现:HashMap和TreeMap。
•在Map 中插入、删除和定位元素,HashMap 是最好选择。
•如果要按顺序遍历键,那么TreeMap 会更好。
•根据集合大小,先把元素添加到HashMap,再把这种映射转换成一个用于有序键遍历的TreeMap 可能更快。
•使用HashMap 要求添加的键类明确定义了hashCode() 实现。
•有了TreeMap 实现,添加到映射的元素一定是可排序的
•HashMap 和TreeMap 都实现 Cloneable 接口。
相关推荐
JAVA常用集合框架讲解JAVA常用集合框架讲解JAVA常用集合框架讲解JAVA常用集合框架讲解JAVA常用集合框架讲解JAVA常用集合框架讲解JAVA常用集合框架讲解JAVA常用集合框架讲解JAVA常用集合框架讲解JAVA常用集合框架讲解
java常用集合框架.pdf
- **迭代器遍历**:Java中的迭代器(Iterator)设计模式用于遍历集合,它能确保元素的正确遍历,即使在遍历过程中修改集合,只要不违反并发修改原则,也能正常工作。 - **增强型for循环(foreach)遍历**:Java 5...
本篇将详细阐述Java常用的集合框架,包括Map、Set和List接口,以及它们的主要实现类,如HashMap、HashSet、ArrayList、LinkedList和Vector。 1. **Map接口**: Map接口是Java集合框架中用于存储键值对的接口,不...
在Java中,集合框架始于`java.util`包,包含了多种接口和实现类,用于存储和操作对象。 1.1.1 **容器简介** 容器是用来存储一组对象的结构,可以是数组、链表或者其他复杂的数据结构。Java集合框架中的容器主要...
Java 集合框架中常用的接口有: * Collection:顶层接口,定义了集合的抽象数据类型。 * List:继承自 Collection 接口,定义了一个有序的集合。 * Set:继承自 Collection 接口,定义了一个无序的集合。 * Map:...
Java集合框架是Java编程语言中一个至关重要的组成部分,它为数据存储和操作提供了丰富的类库。泛型是Java 5引入的一项创新特性,极大地增强了集合框架的安全性和效率。本讲解将深入探讨这两个主题,以及与之相关的...
能学到什么:在学习Java的朋友,可以从本文教程中学习到Java中最常用的集合框架,HashMap,ArrayList,HashSet等,同时又基于代码有一定层次的原理解释,让大家知其然,知其所以然,而又不会有太高的学习门槛。...
Java集合框架是Java编程语言中的一个核心部分,它为数据结构和对象的存储、管理和操作提供了统一的接口和实现。这个框架包括了多种类型的集合,如List、Set、Queue和Map,以及它们的各种实现类,如ArrayList、...
Java集合框架是Java编程语言中一个非常重要的...总的来说,Java集合框架通过其丰富的接口和实现,使得在Java中处理和管理对象变得更加灵活和高效。理解并熟练使用这些集合类和接口,对于编写高质量的Java代码至关重要。
根据提供的文档内容,文件是关于Java集合框架的面试题知识点总结。以下是Java集合框架的知识点详述: Java集合框架主要包括Collection接口和Map接口两大分支。Collection接口主要包括List、Set以及Queue三个子接口...
在Java中,集合框架主要由两个顶级接口构成:`Collection`和`Map`。`Collection`接口是所有单值容器的父接口,包括了`List`、`Set`和`Queue`等子接口。`Map`接口则代表键值对的容器,如`HashMap`、`TreeMap`等。 1....
在Java中,集合框架是实现这一概念的标准化结构,它包括接口、接口的实现和算法。接口定义了集合的行为,比如添加、删除和查询元素;实现则是接口的具体类,它们提供了实际的数据结构,如链表、数组或树;算法是一...
Java集合框架是Java编程语言中的一个核心组件,它为存储、管理和操作对象提供了一套统一的接口和类。集合框架使得开发者可以更加高效地处理数据,而无需关注底层的实现细节。本文将深入探讨Java集合框架的主要组成...
### Java 2 集合框架详解 #### 一、Java 2 集合框架概览 Java 2 集合框架是Java标准库的一部分,它为开发者提供了多种多样的容器,使得管理和操作对象变得更为高效和简单。整个框架主要由三部分构成:集合接口、...
在压缩包中的"chapter12.html"文件,很可能是书中第十二章的内容,这一章可能详细讲解了某种特定的数据结构或Java集合框架的高级话题,如树的遍历方法(前序、中序、后序),堆(优先队列)的概念及其在Java中的实现...
在Java编程中,集合框架是一个非常重要的概念,它提供了标准的方式来存储和操作数据集合。Java集合框架的设计原则是将数据结构抽象成一组接口,再通过不同的实现类来具体实现这些接口。这使得Java开发者能够专注于...