java中集合存储字符串时,集合的get(i)方法是获取集合中的第i+1个元素,而这个元素是Object类型,而Object类型没有length()方法,遍历的时候如果直接.length()会报错。如果想使用字符串的方法,就必须把元素还原成字符(向下转型)。
集合的遍历。其实就是依次获取集合中的每一个元素。
Object[] toArray():把集合转成数组,可以实现集合的遍历。
/*
* 集合的遍历。其实就是依次获取集合中的每一个元素。
*
* Object[] toArray():把集合转成数组,可以实现集合的遍历
*/
public class CollectionDemo3 {
public static void main(String[] args) {
// 创建集合对象
Collection c = new ArrayList();
// 添加元素
c.add("hello"); // Object obj = "hello"; 向上转型
c.add("world");
c.add("java");
// 遍历
// Object[] toArray():把集合转成数组,可以实现集合的遍历
Object[] objs = c.toArray();
for (int x = 0; x < objs.length; x++) {
// System.out.println(objs[x]);
// 我知道元素是字符串,我在获取到元素的的同时,还想知道元素的长度。
// System.out.println(objs[x] + "---" + objs[x].length());
// 上面的实现不了,原因是Object中没有length()方法
// 我们要想使用字符串的方法,就必须把元素还原成字符串
// 向下转型
String s = (String) objs[x];
System.out.println(s + "---" + s.length());
}
}
}
**
引入泛型,能够避免这一问题。
**
早期的Object类型可以接收任意的对象类型,但在实际的使用中,会有类型转换的问题。也就存在着隐患,所以Java提供了泛型来解决这一问题。
ArrayList存储字符串并遍历:
我们按照正常的写法来写这个程序, 结果确出错了。
为什么呢?
因为我们开始存储的时候,存储了String和Integer两种类型的数据。
而在遍历的时候,我们把它们都当作String类型处理的,做了转换,所以就报错了。
但是呢,它在编译期间却没有告诉我们。
所以,我就觉得这个设计的不好。
回想一下,我们的数组
String[] strArray = new String[3];
strArray[0] = "hello";
strArray[1] = "world";
strArray[2] = 10;
集合也模仿着数组的这种做法,在创建对象的时候明确元素的数据类型。这样就不会在有问题了。
而这种技术被称为:泛型。
泛型:是一种把类型明确的工作推迟到创建对象或者调用方法的时候才去明确的特殊的类型。参数化类型,把类型当作参数一样的传递。
格式:
<数据类型>
此处的数据类型只能是引用类型。
好处:
A:把运行时期的问题提前到了编译期间
B:避免了强制类型转换
C:优化了程序设计,解决了黄色警告线
public class GenericDemo {
public static void main(String[] args) {
// 创建
ArrayList<String> array = new ArrayList<String>();
// 添加元素
array.add("hello");
array.add("world");
array.add("java");
// array.add(new Integer(100));
//array.add(10); // JDK5以后的自动装箱
// 等价于:array.add(Integer.valueOf(10));
// 遍历
Iterator<String> it = array.iterator();
while (it.hasNext()) {
// ClassCastException
// String s = (String) it.next();
String s = it.next();
System.out.println(s);
}
// 看下面这个代码
// String[] strArray = new String[3];
// strArray[0] = "hello";
// strArray[1] = "world";
// strArray[2] = 10;
}
}