容器也叫集合collection,用来存放对象或基本类型数据,数组是一种容器,但是不够灵活强大,不满足管理组织数据的需求,例如容量可扩等。

容器的整体结构

image.png

接口间的区别


List Set
是否有序 有序 无序
是否可重复 可重复 不可重复

List

三个实现类的区别


ArrayList LinkedList Vector
底层实现 数组 双向链表 数组
查询效率
增删效率
线程安全 不安全 不安全 安全

相关方法

常用方法 Collection接口定义

  • add 增加元素
  • isEmpty 测试是否非空
  • size 返回长度
  • contains 是否包含
  • remove 移除(不等于删除,被移除元素仍存在内存中,不在list中而已)
  • toArray 转换成数组
  • clear 清空

    List独有方法 索引相关

  • add(index, element) 指定位置加元素

  • remove(index) 删除指定位置元素
  • set(index, element) 设置指定位置元素
  • get(index) 获取指定位置元素
  • indexOf(element) lastIndexOf(element) 从正反方向查找元素

    容器间元素处理方法

  • A.containsAll(B) A容器是否包含B容器所有元素

  • A.addAll(B) A容器增加B容器存在的所有元素
  • A.removeAll(B) A容器去除B容器存在的所有元素
  • A.retainAll(B) A容器取AB容器的交集(改变A)

    Set

    常用类HashSet

  • 无序,顺序无意义,无标记

  • 基本用法就是相等元素不会重复加入
  • 常用方法与list一致,在collection接口中被定义
  • 不可重复的核心为equals方法,是否重复由对象的equals方法确定

    Map

  • 与list、set不同,map以键key值value对的形式成对存储

  • 键值对均为对象通过键来标识,键不可重复(equals判定),基本数据类型会被自动装箱
  • Map接口实现类有HashMap、TreeMap、HashTable、Properties等

    接口方法

  • size 返回键值对数量

  • isEmpty 是否为空
  • containsKey(key) 是否包含key
  • containsValue(avlue) 是否包含值value
  • get(key) 获取容器中键key对应的值对象
  • put(key,value) 存入键值对,如果键重复,旧值会被替换
  • remove(key) 从容器中移除key对应的键值对
  • putAll(map) 将容器map中所有的键值对添加至目标容器
  • clear 清空容器
  • keySet 返回存储key的Set容器
  • values 返回values集合
  • entrySet 返回存放Map.Entry类型的键值对Set容器

    HashMap和HashTable

    |
    | HashMap | HashTable | | —- | —- | —- | | 线程安全 | 不安全 | 安全 | | 效率 | 高 | 低 | | key为null | 允许 | 不允许 |

泛型

基本概念

  • 泛型本质就是数据类型的参数化,处理的数据类型不是固定的,可以作为参数传入
  • <数据类型>只能是引用类型
  • 优点是代码可读性好、程序安全(编译时期没有警告,运行时期就不会出现ClassCastException异常)
  • 泛型主要用于编译阶段,编译后生成的字节码class文件不包含泛型中的类型信息,设计类型转换仍然是普通的类型转换
  • 泛型主要就是方便程序员的编写以及更好的安全性检测,约定标记如下: | 泛型标记 | 对应单词 | 说明 | | —- | —- | —- | | E | Element | 在容器中使用,表示容器中的元素 | | T | Type | 表示普通的JAVA类 | | K | Key | 表示键,例如:Map中的键Key | | V | Value | 表示值 | | N | Number | 表示数值类型 | | ? | | 表示不确定的JAVA类型 |

容器中使用泛型

  • 限制容器存取内容类型(给容器贴标签)
  • 使容器的实用规范、简答、安全 ```java // list1中只能存放String类型 List list1 = new ArrayList<>();

// set1中只能存放Integer类型 List set1 = new HashSet<>();

// map1中只能存放键值均为String类型的键值对 Map map1 = new HashMap<>();

  1. <a name="DAnzn"></a>
  2. ## 自定义泛型(泛型类、泛型接口、泛型方法)
  3. ```java
  4. // 定义
  5. class Generic1<T>{
  6. public T fn(T obj){
  7. System.out.println(obj);
  8. return obj;
  9. }
  10. public <N> void fn1(N obj){
  11. System.out.println(obj);
  12. }
  13. }
  14. interface MyList<E> {
  15. int size();
  16. boolean isEmpty();
  17. void add(E e);
  18. E get(int index);
  19. }
  20. // 使用
  21. Generic1<Integer> g1 = new Generic1<>();
  22. g1.aa(22);
  23. Generic1<String> g2 = new Generic1<>();
  24. g2.aa("22");
  25. class MyArrayList<E> implements MyList<E> {
  26. // ...方法代码
  27. }

泛型标记和泛型限定

  1. public class GenericTest {
  2. // 限定Dog以及子类
  3. public static void test01(List<? extends Dog> list){}
  4. // 限定Dog以及父类
  5. public static void test02(List<? super Dog> list){}
  6. }

三种容器遍历方式

Collection接口遍历

  1. // 通过索引遍历,只能用于List,因为Set没有索引
  2. for(int i = 0; i<list1.size(); i++){
  3. String temp = list1.get(i);
  4. }
  5. // 通过增强for循环 (List、Set)
  6. for(String temp:list1){
  7. System.out.println(temp)
  8. }
  9. // 通过迭代器Iterator对象 (List、Set)
  10. for(Iterator<String> iter = list1.iterator();iter.hasNext();){
  11. String temp = iter.next();
  12. System.out.println(temp);
  13. }

Map接口遍历

  1. // 遍历Map(遍历Key、遍历Value)
  2. // 遍历键
  3. Set<String> keySet1 = map1.ketSet();
  4. for(String temp:keySet1){
  5. System.println("key:" + temp + "value:" + map1.get(temp))
  6. }
  7. // 遍历值
  8. Collections<String> values1 = map1.values();
  9. for(String temp:values1){
  10. System.println("value:" + temp)
  11. }
  12. // 使用EntrySet遍历
  13. Set<Map.EntrySet<String,String>> entrySet1 = map1.entrySet();
  14. for(Map.EntrySet es:entrySet1){
  15. System.println("key:" + es.getKey() + "value:" + es.getValue())
  16. }
  • 如果边遍历,边删除,容器size会变化,若需要处理全部元素,需要使用迭代器删除

    1. // 使用迭代器,始终指向下一个元素,不关心容器整体的变化
    2. for(Iterator<String> iter = list1.iterator(); iter.hasNext()){
    3. String temp = iter.next();
    4. if(temp.startsWith("r")){
    5. iter.remove()
    6. }
    7. }

    存储二维表代码示例

  • List + Map

  • List + Javabean