集合详解

Collection

集合的根节点是Collection,Collection下提供了两大常用集合,分别是:

List 和Set

List

List使用最多的有序集合,提供方便的新增、修改、删除操作。

Vector

Vector是Java早期提供的线程安全的有序集合,如果不需要线程安全,不建议使用此集合,毕竟同步是有线程开销的。

import java.util.Vector;

public class Demo01 {

    public static void main(String[] args) {
        Vector vector = new Vector();
        vector.add("dog");
        vector.add("cat");
        vector.add("pig");
        vector.add("bird");
        vector.remove("cat");
        System.out.println(vector);
    }

}
ArrayList

ArrayList是最常见的非线程安全的有序集合,因为内部是数组存储的,所以随机访问的效率很高,但是非尾部的插入和删除性能较低,如果在中间插入元素,之后的元素都要后移。

LinkedList

LinkedList是使用双向链表数据结构实现的,因此增加和删除效率比较高,而随机访问效率较差。

LinkedList有offer()方法和peek()方法

import java.util.LinkedList;

public class Demo02 {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        LinkedList linkedList = new LinkedList();
        //添加元素
        linkedList.offer("bird");
        linkedList.push("cat");
        linkedList.push("dog");
        
        //获取第一个元素
        System.out.println(linkedList.peek());
        //获取第一个元素,并且删除它
        System.out.println(linkedList.poll());
        System.out.println(linkedList);
    }

}

Set

集合不允许有重复的元素,在许多需要保证元素唯一性的场景中使用

HashSet

HashSet是一个没有重复元素的集合,虽然它是Set集合的子类,实际是HashMap的实例

public HashSet() {
    map = new HashMap<>();
}

因此Hash是无序集合,没有办法保证元素的顺序性。

HashSet默认容量为16,每次扩充0.75倍。

public HashSet(Collection<? extends E> c){
    map = new HashMap<>(Math.max((int)(c.size/.75f)+1,16));
    addAll(c);
}
TreeSet

TreeSet实现了自动排序

import java.util.TreeMap;
import java.util.TreeSet;

public class Demo03 {

    public static void main(String[] args) {

        TreeSet treeSet = new TreeSet();
        treeSet.add("dog");
        treeSet.add("ant");
        treeSet.add("cat");
        treeSet.add("lion");
        System.out.println(treeSet);
    }

}
LinkedHashSet

LinkedHashSet是按照元素的hashCode值来决定元素的存储位置,但同时又用链表来维护元素的次序,这样使得看起来像是按照插入顺序保存的。

集合与数组

集合和数组可以用toArray()和Arrays.asList()来实现

import java.lang.reflect.Array;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class Demo04 {

    public static void main(String[] args) {
    
        List<String> list = new ArrayList();
        list.add("dog");
        list.add("cat");
        list.add("ant");
        list.add("lion");
        String[] arr = list.toArray(new String[list.size()]);
        for(String s:arr) {
            System.out.println(s);
        }
        List<String> list2 = Arrays.asList(arr);
        System.out.println(list2);
    }

}

集合排序

Java语言提供了两种排序方式

Comparable 和 Comparator

Comparable

位于java.lang包下,是一个排序接口,实现了该接口,意味着该类有了排序功能

package test;

import java.util.Arrays;
import java.util.Comparator;

public class Demo05 {
    public static void main(String[] args) {
        Dog[] dogs = new Dog[] {
            new Dog("老旺财", 88),
            new Dog("中旺财",55),
            new Dog("小旺财",22)
        };
        Arrays.sort(dogs,new DogComparator());
        for(Dog d:dogs) {
            System.out.println(d.getName() + " "+ d.getAge());
        }
    }
}

class DogComparator implements Comparator<Dog>{

    @Override
    public int compare(Dog o1, Dog o2) {
        return o1.getAge() - o2.getAge();
    }
    
}
class Dog{
    private String name;
    private int age;
    public Dog(String name,int age) {
        this.name = name;
        this.age = age;
    }
    public String getName() {
        return name;
    }
    public int getAge() {
        return age;
    }
    
}
Comparator
import java.util.Arrays;
import java.util.Comparator;

public class Demo05 {
    public static void main(String[] args) {
        Dog[] dogs = new Dog[] {
            new Dog("老旺财", 88),
            new Dog("中旺财",55),
            new Dog("小旺财",22)
        };
        Arrays.sort(dogs,new DogComparator());
        for(Dog d:dogs) {
            System.out.println(d.getName() + " "+ d.getAge());
        }
    }
}

class DogComparator implements Comparator<Dog>{

    @Override
    public int compare(Dog o1, Dog o2) {
        return o1.getAge() - o2.getAge();
    }
    
}
class Dog{
    private String name;
    private int age;
    public Dog(String name,int age) {
        this.name = name;
        this.age = age;
    }
    public String getName() {
        return name;
    }
    public int getAge() {
        return age;
    }
    
}
Last modification:October 31st, 2019 at 07:57 pm
如果觉得我的文章对你有用,请随意赞赏