黑马程序员-- 集合框架 (Collection, Iterator,泛型)

------<a href="http://www.itheima.com" target="blank">Java培训、Android培训、iOS培训、.Net培训</a>、期待与您交流! -------

1 . Collection

java提供了一种可以存数一组数据的数据结构,其提供了丰富的方法,在实际开发中往往比数组使用的广泛。这种数据结构成为集合:Collection。
Collection是一个接口,其定义了集合的相关功能方法。

1). List和Set

Collection派生出了两个子接口,一个是List另一个则是Set。
List:称为可重复集,顾名思义,该集合中是允许存放重复元素的,那么何为重复元素?重复元素指的并非是同一个元素,而是指equals方法比较为true的元素。
Set:称为不可重复集,所以,该集合中是不能将相同的元素存入集合两次,同List,这里相同指的也是两个元素的equals比较结果为true。

2). 集合持有对象的引用

集合中存储的都是引用类型的元素,那么引用类型变量实际上存储的是对象的“地址”,所以实际上集合只存储了元素对象在堆中的地址。而并不是将对象本身存入了集合中。

3). add()方法

Collection定义了一个add方法用于向集合中添加新元素。 该方法定义为:
boolean add(E e)
该方法会将给定的元素添加进集合,若添加成功则返回true,否则返回false
例如:

Collection<String> c = new ArrayList<String>();
System.out.println(c); // []
c.add("a");
c.add("b");
c.add("c");
System.out.println(c); // [a, b, c]

这里Collection后面的是泛型,我们后面会讲解,这里不写也没有关系。

4). contains方法

boolean contains(Object o)
该方法会用于判断给定的元素是否被包含在集合中。若包含则返回true,否则返回false。
这里需要注意的是,集合在判断元素是否被包含在集合中是使用元素的equals的比较结果。
(o==null ? e==null : o.equals(e)) 其中e是集合中的元素。
例如:

Collection<Cell> cells = new ArrayList<Cell>(); 
cells.add(new Cell(1, 2));
cells.add(new Cell(1, 3));
cells.add(new Cell(2, 2));
cells.add(new Cell(2, 3));     
Cell cell = new Cell(1, 3); 
// List集合contains方法和对象的equals方法相关
boolean flag = cells.contains(cell);
// 如果Cell不重写equals方法将为false
System.out.println(flag); // true 

5). size,clear,isEmpty方法

size方法用于获取当前集合中的元素总数。该方法定义为:int size()
clear方法用于清空集合。该方法定义为:void clear()
isEmpty方法用于判断当前集合中是否不 包含元素。该方法定义为:boolean isEmpty()
例如:

Collection<String> c = new HashSet<String>();
System.out.println(c.isEmpty()); // true 
c.add("java");    
c.add("cpp");    
c.add("php");
c.add("c#");    
c.add("objective-c"); 
// isEmpty:false, size: 5
System.out.println("isEmpty:" + c.isEmpty() + ",size: " + c.size());        
c.clear();
// isEmpty:true, size: 0
System.out.println("isEmpty:" + c.isEmpty() + ", size: " + c.size());    

java提供了一种可以存数一组数据的数据结构,其提供了丰富的方法,在实际开发中往往比数组使用的广泛。这种数据结构成为集合:Collection。
Collection是一个接口,其定义了集合的相关功能方法。

6). addAll与containsAll方法

集合也提供了批处理操作:
addAll方法用于将给定集合中的所有元素添加到当前集合中,其方法定义为:
boolean addAll(Collection c)
例如:

Collection<String> c1 = new ArrayList<String>();
c1.add("java");
c1.add("cpp");        
c1.add("php");
c1.add("c#");        
c1.add("objective-c"); 
System.out.println(c1); // [java, cpp, php, c#, objective-c] 
Collection<String> c2 = new HashSet<String>(); 
c2.addAll(c1);
System.out.println(c2); // [cpp, php, c#, java, objective-c] 

containsAll方法用于判断当前集合是否包含给定集合中的所有元素,若包含则返回true。其方法定义为:
boolean containsAll(Collection c)
例如:

Collection<String> c1 = new ArrayList<String>();
c1.add("java");        
c1.add("cpp");        
c1.add("php");
c1.add("c#");        
c1.add("objective-c"); 
System.out.println(c1); // [java, cpp, php, c#, objective-c] 
Collection<String> c2 = new ArrayList<String>();
c2.add("java");        
c2.add("cpp");
System.out.println(c1.containsAll(c2)); // true 

2 . Iterator 迭代器

Collection提供了一个遍历集合的通用方式,迭代器(Iterator)。
获取迭代器的方式是使用Collection定义的方法:
Iterator iterator()
迭代器Iterator是一个接口,集合在覆盖Collection的iterator()方法时提供了迭代器的实现。
Iterator提供了统一的遍历集合元素的方式。

1). hasNext与next方法

迭代器用于遍历集合的两个主要方法:
boolean hasNext():判断集合是否还有元素可以遍历。
E next():返回迭代的下一个元素
遍历集合应遵循“先问后取”的方式,也就是说,应当在确定hasNext()方法的返回值为true的情况下再通过next()方法取元素。
由此可以看出,使用迭代器遍历集合是通过boolean值驱动的,所以它更适合使用while循环来遍历。
例如:

Collection<String> c = new HashSet<String>();
c.add("java");        
c.add("cpp");        
c.add("php");
c.add("c#");        
c.add("objective-c");
Iterator<String> it = c.iterator();
while (it.hasNext()) {
    String str = it.next();
    System.out.println(str);
} 

2). remove方法

迭代器还提供了一个方法:void remove()。该方法用于删除迭代器当次从集合中获取的元素。若我们在迭代过程中想删除集合元素时,我们就需要通过该方法来进行。这里需要注意,在使用迭代器遍历集合时是不能通过集合自身提供的remove方法删除元素的,否则迭代器在迭代时会抛出异常。
例如:

Collection<String> c = new HashSet<String>();
c.add("java");        
c.add("cpp");        
c.add("php");
c.add("c#");        
c.add("objective-c"); 
System.out.println(c); // [cpp, php, c#, java, objective-c] 
Iterator<String> it = c.iterator();
while (it.hasNext()) {
    String str = it.next();
    if (str.indexOf("c") != -1) {
        it.remove();
    } 
} 
System.out.println(c); // [php, java]    

3). 增强for循环

Java5.0之后推出了一个新的特性,增强for循环,也称为新循环。该循环不通用于传统循环的工作,其只用于便利集合或数组。 语法:
for(元素类型 e : 集合或数组){
循环体
}
新循环并非新的语法,而是在编译过程中,编译器会将新循环转换为迭代器模式。所以新循环本质上是迭代器。
例如:

Collection<String> c = new HashSet<String>();
c.add("java");
c.add("cpp");
c.add("php");
c.add("c#");
c.add("objective-c");
for (String str : c) {
    System.out.print(str.toUpperCase() + " ");
    // CPP PHP C# JAVA OBJECTIVE-C
} 

3 . 泛型机制

1). 泛型在集合中的应用

泛型是Java SE 5.0引入的特性,泛型的本质是参数化类型。在类、接口和方法的定义过程中,所操作的数据类型被传入的参数指定。
Java泛型机制广泛的应用在集合框架中。所有的集合类型都带有泛型参数,这样在创建集合时可以指定放入集合中的对象类型。Java编译器可以据此进行类型检查,这样可以减少代码在运行时出现错误的可能性。
我们来举个例子,比如ArrayList,其在定义时是这样的:

public class ArrayList<E> {
    … … …                
    public boolean add(E e) {…};
    public E get(int index) {…};
} 

由此我们可以看出,再声明ArrayList时,类名的右侧有一个。”<>”表示泛型,而其中可以使用数字字母下划线(数字不能的第一个字符)来表示泛型的名字。(通常我们使用一个大写字母来表示,当然这个不是规定。)这时,在类中声明的方法的参数,返回值类型可以被定义为泛型。这样在创建对象时可以将类型作为参数传递,此时,类定义所有的E将被替换成传入的参数。

例如:
ArrayList list = new ArrayList();//泛型E在这里被指定为String类型

list.add(“One”);//那么add方法的参数就被替换为String类型
list.add(100);//这里就会出现编译错误,因为这里的参数应为String类型。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值