Collection 接口是单例集合的顶层接口,其中定义单列集合共有的方法。 Collection - List 存取有序,有索引,元素可重复 - ArrayList 基于数组,查询快,增删慢 - LinkedList 基于链表,查询慢,增删快 - Set 无索引,元素不可重复 - HashSet 存取无序,基于哈希表+红黑树 - LinkedHashSet 继承自 HashSet,存取有序,在 HashSet 的基础上增加了链表结构 - TreeSet 存取无序,基于红黑树,支持元素排序 常用方法 boolean add(E e) //添加元素到集合中 void clear() //清空集合 boolean contains(Object o) //判断集合中是否包含某个元素 boolean isEmpty() //判断集合是否为空 int size() //获取集合元素数量 boolean remove(Object o) //移除集合中指定的元素 <T> T[] toArray(T[] a) //集合转数组 Iterator<E> iterator() //获取迭代器 迭代器 Iterator 接口是迭代器 boolean hasNext() //判断是否有下一个元素可以迭代 E next() //获取下一个元素 使用 //集合 Iterator<String> it = col.iterator(); while (it.hasNext()) { String ele = it.next(); //... } 注意事项: 1、迭代器是一次性的,不能重复使用 2、在使用迭代器迭代集合的过程中,不允许增加或删除集合中的元素,否则会抛出 ConcurrentModificationException 3、如果已经迭代到末尾,就不能使用 next() 方法获取元素了,否则会抛出 NoSuchElementException 增强 for 循环 语法格式 for (数据类型 变量名 : 集合 or 数组) { //... } 由于增强 for 循环底层基于迭代器,所有在遍历的过程中也不能对集合中的元素进行添加或删除操作。 泛型,是 Java 提供的一种编译期的类型安全检查机制,避免类型错误。 泛型类 public class 类名<泛型> { } 泛型类中泛型的具体类型是在类的对象被创建时确定的,如果不指定,默认是 Object。 泛型方法 public <泛型> 返回值类型 方法名(形参列表...) { } 泛型方法中泛型的具体类型是方法被调用时确定的。 泛型接口 public interface 接口名<泛型> { } 泛型接口中泛型的具体类型可以由实现类指定,也可以延迟到实现类创建对象时指定。 泛型通配符 语法格式:<?> 受限泛型 上限 <? extends 上限类型> //表示能够接收上限类型及其子类 下限 <? super 下限类型> //表示能够接收下限类型及其父类 数据结构 线性结构 栈:先进后出 队列:先进先出 数组:查询快,增删慢 链表:查询慢,增删快 树结构 二叉树:每个节点的子节点数量不超过2 二叉查找树:在二叉树的基础上增加左小右大的规则,但二叉查找树有可能退化成链表。 平衡二叉树:是一种自平衡的二叉查找树,判断是否平衡的依据是左右子树的高度差的绝对值不能超过1,否则需要旋转。 左左:右旋 右右:左旋 左右:先对左子树左旋,再对自己右旋 右左:先对右子树右旋,再对自己左旋 红黑树:牺牲了一些查询效率,换来了较高的增删效率 List 集合 常用的方法 void add(int index, E element); //添加元素到指定的索引位置 E remove(int index); //移除指定位置的元素 E set(int index, E element); //替换指定位置的元素 E get(int index); //获取指定位置的元素 ArrayList LinkedList addFirst //添加元素到链表的头部 addLast //添加元素到链表的尾部 getFirst //获取链表头部的元素 getLast //获取链表尾部的元素 removeFirst //移除链表头部的元素 removeLast //移除链表尾部的元素 push //作为栈来使用,入栈,等同于 addFirst pop //作为栈来使用,出栈,等同于 removeFirst 斗地主案例 准备牌(使用字符串拼接) 洗牌(Collections.shuffle) 发牌(循环取余) 看牌(直接打印)