Java 学习之集合
这章很重要的哦
Java 集合框架概述
- 为了方便对多个对象的操作,就需要对对象进行存储
- 且使用 Array 存储对象方面存在一定弊端。而 Java 集合就像一种容器,可以动态地把多个对象的引用放入容器
- 数组在内存存储方面的特点:
- 数组初始化以后,长度就确定了;
- 数组声明的类型,就决定了进行元素初始化时的类型。
- 数组在存储数据方面的弊端:
- 数组初始化以后,长度就不可变了,不便于扩展;
- 数组中提供的属性和方法少,不便于进行添加、删除、插入等操作,且效率不高。同时无法直接获取存储元素的个数;
- 数组存储的数据是有序的、可以重复的。—-> 存储数据的特点单一
Java 集合可分为 Collection 和 Map 两种体系:
- Collection 接口:单列数据,定义了存取一组对象的方法的集合
- List: 元素有序、可重复的集合
- Set: 元素无序、不可重复的集合
- Map 接口:双列数据,保存具有映射关系 “key-value 对” 的集合
Java 集合框架概述:
|
|
Collection 接口
单列数据,定义了存取一组对象的方法的集合
Collection 接口的方法
|
|
lterator 迭代器接口
- lteralor 对象称为迭代器 (设计模式的一种),主要用于遍历 Collection 集合中的元素。
- GOF 给迭代器模式的定义为:提供一种方法访问一个容器 (container) 对象中各个元素,而又不需暴露该对象的内部细节。迭代器模式,就是为容器而生。类似于 “公交车上的售票员”、“火车上的乘务员”、“空姐”。
- Collection 接口继承了
java.lang.lterable
接口,该接口有一个iterator()
方法,那么所有实现了 Collection 接口的集合类都有一个 iterator () 方法,用以返回一个实现了 lterator 接口的对象。 - Iterator 仅用于遍历集合,lterator 木身并不提供承装对象的能力。如果需要创建 lterator 对象,则必须有一个被迭代的集合。
- 集合对象每次调用 iterator () 方法都得到一个全新的迭代器对象,默认游标都在集合的第一个元素之前。
Iterator 迭代器接口 remove () 方法
|
|
Note:
-
lterator 可以删除集合的元素,但是是遍历过程中通过迭代器对象的 remove 方法,不是集合对象的 remove 方法。
-
如果还未调用 next) 或在上一次调用 next 方法之后已经调用了 remove 方法,再调用 remove 都会报 llegalStateException。
|
|
foreach 循环遍历集合和数组元素
|
|
Collection 子接口一: List (重点)
元素有序、可重复的集合
看做 "动态数组",以后可以用这个来代替数组啦~
List 接口概述:
- 鉴于 Java 中数组用来存储数据的局限性,我们通常使用 List 替代数组
- List 集合类中元素有序、且可重复,集合中的每个元素都有其对应的顺序索引。
- List 容器中的元素都对应一个整数型的序号记载其在容器中的位置,可以根据序号存取容器中的元素。
- JDK API 中 List 接口的实现类常用的有: ArrayList、LinkedList 和 Vector。
源码分析 (自己看)
List 接口常用方法:
除去 Collection 这种的 15 个,还有下面几个
|
|
如下:
|
|
面试题:
区分 list 中 remove () 方法
|
|
Collection 子接口二:Set
元素无序、不可重复的集合
类似高中讲的 "集合": 无序性、确定性、互异性
Set 接口概述:
- Set 接口是 Collection 的子接口,set 接口没有提供额外的方法
- Set 集合不允许包含相同的元素,如果试把两个相同的元素加入同一个 Set 集合中,则添加操作失败。
- Set 判断两个对象是否相同不是使用 == 运算符,而是根据 equals () 方法
Set 实现类之一: Hashset
-
HashSet 是 Set 接口的典型实现,大多数时候使用 Set 集合时都使用这个实现类;
-
HashSet 按 Hash 算法来存储集合中的元素,因此具有很好的存取、查找、删除性能。
-
HashSet 具有以下特点:
-
不能保证元素的排列顺序
-
HashSet 不是线程安全的
-
集合元素可以是 null
-
HashSet 集合判断两个元素相等的标准: 两个对象通过 hashCode () 方法比较相等,并且两个对象的 equals () 方法返回值也相等。
-
对于存放在 Set 容器中的对象,对应的类一定要重写 equals () 和 hashCode (Objectobj) 方法,以实现对象相等规则。即:“相等的对象必须具有相等的散列码”。
重写 hashCode () 方法的基本原则:
- 在程序运行时,同一个对象多次调用 hashCode () 方法应该返回相同的值。
- 当两个对象的 equals () 方法比较返回 true 时,这两个对象的 hashCode () 方法的返回值也应相等。
- 对象中用作 equals () 方法比较的 Field,都应该用来计算 hashCode 值。
**Set 实现类之二: LinkedkashSet: **
- LinkedHashSet 是 HashSet 的子类
- LinkedHashSet 根据元素的 hashCode 值来决定元素的存储位置,但它同时使用双向链表维护元素的次序,这使得元素看起来是以插入顺序保存的。
- LinkedHashSet 插入性能略低于 HashSet,但在迭代访问 Set 里的全部元素时有很好的性能。
- LinkedHashSet 不允许集合元素重复。
**Set 实现类之三:TreeSet: **
-
TreeSet 是 SortedSet 接口的实现类,TreeSet 可以确保集合元素处于排序状态。
-
TreeSet 底层使用红黑树结构存储数据
-
TreeSet 两种排序方法: 自然排序和定制排序。默认情况下,TreeSet 采用自然排序。
-
新增的方法如下:(了解)
1 2 3 4 5 6 7 8
Comparator comparator() Object first() Object last() Object lower(Object e) Object higher(Object e) SortedSet subSet(fromElement, toElement) SortedSet headSet(toElement) SortedSet tailSet(fromElement)
代码如下:
|
|
|
|
练习 1:
HashSet 可以用来去重
HashSet 先 HashCode 再 equals ()
Map 接口 (重点)
双列数据,保存具有映射关系的 "key-value" 对的集合
类似高中函数: y = f (x),不同 key 可以指向相同的 value
Map 接口继承树:
Map 结构的理解:
常见面试题:
|
|
HashMap 源码中重要常量:
Map 中常用的方法:
|
|
Map 实现类之四: Hashtable
- Hashtable 是个古老的 Map 实现类,JDK1.0 就提供了。不同于 HashMap,Hashtable 是线程安全的。
- Hashtable 实现原理和 lHashMap 相同,功能相同。底层都使用哈希表结构,查询速度快,很多情况下可以互用。
- 与 HashMap 不同,Hashtable 不允许使用 null 作为 key 和 l value
- 与 HashMap 一样,Hashtable 也不能保证其中 Key-Value 对的顺序
- Hashtable 判断两个 key 相等、两个 value 相等的标准,与 HashMap 一致。
Map 实现类之五:Properties
- Properties 类是 Hashtable 的子类,该对象用于处理属性文件
- 由于属性文件里的 key、value 都是字符串类型,所以 Properties 里的 key 和 l value 都是字符串类型
- 存取数据时,建议使用
setProperty(String key,String value)
方法和getProperty(String key)
方法
|
|
Collections 工具类
- Collections 是一个操作 Set、list 和 lMap 等集合的工具类
- Collections 中提供了一系列静态的方法对集合元素进行排序、查询和修改等操作,还提供了对集合对象设置不可变、对集合对象实现同步控制等方法
- 排序操作:(均为 static 方法)
|
|
Collections 常用方法 查找、替换
|
|
|
|