List的特有方法
1.add(int index , object obj)
2.get(int index)
3.set(index obj)
4.remove(int index)
add在列表指定位置插入指定元素:

public class demo{
    public static void main(String[] args){
        //创建一个list集合
        List list = new ArrayList();    
        list.add("a");
        list.add("b");
        list.add("c");
        list.add("d");
        //注意制定索引添加元素不能越界
        list.add(5,"w");

        //替换指定索引的元素,不能替换超出集合长度的索引
        list.set(1,L);

        Object object = list.get(3);

        Syatem.out.println(object+"----get方法")
        System.out.println(list);

        //利用list中的get方法遍历集合
        for(i = 0; i < list.size();i++){
        System.out.println(list.get(i));
        }
        //被索引删除指定位置的元素
        list.remove(1);
    }       
}

LinkedList
数组实现:
特点: 查询快,增删慢;
查询: 依赖下标查询;
增删: 要把插入元素位置后的所有元素向后移动一位(删除时向前移动一位)

创建数组是默认10个位置,当要保存11个值的时候,系统会创建一个新数组长度为原来的1.5倍.(容易产生内存垃圾)

链表实现:
特点: 查询慢,增删快;
1.链表中的元素保存的是上下元素的地址,通过这个地址可以找到上下元素.
2.在进行查找的时候,先判断被查找的元素距离头近还是尾近.
3.如果头近就从头位置一个一个向下查找(通过保存地址)
4.增删时直接找到元素的位置,并重新保存一下上下元素地址.后面元素的位置都保持不动.

应用: 当查询功能多的时候用ArrayList
当增删元素多的时候用LinkedList


LinkedList的方法
需求:将e.f添加到a.b.c.d的首尾

public class Demo{
    public static void main(String[] args){
        //创建一个LinkedList
        LinkedList linkedlist = new Linledlist();
        list.add("a");
        list.add("b");
        list.add("c");
        list.add("d");
        //从集合头\尾添加.addFirst\addLast
        linkedlist.addFirst("e");
        linkedlist.addLast("f");
        System.out.println(linkedlist);
        //获取头尾元素
        System.out.println(linkedlist.getFirst());
        System.out.println(linkedlist.getLast());
    }   
}

需求: 如果数组中有”b”这个元素 就添加”Oh-Yes”这个元素

public class Demo{
    public static void fun2() {
            List list = new ArrayList();
            list.add("a");
            list.add("b");
            list.add("c");
            list.add("d");
            //获取集合中的迭代器
            //告诉迭代器集合的长度为4 长度就是固定的
            /*
            Iterator iterator = list.iterator();
            //循环遍历
            while (iterator.hasNext()) {
                if (iterator.next().equals("b")) {
                    //这里会发生并发修改异常:
                    //解决方案
                    list.add("Oh-yes");
                    iterator.add
                }                               
            }
            System.out.println(list);
            */  
            //创建一个获取list中的ListIterator
            ListIterator listIterator = list.listIterator();
            while (listIterator.hasNext()) {
                if (listIterator.next().equals("b")) {
                    //迭代器迭代时不能直接使用集合去添加新元素,要让迭代器去添加
                    listIterator.add("Oh-Yes");
                }
            }
            //注意:一般在对集合迭代的时候,不要轻易去改变集合长度
            //容易发生修改异常(解决方法 使用迭代器自己的添加方法)
            System.out.println(list);
        }
}

需求:在集合中储存”a”“a”“a”“b”“b”“b”“c”“c”“c”,要求去除重复元素

public class Demo{

    public static void fun3() {
            ArrayList list = new ArrayList();
            list.add("a");
            list.add("a");
            list.add("a");
            list.add("b");
            list.add("b");
            list.add("b");
            list.add("c");
            list.add("c");
            list.add("c");
            //创建一个新集合
            ArrayList newlist = new ArrayList();
            //遍历集合
            Iterator iterator = list.iterator();
            while (iterator.hasNext()) {
                //取出每一个元素
                Object next = iterator.next();
                //判断新集合中包含不包含这个元素
                //不包含就添加进去
                if (!newlist.contains(next)) {
                    newlist.add(next);
                }                       
            }
            //打印新集合查看结果
            System.out.println(newlist);
        }
    }

需求:在集合中存储6个学生:分别有两个涵涵 18岁 两个凉凉 16岁 两个星星 80岁

public class Person {
private String name;

private int age;

public Person() {

    // TODO Auto-generated constructor stub
}
public Person(String name, int age) {
    super();
    this.name = name;
    this.age = age;
}
public String getName() {
    return name;
}
public void setName(String name) {
    this.name = name;
}
public int getAge() {
    return age;
}
public void setAge(int age) {
    this.age = age;
}
@Override
public String toString() {
    return "Person [name=" + name + ", age=" + age + "]";
}

}

public class Student extends Person {

    public Student() {

    }

    public Student(String name, int age) {
        super(name, age);

    }

// 重写equals方法(用来判断对象的名字 和 年龄)
// 原来系统equals方法比较的是 地址
// 但是比较地址 对于咱们的需求 无法满足
// 所以要按着咱们的需求 来重写equals方法
@Override // 重写方法名完全一致
public boolean equals(Object obj) {
    // student1 和 student2
    // this.name 和 obj.name比较
    // 传进来的参数 需要向下转型 才能getName
    Student student2 = (Student) obj;
    // 这里调用是谁的equals 方法
    // this.getName()是字符串
    // 对象点方法 这个equals 方法是谁的? 那肯定是字符串的
    return this.getName().equals(student2.getName()) && this.getAge() == student2.getAge();
}
}


public static void fun4(ArrayList list) {
        ArrayList newList = new ArrayList();

        Iterator iterator = list.iterator();

        while (iterator.hasNext()) {

            Object next = iterator.next();
            //核心:包含判断
            //contains方法底层代码 依赖 equals方法
            //equals方法 是基类的 比较是地址是否相同
            //字符串比较时用.equals
            //contains:是否包含次元素
            if (!newList.contains(next)) {

                newList.add(next);
            }
        }
        System.out.println(newList);

    }


public static void fun5() {
        //需求:在集合中存储6个学生:分别有两个涵涵 18岁  两个凉凉  16岁   两个星星  80岁
        //去除重复的
        //封装去重复值的方法 
        ArrayList list = new ArrayList();
        list.add(new Student("涵涵",18));
        list.add(new Student("涵涵",18));
        list.add(new Student("凉凉",16));
        list.add(new Student("凉凉",16));
        list.add(new Student("星星",8));
        list.add(new Student("星星",8));
        //调用封装好的方法
        fun4(list);
        //集合中的元素(学生) 地址一样吗?
        //如何解决
    }