1.1.2.3 Collection接口与Iterator接口 Collection接口的实现类跟Vector相似。要从实现了Collection接口的类的实例中取出保存在其中的元素对象,必须通过Collection接口的Iterator()方法,返回一个Iterator接口。6 U: y% b8 E$ R7 o; }# s" j# {7 q
Iterator接口与Enumeration接口非常相似。该接口的优点是其中的方法名比较简短。) j# N" o: ?7 o- }; s& H1 i A% K' Y- @
Arraylist类实现了Collection接口
+ m2 x2 i3 D9 P! C! V! N9 a 例:将上例改写为用ArrayList类和Iterator接口来实现。- x2 e1 g4 w; a6 I
import java.util.*;
! V( {8 [5 c9 S* H: l) H public class TestCollection& ?4 Q* j& `$ f2 Q2 z- C
{
* h5 q- W. h c3 j public static void main(String[] args)& x3 e3 g5 i$ Z6 j/ S
{# B) V, I( H" J
ArrayList v=new ArrayList();& j" j) i9 {5 d! U
int b=0;4 ~' j( D" k6 y+ x! G$ z' L" b
int num=0;
p) D. v- {3 C9 G4 ` System.out.println("Please enter number:");$ Y. |% D+ f5 k; d1 U( k7 p
while(true)+ E0 R, e. `' y! v
{
; w# ~6 \1 h0 V+ l( H+ v7 i+ l try) p# ], y9 ?$ E8 |
{
* n6 d, \5 Z4 _& U1 C/ `% l b=System.in.read();6 Y" V" |( A3 |: d, h( x9 X
}
4 h! k5 A; Z+ z catch(Exception e). ~$ z6 t6 q2 R# Y' o- A8 u' {( n
{
. M3 a# u& V! g( } S9 r e.printStackTrace();
6 X3 T/ {2 I$ I8 z( ~' K; Q }
4 A- @" _: o! K* J+ ^$ K5 v& M7 r if(b=='\r'||b=='\n')
7 m( f! k: W8 z3 T- L {
6 l" }6 F" O7 o% L! |! v5 K" { break;
/ ^- u0 @" z6 g$ x4 r4 n }
6 K- `4 J8 R( D9 y( h1 ^9 r else) D: R$ o- J8 V+ x3 i8 H
{
& b0 d T5 v4 X% {9 \2 S num=b-'0';' h3 ~ G9 U# ]: H7 h' C
v.add(new Integer(num)); //方法为add()而不是addelement()
/ O$ A. s" Y" A6 U }
9 u, u6 ?& S2 ]( S; Y }. T9 v" u. S4 g% ^$ i: h
int sum=0;
3 [. R% Z# p) n3 v- ~! D Iterator e=v.iterator();
* v8 |; h$ v6 ~# @ while(e.hasNext())//判断是否有数据时,使用的是hasNext()方法
8 M9 L, z) K/ b7 c1 K6 p {& J; z) V3 O3 S7 l1 V$ g
Integer intobj=(Integer)e.next(); //取数据时使用next()方法,而不是nextElement()0 r1 g: D9 x1 J1 F) m4 t9 `
sum+=intobj.intValue();
% r) \$ I! F. ~* L$ q l }. V; K4 k( Y9 r$ X
System.out.println(sum);
3 S9 k" y+ e& K- A) S }
: {; x" S, A! ~# x( n9 N' ~ }
, S) j: A3 N1 h' i0 N 这两组实现的结果都是一样的,那什么时候使用哪种呢?+ z/ l* L, C, p+ G7 G& ~: V8 k
Vector类中的所有方法都是线程同步的,所有有两个以上的线程访问并发访问vector对象时,是安全的,但是只有一个线程访问时,仍然存在同步监视器检查的情况,需要额外的开销,影响了效率。而ArrayList中的所有方法是不同步的,所以程序中如果不存在多线程安全的问题,则ArrayList比Vector的效率高。如果存在多线程安全的问题,使用ArrayList要自己编写同步处理,而使用Vector则不要。9 K1 Q6 T4 Q& e( y1 |. c
Collection,Set,List的区别如下:3 h9 j0 T! d* E1 w2 W1 W4 C# u
Set,List是Collection的子类。
6 a' y2 d5 I( e2 J: e, B+ N5 D Collection各元素对象之间没有指定的顺序,允许有重复元素和多个Null元素对象。所以不可以排序,也不可以找出第几个第几个元素。
8 D3 g H. v% B2 C9 ~, K7 x9 i x Set各元素对象之间没有指定的顺序,不允许有重复元素,最多允许有一个Null元素对象。: b+ \+ _+ r$ B
List各元素对象之间有指定的顺序,允许有重复元素和多个Null元素对象。
w6 M$ R& a! |! M5 Z import java.util.*;
' ?) _9 M: L# X. W8 ~0 n( @( D public class TestSort
. m2 ^; X: z- `+ n( | {
, h9 Q; m8 t# R( F public static void main(String[] args)
2 L( c. O& d. @* Z; n {
8 @# l% P2 W- i: C+ e6 j ArrayList al=new ArrayList(); //新建一个arraylist ,由于它也实现了list接口,所以可以进行排序
& G9 U9 y S/ ` al.add(new Integer(1));" f5 y9 z6 @0 a/ r- q
al.add(new Integer(3)); m1 e2 l5 r3 t5 R5 l" u' Q5 P
al.add(new Integer(2)); //添加三个数字,随便添加,没有排序2 v% O; Z8 r6 i- k
System.out.println(al.toString()); //打印9 }2 ?, W, ?# h
Collections.sort(al); //排序' J& k5 i& Z5 d! K. J
/*Collections类本身并不是一个集合类,它只是提供了各种方法来操作集合类*/! J$ h4 M5 ]9 E, f( @6 ]
System.out.println(al.toString());
7 j3 `! }1 G2 \& M! _ }
& T* a' L3 g) _! r- K } |