集合(Collection / Map) - 一:
Collection
Java 集合继承图
![Java集合继承图.jpg](https://img.haomeiwen.com/i14215857/12709e2df837f10b.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
Collection 继承 → Iterable 有 iterator() 方法
顾 凡是继承Collection的 都会有 iterator() 方法
iterator():
1. hasNext()
2. next()
3. remove()
Collection(接口)
1. List(接口) 继承 Collection
a. ArrayList(实现类)
b. LinkedList(实现类)
c. Vector(实现类)
2. Set(接口) 继承 Collection
a. HashSet(类)
b. SortedSet(接口)
1. TreeSet(实现类)
Collection 特点:
1. 只能存储引用类型, 并且只能单个存储数据(一个一个存)
存 1, 2, 3 不报错是因为 自动装箱 转成了 包装类
类比数组:
定义:
存放同一类型, 在存储空间中连续的一系列数据
数组寻址公式:
改数据地址 = 数组首数据地址 + 索引 * 该类型的字节数
为什么数组的索引是从 0 开始的?
因为如果从 1 开始 或者其他开始, 就会多运算后面的 乘法, 如果是 0 的话
效率高:
查询
效率低:
添加删除
List
特点:
1. 有序
2. 可重复
3. 单个存储
4. 存引用类型
原因: 由于继承了Collection 所以特点也包括 Collection特点
ArrayList
底层数据结构:
数组, 顾适合 查询
特点:
1. 适合 查询
2. 不适合 增删
原因: 底层采用数组存储元素的 而数组底层是有规律的顺序的存储的.
LinkedList
底层数据结构:
双向链表, 顾适合频繁增删, 不适合查询
特点:
1. 合适 增删
2. 不适合 查询
Vector
底层数据结构:
数组, 也只适合查询
特点:
1. 适合多线程, 因为是线程安全的
2. 效率不高
一般情况不会使用集合自带的安全机制, Vector 效率不高, 现在用的比较少
Set
特点:
1. 无序
2. 不可重复
HashSet
底层数据结构:
哈希散列表
SortedSet(接口)
底层数据结构
特点:
1. 无序
2. 不可重复
3. 排序 → 根据大小
原因:
实现类:
TreeMap
TreeMap特点:
1. key 就是 一个 TreeSet
Map
Map(接口):
1. SortedMap(接口)
2. HashMap(实现类)
a. LinkedMap
3. Hashtable(实现类) → 线程安全, 效率不高, 用的少
4. ConcurrentHashMap(实现类) → 并发编程
特点:
键值对
HashMap ❈
特点:
1. 无序
2. key 不可重复, 类似于 Set 的不可重复
Hashtable
Hashtable 本身用的不多, 但是他的子类 Properties 用的多, 用于配置文件.
Properties 特点:
1. key 和 value存储
2. 存储类型只能是 字符串
Hashtable
特点:
1. 无序
2. 不可重复
3. 排序 → 按照 key 大小排序, 类似于 SortedSet
UML
继承 → 空心箭头
实现 → 虚线空心
扩展
单向链表:
单向链表:
每个元素都称作结点 Entry(JDK 1.5) / Node(JDK 1.8)
特点:
1. 单项链表每个结点字内存中的存储空间没有规律
问题:
1. 为什么单项链表查询效率低?
答: 因为单项链表在内存中存储的空间上面是没有规律的, 也没有顺序, 如果我们想要获得到摸个元素, 要从头开始往后遍历, 找到为止
2. 为什么单向链表增删效率高?
答: 因为单项链表在内存中存储的空间上面没有规律, 删除或者随机增加元素, 只要让指针重新指向即可, 不要将后面元素位移.
双向链表:
头部内存地址 是上一个元素的内存地址, 尾部的内存地址是下一个元素的内存地址
import java.util.ArrayList;
import java.util.Collection;
/**
* description: 集合的基本操作
*
* @author Lomonkey
* @date 2019/2/22
*/
/**
* add() 添加元素
* clear() 清空集合
* contains() 判断元素是否存在
* isEmpty() 判断是否为空, 为空 返回 true
* iterator() 创建迭代器
* remove() 删除元素
* retainAll() 交集
* size() 集合长度
* toArray() 转换成数组
*
* */
public class ConnectionTest1 {
public static void main(String[] args) {
// 创建一个 集合
// 父类型引用 指向子类对象 → 多态
Collection collection = new ArrayList();
// 添加元素 → 只能添加引用类型
collection.add(123321);
collection.add("的说法");
collection.add(true);
// 泛型集合
Collection<String> collection1 = new ArrayList<String>();
// 只能添加 String 类型
collection1.add("大家好!");
collection1.add("你们好!");
/*
* 在编译阶段, 对代码进行检查
* */
// 能直接打印出 → 大家好!
System.out.println(collection1);
// collection1 指向的是 ArrayList集合的对象
// 调用 println() 方法的时候, 把 collection1 的变量值, 即ArrayList的对象的引用
// 判断非空
System.out.println(collection1.isEmpty());
// 长度
System.out.println(collection1.size());
// 判断元素是否存在
System.out.println(collection1.contains("da"));
// 删除元素
collection1.remove("大家好");
System.out.println(collection1);
// 转化成数组
Object[] arr = collection1.toArray();
for(Object o : arr){
System.out.print(o);
}
}
}
作业:
java 来模拟单链表
public class Linked{
// 结点
Entry entry;
// 构造
Linked(){
entry = new Entry(null, null);
}
// 元素的添加 → add
// 元素的删除 → remove
// 元素的查找 → find
// 元素
// 内部类 几点
static class Entry{
Object data;
Entry next;
Entry(Object data, Entry next){
this.data = data;
this.next = next;
}
}
}
网友评论