前面我们在(一)里面讲述了集合和数组的区别,以及集合里面不带泛型的输入,在这我们讲解一下集合泛型的使用,以及实现使用泛型集合存储字符串和自定义数组。
数组和集合的区别:
数组;既能够存储基本类型,也可以存储引用类型
基本类型(一共有8种):byte int short long float double char boolean
引用类型: 类class 接口interface 数组array
集合,只能够存储引用类型
上一篇文章我们讲解了一下集合和数组的肚带泛型的使用,那你可能会问为什么要使用泛型呢
现在请你观察下面的代码;
class fanxing_demo1 {
public static void main(String[] args) {
ArrayList array = new ArrayList();
array.add("hello");
array.add("world");
array.add("java");
//array.add(10);
//我们说集合只能存放引用类型的数据,但是这里却没有报错是因为jdk5以后的自动装箱
//遍历集合
Iterator it = array.iterator();
while(it.hasNext()){
String s = (String) it.next();
//java.lang.ClassCastException 这里报错了,因为我们前面添加了一个今天类型的数据10
//在强制转换为String的时候就出现错误了
System.out.println(s);
}
//因为这个问题是在执行的时候才暴露出来的,但如果是数组的话就会提前在编译的时候报错
System.out.println("----------引入泛型以后的---------");
//创建集合
ArrayList<String> array2 = new ArrayList<String>();
//向集合添加元素
array2.add("hei");
array2.add("Iam");
array2.add("android");
//array2.add(10); 引用泛型以后这里直接就报错了
//Iterator 查看API以后发现他也是需要泛型的,
//并且迭代器是依赖于集合的,所以集合是什么类型,他就是什么类型的
Iterator<String> it2 = array2.iterator();
while(it2.hasNext()){
//因为外面迭代器已经明确过数据的类型是String , 所以这里就不需要再进行
//String s = (String) it2.next(); 这样的强制类型转换了
//String s = it2.next(); 这样就可以了,但是也可以直接输出
System.out.println(it2.next());
}
} }
当你把上面的的程序复制到eclipse以后你就会发现会后有很多的黄色警告线,因为你没有明确数组里面存放的数据类型,所以什么类型的数据都可以往数组里面里添加,但是在后面做数据类型转换的时候有可能会出现错误。所以人家给你了警告。
/*
* 因此我们就在想,有没有办法让集合像数组一样在编译的时候就可以吧问题暴露出来,
*
* 所以就引入了泛型:
* 泛型: 是一种吧类型明确的工作推迟到创建对象或者调用方法的时候采取明确的特殊类型(参数类型)
* 把类型当做参数一样的传递
* 格式:<数据类型>
* 这里放的只能是引用类型
* 好处: 吧运行时期的问题提前到了编译期间
* 避免了强制类型转换
* 优化了程序设计;解决了黄色警告线
*
*/
上面的程序实现带泛型的数组的集合添加字符串并且和没有带泛型的集合进行了比较。
下面我们来借号带泛型的集合存储自定义对象并遍历
首先呢我们还是要先创建一个自定义的学生类,然后在main方法里面创建添加学生对象
public class Student {
String name ;
int age ;
public Student(String name , int age){
this.name = name ;
this.age = age ;
}
public Student() {
// TODO Auto-generated constructor stub
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
// TODO Auto-generated method stub
return "name : "+name +" age :"+age;
}
}
现在我们在主函数里面去创建学生对象,并添加到学生集合里面去(在遍历的时候我使用了一个增强for的方法来遍历集合,具体的增强for使用方法在我的博客里面有介绍)
public class ArrayList_zidingyi {
public static void main(String[] args) {
//创建集合对象
ArrayList<Student> array = new ArrayList<Student>();
//创建元素
Student s1 = new Student("张三" ,11);
Student s2 = new Student("李四" ,12);
Student s3 = new Student("王五" ,13);
Student s4 = new Student("赵六" ,14);
//添加元素
array.add(s1);
array.add(s2);
array.add(s3);
array.add(s4);
//1.遍历集合
System.out.println(array);
System.out.println("----------------------");
//2.使用数组遍历集合
Object[] obj = array.toArray();
for(int i = 0 ; i< obj.length ; i++){
Student s = (Student) obj[i];
System.out.println(s.getName()+"--------"+s.getAge());
}
System.out.println("----------------------");
//3.迭代器遍历结合e
Iterator<Student> it = array.iterator();
while(it.hasNext()){
Student s = it.next();
System.out.println(s.getName()+"--------"+s.getAge());
}
System.out.println("----------------------");
//普通for遍历
for(int i = 0 ; i< array.size() ;i++){
Student s = (Student) array.get(i);
System.out.println(s.getName()+"--------"+s.getAge());
}
System.out.println("------增强for---------");
for(Student i : array){
Student s = i;
System.out.println(s.getName()+"====="+s.getAge());
}
}
}
到这里带泛型的集合实现存储字符串和自定义类型的方法我就介绍完了,以后只要是API方法里面带有<> 的我们就要使用泛型来明确数据类型。