1. 集合框架
2. 集合操作——线性表
1. 集合框架
1.1. Collection
java提供了一种可以存数一组数据的数据结构,其提供了丰富的方法,在实际开发中往往比数组使用的广泛。这种数据结构成为集合:Collection。
Collection是一个接口,其定义了集合的相关功能方法。
1.1.1. addAll与containsAll方法
集合也提供了批处理操作:
addAll方法用于将给定集合中的所有元素添加到当前集合中,其方法定义为:
例如:
containsAll方法用于判断当前集合是否包含给定集合中的所有元素,若包含则返回true。其方法定义为:
01. b o o l e a n a d d A l l (C o l l e c t i o n c )
01.
C o l l e c t i o n <S t r i n g > c 1 = n e w A r r a y L i s t <S t r i n g >();02.
c 1.a
d d ("j a v a ");03.
c 1.a
d d ("c p p "); 04.
c 1.a
d d ("p h p ");05.
c 1.a
d d ("c #"); 06.
c 1.a
d d ("o b j
e c t i v e -c "); 07.
S y s t e m .o u t .p r i n t l n (c 1); // [j a v a , c p p , p h p , c #, o b j e c t i v e -c ] 08.
C o l l e c t i o n <S t r i n g > c 2 = n e w H a s h S e t <S t r i n g >(); 09.
c 2.a
d d A l l (c 1);10. S y s t
e m .o u t .p r i n t l n (c 2); // [c p p , p h p , c #, j a v a , o b j e c t i v e -c ]
01. b o o l e a n c o n t a i n s A l l (C o l l e c t i o n c )Top
例如:
01.C o l l e c t i o n<S t r i n g>c1=n e w A r r a y L i s t<S t r i n g>();
02.c1.a d d("j a v a");
03.c1.a d d("c p p");
04.c1.a d d("p h p");
05.c1.a d d("c#");
06.c1.a d d("o b j e c t i v e-c");
07.S y s t e m.o u t.p r i n t l n(c1);//[j a v a,c p p,p h p,c#,o b j e c t i v e-c]
08.C o l l e c t i o n<S t r i n g>c2=n e w A r r a y L i s t<S t r i n g>();
09.c2.a d d("j a v a");
10.c2.a d d("c p p");
11.S y s t e m.o u t.p r i n t l n(c1.c o n t a i n s A l l(c2));//t r u e
1.2. Iterator 迭代器
Collection提供了一个遍历集合的通用方式,迭代器(Iterator)。
获取迭代器的方式是使用Collection定义的方法:
01.I t e r a t o r i t e r a t o r()
迭代器Iterator是一个接口,集合在覆盖Collection的iterator()方法时提供了迭代器的实现。
Iterator提供了统一的遍历集合元素的方式。
1.2.1. hasNext与next方法
迭代器用于遍历集合的两个主要方法:
boolean hasNext():判断集合是否还有元素可以遍历。
E next():返回迭代的下一个元素
遍历集合应遵循“先问后取”的方式,也就是说,应当在确定hasNext()方法的返回值为true的情况下再通过next()方法取元素。
由此可以看出,使用迭代器遍历集合是通过boolean值驱动的,所以它更适合使用while 循环来遍历。
例如:
01.C o l l e c t i o n<S t r i n g>c=n e w H a s h S e t<S t r i n g>();
07.I t e r a t o r<S t r i n g>i t=c.i t e r a t o r();
08.w h i l e(i t.h a s N e x t()){
09. S t r i n g s t r=i t.n e x t();
10. S y s t e m.o u t.p r i n t l n(s t r);
11.}
1.2.2. remove方法
迭代器还提供了一个方法:void remove()。该方法用于删除迭代器当次从集合中获取的元素。若我们在迭代过程中想删除集合元素时,我们就需要通过该方法来进行。这里需要注意,在使用迭代器遍历集合时是不能通过集合自身提供的remove方法删除元素的,否则迭代器在迭代时会抛出异常。
例如:
01.C o l l e c t i o n<S t r i n g>c=n e w H a s h S e t<S t r i n g>();
07.S y s t e m.o u t.p r i n t l n(c);//[c p p,p h p,c#,j a v a,o b j e c t i v e-c]
08.I t e r a t o r<S t r i n g>i t=c.i t e r a t o r();
09.w h i l e(i t.h a s N e x t()){
10. S t r i n g s t r=i t.n e x t();
11. i f(s t r.i n d e x O f("c")!=-1){
12. i t.r e m o v e();
13. }
14.}
15.S y s t e m.o u t.p r i n t l n(c);//[p h p,j a v a]
1.2.3. 增强for循环
Java5.0之后推出了一个新的特性,增强for循环,也称为新循环。该循环不通用于传统循环的工作,其只用于便利集合或数组。 语法:
01.f o r(元素类型 e:集合或数组){
02. 循环体
03.}
新循环并非新的语法,而是在编译过程中,编译器会将新循环转换为迭代器模式。所以新循环本质上是迭代器。
例如:
01.C o l l e c t i o n<S t r i n g>c=n e w H a s h S e t<S t r i n g>();
07.f o r(S t r i n g s t r:c){
08. S y s t e m.o u t.p r i n t(s t r.t o U p p e r C a s e()+"");
09.}
10.//C P P P H P C#J A V A O B J E C T I V E-C
1.3. 泛型机制
1.3.1. 泛型在集合中的应用
泛型是Java SE 5.0引入的特性,泛型的本质是参数化类型。在类、接口和方法的定义过程中,所操作的数据类型被传入的参数指定。
Java泛型机制广泛的应用在集合框架中。所有的集合类型都带有泛型参数,这样在创建集合时可以指定放入集合中的对象类型。Java编译器可以据此进行类型检查,这样可以减少代码在运行时出现错误的可能性。
我们来举个例子,比如ArrayList,其在定义时是这样的:
01.p u b l i c c l a s s A r r a y L i s t<E>{
02. … … …
03. p u b l i c b o o l e a n a d d(E e){…};
04. p u b l i c E g e t(i n t i n d e x){…};
05.}
由此我们可以看出,再声明ArrayList时,类名的右侧有一个<E>。"<>"表示泛型,而
其中可以使用数字字母下划线(数字不能的第一个字符)来表示泛型的名字。(通常我们使用一
个大写字母来表示,当然这个不是规定。)这时,在类中声明的方法的参数,返回值类型可以
被定义为泛型。这样在创建对象时可以将类型作为参数传递,此时,类定义所有的E将被替
换成传入的参数。
例如:
01.A r r a y L i s t<S t r i n g>l i s t=n e w A r r a y L i s t<S t r i n g>();//泛型E在这里被指定为S t r i n g类
02.l i s t.a d d("O n e");//那么a d d方法的参数就被替换为S t r i n g类型
03.l i s t.a d d(100);//这里就会出现编译错误,因为这里的参数应为S t r i n g类型。
2. 集合操作——线性表
2.1. List
List接口是Collection的子接口,用于定义线性表数据结构;可以将List理解为存放对象
的数组,只不过其元素个数可以动态的增加或减少。并且List是可重复集,这个我们在以前
的章节已经描述。
2.1.1. ArrayList和LinkedList
List接口的两个常见实现类为ArrayList和LinkedList,分别用动态数组和链表的方式实
现了List接口。
计算机专业java可以认为ArrayList和LinkedList的方法在逻辑上完全一样,只是在性能上有一定的差
别,ArrayList更适合于随机访问而LinkedList更适合于插入和删除;在性能要求不是特别苛
刻的情形下可以忽略这个差别。
2.1.2. get与set方法
List除了继承Collection定义的方法外,还根据其线性表的数据结构定义了一系列方法,
其中最常用的就是基于下标的get和set方法。
E get(int index):获取集合中指定下标对应的元素,下标从0开始。
E set(int index, E elment):将给定的元素存入给定位置,并将原位置的元素返回。
例如:
01.L i s t<S t r i n g>l i s t=n e w A r r a y L i s t<S t r i n g>();
02.l i s t.a d d("j a v a");
03.l i s t.a d d("c p p");
04.l i s t.a d d("p h p");
05.l i s t.a d d("c#");
06.l i s t.a d d("o b j e c t i v e-c");
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论