集合的理解和好处
![](https://img-blog.csdnimg.cn/4ecfe8f60b2d4f9ab574c8accc35aa7e.png)
集合的框架体系图
![](https://img-blog.csdnimg.cn/9a1b9ca2d2904b21b3a17e72035118e7.png)
集合主要分为两组:单列集合(Collection)和双列集合(Map)。单列指的是存放的是元素的值,双列指的是存放的元素是 key--value 形式的。
Collection 集合体系图
Map 集合体系图
![](https://img-blog.csdnimg.cn/4aa6fb91434f4b26a652ad39471abd7e.png)
Collection 接口及其常用方法
Collection 接口概述
Collection 接口(public interface Collection extends Iterable)实现类的特点:
Collection 的实现子类可以存放多个元素,每个元素可以是 Object (或 Object 的子类)(每个元素都是对象,比如往集合里添加 10,底层也会包装成 new Integer(10); )有些 Collection 的实现类可以存放重复元素,有些不可以有些 Collection 的实现类是有序的(即存放和取出的顺序是一样的,如List),有些不是有序的(即存放和取出的顺序可能不一致,如 Set)Collection 接口没有直接的实现子类,而是通过 Collection 的子接口 Set 和List 来实现的
Collection 接口常用方法
![](https://img-blog.csdnimg.cn/581380336238470aac9be021fac530d3.png)
Collection 遍历的两种方式
1、迭代器
Iterable 接口中有一个抽象方法,该方法返回一个 Iterator 对象,方法定义如下:
Iterator iterator();
因为 Collection 实现了 Iterable 接口,所以实现了 Collection 接口的所有集合类都实现 iterator 这个抽象方法,即都可以返回一个 Iterator 对象
![](https://img-blog.csdnimg.cn/2cd5ab25ffd24a2b917a7a21a7f2e71c.png)
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.NoSuchElementException;
public class Test {
public static void main(String[] args) {
Collection c = new ArrayList();
c.add(10);
c.add(20);
c.add(30);
Iterator iterator = c.iterator();
// hasNext() 判断是否还有数据
// 在调用 iterator.next() 方法前必须调用 iterator.hasNext() 方法进行检测是否还有下一个元素
// 若不调用 iterator.hasNext(),且没有下一个元素
// 直接调用 iterator.next() 会抛出异常 NoSuchElementException
while(iterator.hasNext()) {
Object next = iterator.next();
System.out.println(next);
}
// 当退出 while 循环后,此时的 iterator 指向最后的元素
// 若是再调用 next 方法会抛出异常 NoSuchElementException
// iterator.next(); // 抛出异常
// 如果需要再次遍历,就重置 iterator
iterator = c.iterator();
}
}
2、增强 for
增强 for 的底层还是通过迭代器实现的。
![](https://img-blog.csdnimg.cn/99459959651f4605a195e9aa9255a4d6.png)
List 接口及其常用方法
List 接口基本介绍
![](https://img-blog.csdnimg.cn/0453f4e9f1dd49f5be9225c63d25a091.png)
List 接口的常用方法
List 的三种遍历方式
ArrayList 的底层结构和源码分析
transient 表示瞬间,短暂的,被该关键字修饰的属性将不会被序列化。
底层源码分析可通过 debug 看源码可知,参考视频: 视频链接![](https://img-blog.csdnimg.cn/275d6eb23e4e448a8e2585b5d7c3bd7b.png)
Vector 的底层结构和源码分析
当有多个线程操作集合时,使用 Vector ,因为它是线程安全(有关键字 synchronized 修饰)的,如果确定只有一个线程操作集合,则用 ArrayList 效率最高(ArrayList 不是线程安全的,没有关键字 synchronized 修饰)。
源码分析查看视频: 视频链接
![](https://img-blog.csdnimg.cn/2f11451b764d44f9978d78f0f497d1a8.png)
![](https://img-blog.csdnimg.cn/78732c14387a498d87aacda4d3390930.png)
LinkedList 的底层结构和源码分析
源码分析视频: 视频链接
![](https://img-blog.csdnimg.cn/52dee35cb29f4829930a9b005f5a722a.png)
![](https://img-blog.csdnimg.cn/b0c8a7743a8140fd99724d25bd02fb4f.png)
// 模拟一个简单的双向链表
public class Test {
public static void main(String[] args) {
// 创建三个元素节点
Node node1 = new Node("node1");
Node node2 = new Node("node2");
Node node3 = new Node("node3");
// 连接节点: node1 -> node2 -> node3
node1.next = node2;
node2.next = node3;
// 连接节点: node3 -> node2 -> node1
node3.pre = node2;
node2.pre = node1;
// 让头尾指针指向头尾节点
Node first = node1;
Node last = node3;
// 从头到尾遍历链表
while(true) {
if (first == null) {
break;
}
System.out.println(first);
first = first.next;
}
System.out.println("================");
// 从尾到头变脸链表
while(true) {
if(last == null){
break;
}
System.out.println(last);
last = last.pre;
}
}
}
class Node {
public Object item; // 存放数据区域
public Node pre; // 上一个节点
public Node next; // 下一个节点
public Node(Object item){
this.item = item;
}
@Override
public String toString() {
return "Node{" + "item=" + item + "}";
}
}
List 集合的选择
![](https://img-blog.csdnimg.cn/a456811c9ff24a498e961f2bb5ef214e.png)
Set 接口及其常用方法
![](https://img-blog.csdnimg.cn/b311f900e5cc4038adbb854fcc502b9d.png)
![](https://img-blog.csdnimg.cn/ba6e042e4c04450fbfd5a4e6a62424fa.png)
![](https://img-blog.csdnimg.cn/e42ef18f41564ac19d04cd0bde09c497.png)
Set 接口实现类 —— HashSet
源码分析视频: HashSet 源码分析![](https://img-blog.csdnimg.cn/b8c7448b12854332bf8ff417a1671df1.png)
![](https://img-blog.csdnimg.cn/fe49b576f9174975bdd304745106f27e.png)
![](https://img-blog.csdnimg.cn/7193bda2878e4e498f27943277bf9b16.png)
import java.util.HashSet;
public class Test {
public static void main(String[] args) {
HashSet set = new HashSet();
// add 方法会返回一个 boolean 值,添加成功返回 true ,否则返回 false
// HashSet 集合不能添加重复的元素/对象
System.out.println(set.add("lucy")); // 集合中没有 Lucy,添加成功
System.out.println(set.add("lucy")); // 和上面的 Lucy 重复,添加失败
System.out.println(set.add(new Dog("tom"))); // 添加了一个 tom 的 Dog 对象
System.out.println(set.add(new Dog("tom"))); // 和上面的的 Gog 对象不同,因为是 new 出来的,是一个新的对象,只是恰好重名
System.out.println(set);
// 经典面试题
/*
原因:底层源码在判断两个元素是否相同时,会首先判断哈希值是否相同
如果哈希值相同,在调用 equals 方法(该方法可以有程序员自定义重写)判断两个元素是否相同
如果都相同,就判断是同一个对象,不能加入 HashSet 集合
因为 String 重写了 equals 方法,所以下面内容判定为同一个元素,所以第二个加入 HashSet 集合失败
*/
System.out.println(set.add(new String("zs"))); // 加入成功
System.out.println(set.add(new String("zs"))); // 加入失败,具体原因看底层源码
}
}
class Dog{
private String name;
public Dog(String name){
this.name = name;
}
}
Set 接口实现类 —— LinkedHashSet
![](https://img-blog.csdnimg.cn/bb53f981e1d942f7a2e04ecc1089520a.png)
![](https://img-blog.csdnimg.cn/336c8965504940fa8c7cedf0705b103a.png)
Map 接口
视频链接: Map
![](https://img-blog.csdnimg.cn/ce19c52e598c484696f7dfa9bb8745cf.png) ![](https://img-blog.csdnimg.cn/d21c65342df24033b3bb00aa2439e19d.png)
![](https://img-blog.csdnimg.cn/ca3cf776c87c4f2885d96c0ddc287c6c.png)
![](https://img-blog.csdnimg.cn/dbbb5818e3734ea7bc39f1bba9bffbc4.png)
![](https://img-blog.csdnimg.cn/553f53c3b5cd4484b85a41c195fce3af.png)
![](https://img-blog.csdnimg.cn/90a9eecfbad0421cbcbb705a00c144d7.png)
Map 接口实现类 —— HashMap
上述的 Map 接口都是以 HashMap 为例进行讲解。
![](https://img-blog.csdnimg.cn/f908fded84ec4773bee01d0058f4c776.png)
![](https://img-blog.csdnimg.cn/77edaadaef8d414780b5d4ec7b9b8b7e.png)
Map 接口实现类 —— HashTable
![](https://img-blog.csdnimg.cn/e899cf60c1524cb4a57c14ddfd9afbac.png)
Map 接口实现类 —— Properties
Proterties 继承自 HashTable ,它的 key 和 value 都不允许为 null 。
![](https://img-blog.csdnimg.cn/7470558aaaee47f29136983f2771fef4.png)
如何选择对应的集合
TreeSet TreeMap 视频: treeset、treemap
TreeSet 的底层是由 TreeMap 实现的。
![](https://img-blog.csdnimg.cn/43f26913975e4d1895333900861161d3.png)
Collections 工具类
![](https://img-blog.csdnimg.cn/7d098f4f941a4ad692e11e27e5f204af.png)
![](https://img-blog.csdnimg.cn/ad7180bf6bd24ec6a0d06bf0d03c3c1e.png)
|