集合详解
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;
}
}
One comment
很棒的文章