您的位置:首页 > 职场人生

黑马程序员——Java基础---集合(泛型及增强for)

2015-06-06 22:31 543 查看
——Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ——-

泛型

JDK1.5以后出现的机制

泛型出现的原因

泛型出现的好处

泛型的书写格式

把前面的集合代码用泛型改进

1:泛型是一种特殊的类型,它把指定类型的工作推迟到客户端代码声明并实例化类或方法的时候进行。

也被称为参数化类型,可以把类型当作参数一样传递过来,在传递过来之前我不明确,但是在使用的时候我就用明确了。

2:泛型的好处

A:提高了程序的安全性

B:将运行期遇到的问题转移到了编译期

C:省去了类型强转的麻烦

泛型由来

为什么会有泛型呢?

早期的Object类型可以接收任意的对象类型,但是在实际的使用中,会有类型转换的问题。也就存在这隐患,所以Java提供了泛型来解决这个安全问题。

* 1.为什么要有泛型:

* 1).回想我们之前使用集合的方式:

* ArrayList list = new ArrayList();

* list.add(“aaa”);

* list.add(“bbb”);

* list.add(“ccc”);

* list.add(20);

* list.add(true);

* for(int i = 0;i < list.size(); i++){

* System.out.println(list.get(i));

* }

* 2).要确定,因为集合的add(Object obj)接收的是Object类型,所以一个集合

* 可以存任何的引用类型;但这当我们取出元素时,又带来的了很多的麻烦。

* 3).所以,通常,我们需要在集合中只添加一种类型;

* Java中为了防止我们在向集合中添加一种类型时,添加了其它类型,所以Java为我们提供了一种

* 机制,它能够让我们在定义集合时,就确定集合中所存储的类型;然后在调用add()方法时,会强制

* 传递此类型的数据,否则不能通过编译;这种机制就是:泛型

* 定义类时,可以同时定义泛型;让这个类具有泛型化;

*

* 需要在类名后加一对<>括号,中间写一个字母。

* 字母是随意定义的,可以是一个,也可以是多个,中间用逗号隔开,

* 可以大写可以小写

泛型类

把泛型定义在类上

格式:public class 类名<泛型类型1,…>

注意:泛型类型必须是引用类型

泛型方法

把泛型定义在方法上

格式:public <泛型类型> 返回类型 方法名(泛型类型 .)

泛型接口

把泛型定义在接口上

格式:public interface 接口名<泛型类型1…>

泛型通配符

* 1.< ? >:

* 1).类型的变量可以指向什么对象?可以指向存储任何类型的集合.

* 2).可以向集合中添加什么类型的元素?不可以添加任何元素,因为是?,所以不确定是什么类型,所以不能够添加任何类型;

* 3).获取的时候是什么类型?因为里面可能是任何类型,所以,在外部可以使用Object类型接收,或者指定强转为某类型。

* 因为它不能够存元素,所以一般都是从里面获取元素,它一般作为一个方法的返回值声明;

* 2.< ? extends e >:

* 1).变量可以指向什么对象?可以指向任何存储E类型,以及E的子类型的集合对象;

* 2).可以向集合中添加什么类型的元素?因为声明时,可以是任何的B以及B的子类类型,但不确定是哪个具体子类类型,所以,不能添加任何元素;

* 3).获取的元素是什么类型?可以用B以及B的父类类型来接收;

* 3.< ? super E >:

* 1).< ? super E >类型的变量可以指向什么对象?任何的B以及B的父类类型的集合;

* 2).可以向集合中添加什么类型的元素?可以添加任何B以及B的子类对象;

* 3).获取的元素是什么类型?不能是A,B,C任何类型接收。

*

* < ? extends E >:不能向里面存东西,只能获取,一般用于方法的返回值声明;

* < ? super E > : 只能存,不能取,一般用于方法的形参声明;

eg:

class Animal {}

class Dog extends Animal {}

class Cat extends Animal {}

public class CollectionDemo {

public static void main(String[] args) {

Collection< ? > c1 = new ArrayList();

Collection< ? > c2 = new ArrayList();

Collection< ? > c3 = new ArrayList();

Collection< ? > c4 = new ArrayList();

Collection< ? extends Animal > c5 = new ArrayList();

Collection< ? extends Animal > c6 = new ArrayList();

Collection< ? extends Animal > c7 = new ArrayList();

// Collection< ? extends Animal > c8 = new ArrayList();

Collection< ? super Animal > c9 = new ArrayList();

// Collection< ? super Animal > c10 = new ArrayList();

// Collection< ? super Animal > c11 = new ArrayList();

Collection< ? super Animal > c12 = new ArrayList();

}

}

泛型的接口

*

* 1.在接口名后添加泛型定义;

* 子类实现时:

* 1.可以丢弃泛型:

* class Zi implements IA{

* public void show(Object obj){

* }

* }

* 2.子类可以丢弃泛型,并指定一个具体类型

* class Zi implements IA{

* public void show(String str){

* }

* }

* 3.子类可以继续使用泛型:(常见的方式)

* class Zi implements IA{

* public void show(T t){

* }

* }

增强for

语法格式:

* for(集合或数组中元素的类型 变量名 : 集合/数组的变量名){

*

* }

*

* 1.增强for循环,内部基于迭代器的,所以遍历时,仍然不能通过list的变量去修改集合内的元素。否则会发生并发修改异常;

* 2.增强for循环,会自动从第一个元素开始,遍历到最后一个元素;省去了我们自己编写循环变量的麻烦;

* 3.增强for循环,因为没有索引信息,所以,在循环中没有办法使用循环变量。

* 所以当不需要使用索引值的时候,而且是从第一个元素开始遍历到最后一个元素,那么可以使用增强for循环;

* 如果在循环过程中,需要用到索引值,就需要自己定义循环变量的方式实现;

好处:简化遍历

注意事项:增强for的目标要判断是否为null

把前面的集合代码的遍历用增强for改进

public interface Iterable 实现这个接口允许对象成为 “foreach” 语句的目标。

增强for循环:

public class Demo {

public static void main(String[] args) {

int[] arr = {24,32,43,24,325};

for(int i : arr){

// for(int n = 0;n < arr.length ;n++){

// int i = arr
;

System.out.println(“i = ” + i);

}

//遍历集合
ArrayList<String> strList = new ArrayList<String>();
strList.add("aaa");
strList.add("bbb");
strList.add("ccc");
for(String s : strList){//增强for循环,内部基于迭代器的
System.out.println(s);
/*if(s.equals("bbb")){//不可以通过list去修改集合内的元素
strList.add("ddd");
}*/
}

//遍历二维数组
int[][] arr2 ={{2,3,432},{24,32,55,324},{6,432,43,232,4,32,432,4,32,432}};
for(int[] a1 : arr2){
for(int n : a1){
System.out.print(n + "\t");
}
System.out.println();
}
}


}

增强for循环遍历自定义对象:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: