ArrayList
    无参构造 默认长度为10
    单参构造 可以传入一个Collection对象 转为一个ArrayList对象
    单参构造 传入设定的初始空间大小int 作为构造方法参数
    能扩容最大到int类型大小-8 扩容方法grow()

    1. void .add(int,Object)
    2. E .get(int) 根据下标找到对象
    3. E .remove(int) 根据下标移除对象 返回这个被移除的对象
    4. E .set(int,Obejct) 将当前下标的对象替换为新的对象 返回被替换的对象
    5. int .indexOf(Object) 通过对象找下标 lastIndexOf(对象)
    6. void .trimToSize() 将集合中多余的空间删除
    7. 迭代器
    8. Iterator迭代器对象 通过指针移动 判断元素是否存在 存在则获取这个元素
    9. Iterator<Student> is = as.iterator();
    10. while(is.hasNext()) {
    11. Student s = is.next();
    12. System.out.println(s.toString());
    13. }
    14. 双向迭代器 ListIterator 通过参数 设置指针停留在最后
    15. ListIterator<Student> ls = as.listIterator(as.size());
    16. while(ls.hasPrevious()) {
    17. Student s = ls.previous();
    18. System.out.println(s.toString());
    19. }
    20. 注意:在迭代器使用过程中 不应该通过其他对象对集合进行更新操作
    21. 迭代器对象提供有一个自己的remove() 删除当前元素

    Vector集合 古老的线程安全的集合结构 可以使用增强for循环 有自己的迭代器对象
    Vector vs = new Vector();
    vs.add(new Student(“张三”,18));
    vs.add(new Student(“李四”,20));
    vs.add(0,new Student(“小二”,17));
    // for(Student s : vs) {
    // System.out.println(s.toString());
    // }
    //创建Vector集合的迭代器对象
    Enumeration es = vs.elements();
    while(es.hasMoreElements()) {
    Student s = es.nextElement();
    System.out.println(s.toString());
    }

    练习:
    保存商品 Goods name属性
    有Sport类型 有价格price属性 Study类型 有数量num属性
    使用ArrayList集合保存 使用迭代器正向逆向输出

    LinkedList
    增删快 查询慢(从第一个元素开始挨个遍历查找)
    一根链条表示索引
    一根链条记录顺序
    无参构造 默认长度为0
    单参构造 可以传入一个Collection对象 转为一个LinkedList对象

    void    .add(int,Object)
    E        .get(int)            根据下标找到对象
    E        .remove(int)        根据下标移除对象 返回这个被移除的对象
    E        .set(int,Obejct)    将当前下标的对象替换为新的对象 返回被替换的对象
    int     .indexOf(Object)    通过对象找下标   lastIndexOf(对象)
    
    void     .addFirst(Object)
    void    .addLast(Object)
    
    E        .getFirst()
    E        .getLast()
    
    E         .removeFirst()
    E        .removeLast()
    
    =======================================================================
    
    boolean    .offer(Object)        向集合尾部添加
    boolean    .offerFirst(Object)    向集合头部添加
    boolean    .offerLast(Object)    向集合尾部添加
    
    E        .element()            查询但不删除首元素
    E        .peek()                查询但不删除首元素
    E        .peekFirst()        查询首元素
    E         .peekLast()            查询尾元素
    
    E        .poll()                查询并删除首元素
    E        .pollFirst()        查询并删除首元素
    E        .pollLast()            查询并删除尾元素
    

    HashSet
    无序 不能存储重复数据 自动去重

    **对于基本数据类型 String 自动去重
    **对于其他引用数据类型 默认判断地址是否相同 不同则不去
    如果希望根据属性值判断  手动添加hashCode() equals() 即使地址不同 只要属性值相同 依然可以去重
        @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + age;
        result = prime * result + ((name == null) ? 0 : name.hashCode());
        return result;
    }
    
    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        Student other = (Student) obj;
        if (age != other.age)
            return false;
        if (name == null) {
            if (other.name != null)
                return false;
        } else if (!name.equals(other.name))
            return false;
        return true;
    }
    

    Java中实现去重 通过hashCode() 和 equals() 共同实现

    hashCode()获取一个哈希值
    每次输出一个引用数据类型 @后的十六进制值--》将这个对象调用hashCode()得到的哈希值转成十六进制
        String s1 = "重地";    
        String s2 = "通话";    
        System.out.println(s1.hashCode());//1179395
        System.out.println(s2.hashCode());//1179395
        //所以还需要配合equals()
    
    讲无序集合转成有序集合 实现 通过下标访问元素
    HashSet<String> hi = new HashSet<String>();
        hi.add("123");
        hi.add("456");
        hi.add("123");
    ArrayList<String> as = new ArrayList<String>(hi);
    LinkedList<String> ls = new LinkedList<String>(hi);
    System.out.println(as.get(4));
    

    比较器