JAVA高级应用

ArrayList 和 LinkedList的区别

ArrayList:数组实现
特点:查询快 删除慢(参照于LinkedList)
查询:直接使用角标查询
增删:需要把要添加的元素的位置 后面的元素 全部移到一位
LinkedList:链表实现
特点:查询慢 增删快
查询:判断离头近还是离尾近, 然后从头或尾 一个一个查找 找到为止
增删:将要插入的元素地址保存 后面的元素不用进行任何改动

查询多 就使用ArrayList
增删多 就使用LinkedList

工作中一般使用ArrayList

list常用方法

List list = new ArrayList();
list.add("a");
list.add("b");
list.add("c");
list.add("d");

list中的添加方法 add(int index, Object obj)
添加的角标 就是后面元素所在的位置 不能越界
list.add(4,"x");
System.out.println(list); //结果:a b c d x

通过角标获取对应元素
Object object = list.get(2);
System.out.println(object);  //结果:c

通过get方法进行遍历
for(int  i = 0; i < list.size(); i++){
    System.out.println(list.get(i));
}

set方法不要越界
list.set(0,"z");
System.out.println(list);  //结果:z a b c d

删除角标方法 返回的是 被删除的元素
Object object2 = list.remove(3);
System.out.println(object2);  //结果:c
System.out.println(list);  //结果:z a b d
删除元素
List list = new ArrayList();
list.add(111);   //进行自动装箱
list.add(222);
list.add(333);
//删除111元素
Object object = list.remove(0);
System.out.println(object);  //结果:111

list.remove(Integer.valueOf(111));
这里删除的时候 系统没给你自动装箱 就按数字传入的方法
这里调用的是 按角标删除的方法 所以越界
如果非要使用按元素删除 需要手动装箱
System.out.println(list); //结果:222 333
添加元素 – 错误示例:发生并发修改异常
/*
         * 集合中添加 a b c d
         * 遍历集合 如果有b就 添加一个"oh~yes"
         * 使用迭代器完成
         */
public static void fun3(){
    List list = new ArrayList();
    List.add("a");
    List.add("b");
    List.add("c");
    List.add("d");
添加完4个元素后 这时集合的长度是4
如果使用迭代器遍历 那么长度必须固定的 4不变
    Iterator iterator = list.iterator();
    while(iterator.hasNext()){
发生异常 ConcurrentModificationException
并发修改异常
相当于修改了集合的长度
注意:在迭代器遍历的时候 不要直接使用集合做操作
        if(iterator.Next().equals("b")){
            list.add("oh-yes");
        }
    }
    System.out.println(list);
}
添加元素 – 解决并发修改异常
public static void fun3(){
//思路:让迭代器listIterator去完成添加元素
//而不是由list去完成
    List list = new ArrayList();
    List.add("a");
    List.add("b");
    List.add("c");
    List.add("d");

    ListIterator listIterator = list.listIterator();
    while(listIterator.hasNext()){
        if(listIterator.Next().equals("b")){
        //  让迭代器向集合中添加元素
            listIterator.add("oh-yes");
        }
    }
    System.out.println(list);
    //  注意:在迭代器中进行添加或者删除 要使用迭代器中得方法
    //  不能直接使用集合去操作
}
逆向遍历元素
public static void fun6(){}
    List list = new ArrayList();
    List.add("a");
    List.add("b");
    List.add("c");
    List.add("d");

    ListIterators listIterator = list.listIterator();
    //  判断是否有前一个元素
    while(listIterator.hasPrevious()){
    //  获取前一个元素
        System.out.println(listIterator.previous());
    }
}

结果:无法输出  因为迭代器中有一个指针,指在最开始的位置,而不是末尾位置,
所有hasPrevious()的值为null,要想输出元素,需先正向遍历,将指针移到末尾,之
后向前遍历,便可打印出全部元素
添加元素 获取元素
LinkedList linkedList = new LinkedList();
linkedList.addFirst("a");
linkedList.addFirst("b");
linkedList.addLast("c");
linkedList.addLast("d");

System.out.println(linkedList);
System.out.println(linkedList.getFirst());
System.out.println(linkedList.getLast());

vector简介

//  vector 1.2(利用数组实现的 已经被ArrayList 完全取代)
//  创建一个vector集合 迭代器遍历
Vector vector = new Vector();
//  添加元素
vector.addElement("a");
vector.addElement("b");
vector.addElement("c");
vector.addElement("d");
System.out.println(vector);

//  迭代器遍历
//  获取vector中的迭代器
Enumeration enumeration = vector.elements();
while(enumation.hasMoreElements()){
    //输出元素
    System.out.println(enumation.nextElement);
}

linkedList模拟栈结构

public static void fun1(){
    LinkedList listedList = new LinkedList();
    linkedList.addLast("a");
    linkedList.addLast("b");
    linkedLast.addLast("c");

    while(!linkedList.isEmpty()){
        System.out.println(linkedList.removeLast());
    }
}
ArrayList去重
private static void fun2(){
    LinkedList linkedList = new LinkedList();
    linkedList.add("a");
    linkedList.add("a");
    linkedList.add("a");

    linkedList.add("b");
    linkedList.add("b");
    linkedList.add("b");

    linkedList.add("c");
    linkedList.add("c");
    linkedList.add("c");

    Iterator iterator = linkedList.iterator();
    LinkedList linkedList1 = new LinkedList();
    while(iterator.hasNext()){
    //  判断老数组中得元素 是否存在新数组中
    //  如果存在 不添加到新数组中
    //  如果不存在 就添加
    //  不能两次调用next方法
        Object object = iterator.Next();
        if(!linkedList.contains(object)){
            linkedList.add(object);
        }
    }
    System.out.println(newList);
}
ArrayList去除重复对象
ArrayList list = new ArrayList();
        list.add(new Student("鹏鹏",18));
        list.add(new Student("鹏鹏",18));
        list.add(new Student("水水",17));
        list.add(new Student("水水",17));
        list.add(new Student("倩倩",16));
        list.add(new Student("倩倩",16));

        ArrayList newArray = new ArrayList();
        java.util.Iterator iterator = list.iterator();

        while(iterator.hasNext()) {
            //  判断 老数组中得元素 是否存在新数组中
            //  如果存在 不添加到新数组中
            //  如果不存在 就添加
            //  不能两次调用next方法
            Object next = iterator.next();
             if(!newArray.contains(next)) {
                 newArray.add(next);
             }
        }
        //  为什么同样的思路不行?如何解决
        //  写的去重这个思路 依赖contains这个方法


        for(Object object : newArray) {
            Student student = (Student)object;
            System.out.println(student.getName());
            System.out.println(student.getAge());
        }
        //  为什么同样思路不行?
    }

    @Override
    public boolean equals(Object obj) {
        // TODO Auto-generated method stub
        //  原来系统比较地址
        //  现在比较地址 已经不能满足我的需求了
        //  我的需求 不看地址 只看姓名和年龄
        //  姓名和年龄同时相同 就认为是对的

        //把传进来的转换成Student类型
        Student student = (Student)obj;

        return this.name.equals(student.getName()) 
                &&  this.age == student.getAge();
    }