Java之集合学习

来源:互联网 发布:microsoft visio mac 编辑:程序博客网 时间:2024/06/05 08:50
Collection|-List  |-ArrayList  |-LinkedList  |-Vector    |-Stack|-Set  |-HashSet  |-TreeSet  |-LinkedHashSet|-Queue

1、Collection
Collection是所有集合的根接口,JDK 不提供此接口的任何直接实现:它提供更具体的子接口(如 Set 和 List)实现。
2、List
List是一个接口,有序,可以对元素的插入位置进行控制,元素可重复
2.1 ArrayList
实现List接口,有序,可重复,实现不同步,即多线程操作该ArrayList实例会造成数据不统一的现象。底层为数组

class Number implements Runnable{    //static List<Integer> number=new ArrayList<>();    static List<Integer> number=Collections.synchronizedList(new ArrayList<>());    @Override    public void run() {        for(int i=0;i<10;i++){            number.add(i);            try {                Thread.sleep(10);            } catch (InterruptedException e) {                e.printStackTrace();            }        }    }}public class Text extends Number{    public static void main(String[] args) throws InterruptedException {        Number n=new Number();        Thread thread1=new Thread(n);        Thread thread2=new Thread(n);        thread1.start();        thread2.start();        thread1.join();        thread2.join();        System.out.println(number);    }}

2.2 LinkedList
实现List接口,有序,可重复,实现不同步(与ArrayList相同),不同在于底层为链表(对两者不同操作的开销不同)
2.3 Vector
实现List接口,动态数组,线程同步

public class Text {    public static void main(String[] args) {    Vector<String> vector=new Vector<>();    String string=new String("Hello");    vector.add("你好");    vector.add("哦还有");    vector.add("哈梅雷");    vector.add("啊你哈噻有");    System.out.println(vector);    vector.insertElementAt(string, 1);    vector.remove(2);    System.out.println(vector);    }}output:[你好, 哦还有, 哈梅雷, 啊你哈噻有][你好, Hello, 哈梅雷, 啊你哈噻有]

2.4 Stack
继承Vector,数据结构中的栈,先进后出

public class Text {    public static void main(String[] args) {        List<String> list=new ArrayList<>();        list.add("西游记");        list.add("红楼梦");        list.add("三国演义");        list.add("水浒传");        list.add("金瓶梅");                Stack<String> books=new Stack<>();        for(int i=0;i<5;i++){            books.push(list.get(i));        }        for(String book : books){            System.out.println(book);        }        System.out.println("---------");        if(!books.isEmpty()){            System.out.println("foreach后Stack不为空");        }        System.out.println("---------");        while(!books.isEmpty()){            System.out.println(books.pop());        }        System.out.println("---------");        if(books.isEmpty()){            System.out.println("pop后Stack为空");        }    }}/*output:西游记红楼梦三国演义水浒传金瓶梅---------foreach后Stack不为空---------金瓶梅水浒传三国演义红楼梦西游记---------pop后Stack为空*/

3、Set
接口,无重复(不存在满足e1.equals(e2)的元素对),最多包含一个null元素。
3.1 HashSet
实现Set接口,无序,实现不同步,底层为HashMap,添加对象时,要重写hashCode()和equals()方法

class Tea{    private String color;    private int price;    public Tea(String color,int price){        this.color=color;        this.price=price;    }    public String getColor() {        return color;    }    public int getPrice() {        return price;    }    @Override    public int hashCode() {        final int prime = 31;        int result = 1;        result = prime * result + ((color == null) ? 0 : color.hashCode());        result = prime * result + price;        return result;    }    @Override    public boolean equals(Object obj) {        if (this == obj)            return true;        if (obj == null)            return false;        if (getClass() != obj.getClass())            return false;        Tea other = (Tea) obj;        if (color == null) {            if (other.color != null)                return false;        } else if (!color.equals(other.color))            return false;        if (price != other.price)            return false;        return true;    }}public class Text {    public static void main(String[] args) {        HashSet<Tea> hashTea=new HashSet<>();        hashTea.add(new Tea("红", 5));        hashTea.add(new Tea("绿", 6));        hashTea.add(new Tea("白", 3));        hashTea.add(new Tea("红", 5));        hashTea.add(new Tea("绿", 5));        Iterator<Tea> it=hashTea.iterator();        while(it.hasNext()){            Tea tea=(Tea) it.next();            System.out.println(tea.getColor()+"tea:"+tea.getPrice()+"块");        }    }}/*output:绿tea:6块绿tea:5块白tea:3块红tea:5块//去掉equals()或hashCode()后:白tea:3块绿tea:5块红tea:5块绿tea:6块红tea:5块*/

3.2 TreeSet
底层为TreeMap,实现不同步,可排序但需要有排序规则(String,Integer等拥有自己的排序规则,自己写的类也要自己定义规则)。
排序两种方案:
1、使用TreeSet()构造方法,需要添加的元素实现Comparable接口

class Tree implements Comparable{    private String type;    private int age;    public Tree(String type,int age){        this.type=type;        this.age=age;    }    public String getType() {        return type;    }    public int getAge() {        return age;    }    @Override    public int compareTo(Object obj) {        Tree tree=(Tree) obj;        if(tree.age < this.age){            return -1;        }        if(tree.age > this.age){            return 1;        }        if(tree.age == this.age){            return this.type.compareTo(tree.type);        }        return 0;    }}public class Text {    public static void main(String[] args) {        Set<Tree> set=new TreeSet<>();        Tree tree1=new Tree("杨树", 15);        Tree tree2=new Tree("榆树", 20);        Tree tree3=new Tree("松树", 25);        Tree tree4=new Tree("朴树", 25);        Tree tree5=new Tree("直上春树", 20);        set.add(tree1);        set.add(tree2);        set.add(tree3);        set.add(tree4);        set.add(tree5);        Iterator<Tree> iterator=set.iterator();        while(iterator.hasNext()){            Tree tree=iterator.next();            System.out.println(tree.getType()+": "+tree.getAge()+"岁了");        }    }}/*output:朴树: 25岁了松树: 25岁了榆树: 20岁了直上春树: 20岁了杨树: 15岁了*/

2、使用TreeSet(Comparator<?> comparator)构造方法,自定义一个比较器

class Tree {    private String type;    private int age;    public Tree(String type,int age){        this.type=type;        this.age=age;    }    public String getType() {        return type;    }    public int getAge() {        return age;    }}class MyCompare implements Comparator<Tree>{    @Override    public int compare(Tree t1, Tree t2) {        if(t1.getAge() < t2.getAge()){            return 1;        }        if(t1.getAge() > t2.getAge()){            return -1;        }        if(t1.getAge() == t2.getAge()){            return t1.getType().compareTo(t2.getType());        }        return 0;    }}public class Text {    public static void main(String[] args) {        Set<Tree> set=new TreeSet<>(new MyCompare());        Tree tree1=new Tree("杨树", 15);        Tree tree2=new Tree("榆树", 20);        Tree tree3=new Tree("松树", 25);        Tree tree4=new Tree("朴树", 25);        Tree tree5=new Tree("直上春树", 20);        set.add(tree1);        set.add(tree2);        set.add(tree3);        set.add(tree4);        set.add(tree5);        Iterator<Tree> iterator=set.iterator();        while(iterator.hasNext()){            Tree tree=iterator.next();            System.out.println(tree.getType()+": "+tree.getAge()+"岁了");        }    }}/*output:朴树: 25岁了松树: 25岁了榆树: 20岁了直上春树: 20岁了杨树: 15岁了*/

4、Queue
接口,数据结构中的队列,先进先出,LinkedList实现了Deque接口,Deque接口继承Queue接口。