疯狂java笔记3:集合类(1)

java集合类中,是一种工具
大致要分为Set、List和Map


Collection接口是List、Set和Queue接口的父接口,该接口定义的方法


Set、List、Queue和Map,最常用的


Iterator接口(一个遍历的工具)
使用:
...
Collection books=new HashSet();
Iterator it=books.iterator();
while(it.HashNext()){
String book=(String)it.next();
System.out.println(book);
if(book.equals("疯狂java讲义"))
{
it.remove();
}
book="测试字符串";
}
System.out.println(books);
...
利用Iterator集合迭代访问Collection集合元素时,集合元素不能被改变,只有通过Iterator的remove方法删除next方法返回的集合元素


Set集合(罐子,不可重复)
Set接口有三个实现类,HashSet类、TreeSet类和EnumSet类
HashSet类
HashSet判断集合元素相同的标准
class A
{
public boolean equals(Object obj)
{
return true;
}
}
class B
{
public int hashCode()
{
return 1;
}
}
class C
{
public int hashCode()
{
return 2;
}
public boolean equals(Object obj)
{
return true;
}
}
public class HashSetTestTest
{
public static void main()
{
HashSet books=new HashSet();
books.add(new A());
books.add(new A());
books.add(new B());
books.add(new B());
books.add(new C());
books.add(new C());
System.out.println(books);
}
}
要注意两个对象通过equals()方法比较返回true,则这两个对象的hashCode也要相等
hashCode方法最好是将Field乘上一个质数以后的和,记住定义HashSet集合要处理的类型时最好,使对象的Field不可被直接修改,不然会造成错误


LinkedHashSet类
使用链表来维护


TreeSet类
是SortedSet的实现类,TreeSet集合中元素处于排序状态(按照元素的实际大小)
TreeSet还提供几个额外的方法,如
Comparator comparator(); //重写可以定制排序
SortedSet subSet(fromElement,toElement); //返回此Set的子集,范围从fromElement到toElement
...


大部分类在实现compareTo(Object obj)方法(实现了comparable接口)时,都需要将被比较对象obj强制类型转换成相同类型,因为只有相同类的两个实例才会比较大小
要注意自定义TreeSet集合要处理的类型时,重写equals方法和compareTo方法后,两者有一致的结果,也就是如果两对象equals返回true,那么compareTo返回0.
class R implements Comparable
{
int count;
public R(int count)
{this.count=count;}
public String toString()
{return "R[count:"+count+"]";}
//重写equals方法,根据count来判断是否相等
public boolean equals(Object obj)
{
if(this==obj){return true;}
if(obj!=null&&obj.getClass()==R.class)
{
R r=(R)obj;
if(r.count==this.count){return true;}
}
return false;
}
//重写compareTo方法,根据count来比较大小
public int compareTo(Object obj)
{
R r=R(obj);
return count>r.count?1:
count<r.count?-1:0;
}
}
使用:
public class TreeSetTest
{
public static void main(String[] args)
{
TreeSet ts=new TreeSet();
ts.add(new R(5));
ts.add(new R(-3));
ts.add(new R(2));
R first=(R)ts.first(); //取出集合的第一个元素
first.count=20;
ts.remove(new R(-3)); //删除Field被改变的元素,失败
}
}
定制排序(一般TreeSet默认升序排序,新建匿名类重写Comparetor方法可以解决)
TreeSet ts=new TreeSet(
public int compare(Object o1,Object o2)
{
R r1=(R)o1;
R r2=(R)o2;
return r1.count>r2.count?-1
     :r1.count<r2.count?1:0; 
}
...使用...
);


EnumSet类(为枚举类设计的集合类)
程序应该通过EnumSet提供的static方法来创建EnumSet对象
enum Season
{
SPRING,SUMMER,FAIL,WINTER
}
public class EnumSetTest
{
//建立一个EnumSet集合,集合元素就是Season枚举类的全部枚举对象
EnumSet es1=EnumSet.allOf(Season.class);
//建立一个EnumSet集合,没有集合元素,元素的类型是Season类
EnumSet es2=EnumSet.noneOf(Season.class);
es2=add(Season.WINTER,Season.SUMMER);//为空集合添加元素
EnumSet es3=EnumSet.of(Season.SUMMER,Season.WINTER);//指定一个集合生成
...
}


各Set实现类的性能分析
HashSet和TreeSet
HashSet快,只有当集合本身需要有序时,才使用TreeSet。其实EnumSet的性能最好
Ps:他们都是线程不安全的,有必要时使用Collections工具类来使之安全
SortedSet s=Collections.synchronizedSortedSet(new TreeSet(...));


List集合(元素有序,可重复),List集合可以根据索引来随机访问集合的元素(可以使用普通for循环来进行遍历),List判断两个对象相等只需要通过equals()方法返回true即可
List除iterator()还提供listIterator()方法,返回ListIterator对象(继承了Iterator接口)。这个对象增加了向前迭代的方法,还可以add添加元素(Iterator只能删除元素)


List集合有两个典型实现类ArrayList和Vector
不鼓励用Vector(stack是其中的子类,不推荐使用,用LinkedList代替栈),这两个类的功能十分接近,都是基于数组实现的List类
注意Arrays(数组操作工具类)的asList方法吧数组或制定个数对象转换的List集合,是Arrays的内部类,不继承自List集合。Arrays.ArrayList是固定长度的,程序只可访问不可增减。


Queue集合有PriorityQueue实现类和其中的Deque接口的实现类ArrayDeque和LinkedList两个实现类
PriorityQueue实现类保存的元素不是按照加入顺序而是值的大小排序的。对元素的要求和TreeSet类一致(equals方法和compareTo方法的一致)
Deque接口是Queue接口类的子接口类,ArrayDeque他是一个双端队列(数组实现,可以做栈用)
LinkedList是List接口(还实现了Deque接口)的一个实现类(利用链表实现,双端队列可以做栈用)


注意:使用java命令的时候设置了-Xms(设置JVM堆内存初始大小)和Xmx(堆内存的最大大小)选项



























































































你可能感兴趣的:(java,面向对象,iterator)