Set集合:
Set集合不允许包含相同的元素,如果试图将两个相同的元素加入同一个Set集合中,则天剑操作将失败,add()方法返回false。
Set集合有HashSet、TreeSet、 EnumSet三个实现类。
——————————————————————
HashSet类:
HashSet是Set接口的典型实现。HashSet按Hash算法来存储集合中的元素,因此具有良好的存取和查找性能。
HashSet具有以下特点:
(1)不能保证元素的排列顺序,顺序可能与添加顺序不同,顺序也可能发生变化
(2)HashSet不是同步的,如果多个线程同时访问一个HashSet,假设有两个或者两个以上线程同时修改了HashSet集合时,则必须通过代码来保证其同步。
(3)集合元素值可以是null
当向HashSet集合中存入一个元素时,HashSet会调用该对象的hashCode()方法来得到该对象的hashCode()值,然后根据hashCode值决定该对象在HashSet中的存储位置,如果有两个元素通过equal()方法比较返回true,但他们的hashCode值不相等,HashSet会将他们存储在不同的位置。
也就是说,HashSet集合判断两个元素相等的标准是两个对象通过equal()方法比较相等,并且两个对象的hashCode()方法返回值也相等。
——————————————————————————————————————
TreeSet类:
TreeSet是SortedSet的实现类,TreeSet可以确保集合元素处于排序状态。与HashSet集合相比,TreeSet新增了几个方法:
import java.util.TreeSet;
public class TreeSetTest
{
public static void main(String[] args)
{
TreeSet nums = new TreeSet();
//向TreeSet中添加四个Integer对象
nums.add(5);
nums.add(12);
nums.add(44);
nums.add(8);
//输出集合元素,看到集合元素已经处于排序状态
System.out.println(nums);
//输出集合第一个元素
System.out.println(nums.first());
//输出集合最后一个元素
System.out.println(nums.last());
//返回小于的子集,不包含20
System.out.println(nums.headSet(20));
//返回大于5的子集,如果Set中包含5,则子集中还包含5
System.out.println(nums.tailSet(5));
//返回大于3,小于20的子集
System.out.println(nums.subSet(3,20));
}
}
EnumSet类:
(1)EnumSet类是一个专门为枚举类设计的集合类,EnumSet中的所有元素都必须是指定枚举类型的枚举值,该枚举类型在创建EnumSet时显式或隐式的指定。
(2)EnumSet的集合元素也是有序的,EnumSet以枚举值在Enum类内的定义顺序来决定集合元素的顺序。
(3)EnumSet在内部以位向量的形式存储,这种存储形式非常紧凑,高效,因此EnumSet对象占用内存很小,而且运行效率很好,尤其在执行批量操作时。
(4)EnumSet集合不允许加入null元素,如果试图插入null元素,将抛出NullPointerException异常。
(5)EnumSet类没有暴露任何构造器来创建该类的实例,程序应该通过它提供的类方法来创建EnumSet对象。请见javaAPI
下面程序示范了如何使用EnumSet来保存枚举类的多个枚举值:
import java.util.EnumSet;
enum Season
{
SPRING,SUMMER,FALL,WINTER;
}
public class EnumSetTest
{
public static void main(String[] args)
{
//创建一个EnumSet集合,集合元素就是Season枚举类的全部枚举值
EnumSet es1 =EnumSet.allOf(Season.class);
System.out.println(es1);//输出[SPRING,SUMMER,FALL,WINTER]
//创建一个EnumSet空集合,指定集合元素是Season类的枚举值
EnumSet es2 = EnumSet.noneOf(Season.class);
System.out.println(es2);//输出[]
//手动添加两个元素
es2.add(Season.WINTER);
es2.add(Season.FALL);
System.out.println(es2);//输出[WINTER,FALL]
//以指定枚举值创建EnumSet集合
EnumSet es3 = EnumSet.of(Season.WINTER,Season.FALL);
System.out.println(es3);//输出[WINTER,FALL]
}
}
List集合:
List代表一个元素有序、可重复的集合,集合中的每个元素有其对应的顺序索引。List集合允许使用重复元素,可以通过索引来访问指定位置的集合元素。
List集合默认按元素的添加顺序设置元素的索引。
List集合的方法详见API
import java.util.ArrayList;
import java.util.List;
public class ListTest
{
public static void main(String[] args)
{
List books = new ArrayList();
//向books集合里添加3个元素
books.add("水浒传");
books.add("西游记");
books.add("三国演义");
System.out.println(books);
//将新字符串插入在第二个位置
books.add(1,new String("红楼梦"));
for(int i=0;i<books.size();i++)
{
System.out.println(books.get(i));
}
//删除第三个元素
books.remove(2);
System.out.println(books);
//判断指定元素在集合中的位置,输出1,表明位于第二位
System.out.println(books.indexOf(new String("西游记")));
//将第二个元素替换成新的字符串对象
books.set(1,new String("围城"));
System.out.println(books);
}
}