集合框架+预备知识
集合框架
Java 集合框架 Java Collection Framework ,又被称为容器 container ,是定义在 java.util 包下的一组接口 interfaces 和其实现类 classes 。
- Collection :用来存储管理一组对象 objects ,这些对象一般被成为元素 elements
- Set : 元素不能重复,背后隐含着查找/搜索的语义
- SortedSet : 一组有序的不能重复的元素
- List : 线性结构
- Queue : 队列
- Deque : 双端队列
- Set : 元素不能重复,背后隐含着查找/搜索的语义
- Map : 键值对 Key-Value-Pair ,背后隐含着查找/搜索的语义
- SortedMap : 一组有序的键值对
集合的背后都是数据结构,描述和组织数据的方式不一样,造就了有这么多数据结构,也就有这么多集合。
集合的意义:
- 使用成熟的集合框架,有助于我们便捷、快速的写出高效、稳定的代码
- 学习背后的数据结构知识,有助于我们理解各个集合的优缺点及使用场景
使用集合的工具类:
Collection 常用方法说明
每次存储单个数据
方法签名 | 说明 |
---|---|
boolean add(E e) | 将元素 e 放入集合中 |
void clear() | 删除集合中的所有元素 |
boolean isEmpty() | 判断集合是否没有任何元素,俗称空集合 |
boolean remove(Object e) | 如果元素 e 出现在集合中,删除其中一个 |
int size() | 返回集合中的元素个数 |
Object[] toArray() | 返回一个装有所有集合中元素的数组 |
示例:
在这里插入代码片
Map 常用方法说明
每次存储键值对,<k,v>
方法签名 | 说明 |
---|---|
V get(Object k) | 根据指定的 k 查找对应的 v |
V getOrDefault(Object k, V defaultValue) | 根据指定的 k 查找对应的 v,没有找到用默认值代替 |
V put(K key, V value) | 将指定的 k-v 放入 Map |
boolean containsKey(Object key) | 判断是否包含 key |
boolean containsValue(Object value) | 判断是否包含 value |
Set<Map.Entry<K, V>> entrySet() | 将所有键值对返回 |
boolean isEmpty() | 判断是否为空 |
int size() | 返回键值对的数量 |
map存储数据方式:
map存放数据的顺序不一定就是打印的顺序,因为在往map存储元素的时候,不是按照顺序来存储,它有自己的方式取存储,这个方式就是使用哈希函数进行映射。
泛型的引入
先来看个例子
class MyArrayList {
public Object[] elem;
public int usedsize;
public MyArrayList() {
this.elem = new Object[10];
}
public void add(Object data) {
this.elem[this.usedsize] = data;
this.usedsize++;
}
public Object get(int pos) {
return this.elem[pos];
}
}
public class Work1 {
public static void main(String[] args) {
MyArrayList arr = new MyArrayList();
arr.add(1);
arr.add(16.5);
arr.add("hello");
String str = (String)arr.get(2);
System.out.println(str);
}
}
我们可以看到如果我们把这个顺序表存储的数据设置为Object类,那么这个顺序表就可以存储各个类型的数据,这样对于我们程序是过于强大了,这时我们就可以用泛型来限制顺序表中可以存储的数据类型,从而达到我们只想往数组中存放某一数据类型的目的。
class MyArrayList <T> {
public T[] elem;
public int usedsize;
public MyArrayList() {
this.elem = (T[])new Object[10];
}
public void add(T data) {
this.elem[this.usedsize] = data;
this.usedsize++;
}
public T get(int pos) {
return this.elem[pos];
}
}
public class Work1 {
public static void main(String[] args) {
MyArrayList<String> arr1 = new MyArrayList<>(); //这时顺序表中只能放String类型数据
arr1.add(1); //错误,类型不匹配
arr1.add(16.5); //错误,类型不匹配
arr1.add("hello"); //正确,字符串型数据
MyArrayList<Integer> arr2 = new MyArrayList<>(); //整型
MyArrayList<Float> arr3 = new MyArrayList<>(); //浮点型
}
}
注意事项:
- 代表占位符,表示当前这个类是一个泛型类
- 简单类型不能作为泛型类型的参数,需要用到包装类
ArrayList<int> arr = new ArrayList<>(); //错误
ArrayList<Integer> arr = new ArrayList<>(); //正确
- 不能new泛型类型的数组
this.elem = new T[10];
- 泛型只存在于编译时期,在程序运行的时候就没有了泛型的概念
泛型的意义:
- 自动进行类型的检查
- 自动进行类型转换
泛型的擦除机制:
泛型在编译的时候,并不会进行指定类型的替换,而是拿着指定的类型进行检查
也就是说,在编译的时候,拿着指定的类型进行类型检查
编译的时候,会进行类型擦除,编译会把泛型擦除为Object类,而不是替换。
包装类
基本数据类型和包装类的对应关系
装箱:
int a = 10;
Integer integer1 = new Integer(a); //显示的装包
System.out.println(integer1);
Integer integer2 = Integer.valueOf(a); //显示装包
System.out.println(integer2);
Integer integer3 = a; //自动装包,其实也调用了Integer.valueOf()
拆箱:
Integer i = 10;
int a1 = i; //自动拆箱
System.out.println(a1);
int a2 = i.intValue(); //显示拆箱
System.out.println(a2);
double d = i.doubleValue();
System.out.println(d);