package hing.test.collection;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.EnumMap;
import java.util.EnumSet;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Hashtable;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.LinkedHashSet;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.TreeMap;
import java.util.TreeSet;
import java.util.Vector;
import org.junit.Test;
public class TestCollection {
@Test
public void testCollection(){
// Collection接口是List,Set和Queue接口的父接口
/**
* Collection接口定义的操作集合的方法:
*
* boolean add(Object o);
* boolean addAll(Collection c);
* void clear();
* boolean contains(Object o);
* boolean contains(Collection c);
* boolean isEmpty();
* Iterator iterator();
* boolean remove(Object o);
* boolean removeAll(Collection c);
* boolean retaionAll(Collection c);
* int size();
* Object[] toArray();
*/
}
/**
* List代表有序,可重复的集合。
* Vector因为是线程安全的,所以性能比ArrayList低。
*/
@Test
public void testArrayList(){
/**
* ArrayList是基于数组实现的List类,是线程不安全的,需要手动保证该集合的同步性。
*/
List<String> list = new ArrayList<String>();
list.add("北京");
list.add("上海");
list.add("天津");
list.add("重庆");
for(String s : list){
System.out.println(s);
}
System.out.println(list.toString());
}
@Test
public void testLinkedList(){
/**
* LinkedList对于顺序访问集合中的元素的速度非常快,特别是插入和删除排第一,在List中。
*/
List<String> list = new LinkedList<String>();
list.add("北京");
list.add("上海");
list.add("天津");
list.add("重庆");
for(String s : list){
System.out.println(s);
}
System.out.println(list.toString());
}
@Test
public void testVector(){
/**
* Vector是基于数组实现的List类,是线程安全的。但不建议使用!
*/
List<String> list = new Vector<String>();
list.add("北京");
list.add("上海");
list.add("天津");
list.add("重庆");
for(String s : list){
System.out.println(s);
}
System.out.println(list.toString());
}
/**
* Set代表无序,不可重复的集合。
* HashSet和TreeSet是Set的两个典型实现。但HashSet的性能总是比Tree好,特别是常用的添加和查询元素。
* EnumSet是所有Set实现类中性能最好的,但它只能保存同一个枚举类的枚举值作为集合元素。
*/
@Test
public void testHashSet(){
/**
* HashSet按Hash算法来存储集合中的元素,因此具有很好的存储和查找性能
* 1.不能保证元素的排序顺序,顺序有可能发生变化。
* 2.HashSet不是同步的。
* 3.集合的值可以是null。
*/
Set<String> set = new HashSet<String>();
set.add("北京");
set.add("上海");
set.add("天津");
set.add("重庆");
Iterator<String> i = set.iterator();
while(i.hasNext()){
String str = i.next();
if(str.equals("重庆")){
i.remove();
}
}
for(String s : set){
System.out.println(s);
}
}
@Test
public void testLinkedHashSet(){
/**
* LinkedHashSet是HashSet的子类,它也是根据元素的hashCode值来决定元素的存储位置,
* 但它同时使用链表维护元素的次序,这样使得元素看起来是以插入的顺序保存的。因此性能上略低于HashSet。
*/
Set<String> set = new LinkedHashSet<String>();
set.add("北京");
set.add("上海");
set.add("天津");
set.add("重庆");
Iterator<String> i = set.iterator();
while(i.hasNext()){
System.out.println(i.next());
}
}
@Test
public void testTreeSet(){
/**
* TreeSet是SortedSet接口的实现类,可以确保集合元素处于排序状态。
* 如果在定义TreeSet时,不定义Comparator(),集合会调用集合元素的CompareTo(Object o)
* 与HashSet集合相比,TreeSet还提供了如下几个额外方法:
* Object first();
* Object last();
* Object lower(Object o);
* Object higher(Object o);
* SortedSet subSet(fromElement,toElement);
* SortedSet headSet(toElement);
* SortedSet tailSet(fromElement);
*/
Set<User> set = new TreeSet<User>(
new Comparator() {
public int compare(Object o1,Object o2){
User u1 = (User)o1;
User u2 = (User)o2;
return u1.age > u2.age ? -1 : u1.age < u2.age ? 1 : 0;
}
});
set.add(new User("hing01",20));
set.add(new User("hing02",25));
set.add(new User("hing03",23));
set.add(new User("hing04",21));
set.add(new User("hing05",26));
Iterator<User> i = set.iterator();
while(i.hasNext()){
System.out.println(i.next().toString());
}
}
class User{
public User(String name ,int age){
this.name = name;
this.age = age;
}
String name;
int age;
public String toString(){
return this.name +":"+this.age;
}
}
enum Season{
SPRING,SUMMER,FALL,WINTER
}
@Test
public void testEnumSet(){
/**
* EnumSet是一个专门为枚举类设计的集合类,它在内部以位向量的形式存储,
* 因此EnumSet对象占用内存很小,而且运行效率很好。
*/
Set<Season> set = EnumSet.allOf(Season.class);
//输出[SPRING, SUMMER, FALL, WINTER]
System.out.println(set.toString());
//创建一个EnumSet空集合
Set<Season> setNull = EnumSet.noneOf(Season.class);
}
/**
* Map<key,value>用于保存具有映射关系的数据。key不允许重复
* HashMap和Hashtable都是Map典型的实现类,不能保证存储顺序,它们之间的关系完全类似于A仍然有List和Vertor的关系。
*
*/
@Test
public void testHashMap(){
/**
* HashMap是线程不安全的,可以使用null作为key或value。
*/
Map<String, String> map = new HashMap<String, String>();
map.put("1", "一");
map.put("2", "二");
map.put("3", "三");
map.put("4", "四");
System.out.println(map);
}
@Test
public void testLinkedHashMap(){
/**
* LinkedHashMap是HashMap的子类,可保证存入顺序和输出顺序一致,所以性能略低于HashMap。
*/
Map<String, String> map = new LinkedHashMap<String, String>();
map.put("1", "一");
map.put("2", "二");
map.put("3", "三");
map.put("4", "四");
System.out.println(map);
}
@Test
public void testHashtable(){
/**
* Hashtable是线程安全的,但不可以使用null作为key或value。
*/
Map<String, String> map = new Hashtable<String, String>();
map.put("1", "一");
map.put("2", "二");
map.put("3", "三");
map.put("4", "四");
System.out.println(map);
}
@Test
public void testTreeMap(){
/**
* TreeMap可类比TreeSet
*/
Map<String, String> map = new TreeMap<String, String>();
map.put("1", "一");
map.put("2", "二");
map.put("3", "三");
map.put("4", "四");
System.out.println(map);
}
@Test
public void testEnumMap(){
Map<Season, String> map = new EnumMap<Season, String>(Season.class);
map.put(Season.SPRING, "春暖花开");
map.put(Season.SUMMER, "夏日炎炎");
map.put(Season.FALL, "秋高气爽");
map.put(Season.WINTER, "万里冰封");
System.out.println(map);
}
/**
* Collections是java提供的一个操作Set、List和Map等集合的工具类。
* 它提供了很多的方法:排序、查找、替换和同步控制等操作,
* 有兴趣的自己钻研一下,这里不列举了。。。
*/
@Test
public void testCollections(){
}
}
Java中List、Set和Map等集合总结和介绍
最新推荐文章于 2024-04-24 22:51:49 发布