最近又把《Think in Java》的一些章节仔细阅读了一遍,为了加深印象在此记录下来。
Java中存放较多数据(基本数据类型、对象)的方式有两种:数组、集合。
数组和集合对比:
数组:效率高,但是由于数据需要固定的空间,容易造成资源浪费不够灵活,无法知道数据实际已经存放的元素数量(其中数组的length是指数据的容量)
集合:灵活性高,可以自动扩充大小,方便获得元素数量等信息(Size()),但效率相对较低。
(一)集合类
这里有一个网上的例子:实现一个向List中添加Integer元素,同时规定每次添加后List都是有序的
public static List<Integer> mList = new LinkedList<Integer>();
public static void addEmlement(int e) {
if (mList.isEmpty()) {
mList.add(e);
return;
}
int i=0;
for(int mint : mList){
if(mint <= e){
break; }
i++;
}
mList.add(i,e);
}
1 2 3 4 5 |
Exception in thread "main" java.util.ConcurrentModificationException at java.util.AbstractList$Itr.checkForComodification(Unknown Source) at java.util.AbstractList$Itr.next(Unknown Source) at IteratorDemo.addTicket(IteratorDemo.java:27) at IteratorDemo.main(IteratorDemo.java:14) |
针对List在迭代中进行增删改查会抛出ConcurrentModificationException的原因分析这里有一篇不错的文章
在这个例子中,集合用的是原始类型,在Java 5中增加了泛型内容后,官方不再推荐继续使用原始类型的集合。
原则:优先使用参数化的集合如: List<String> mList=new LinkedList<String>();
Java之所以还保留类似List之类的原始类型而不是强制使用List<String>的参数类型,是为了兼容性,在Java5之前,Java已经
发展了很久,已经存在太多没有使用参数化的集合,因为那时候压根没有啊。
为什莫建议一定要用List<String>而不是List ?
答案是:安全
举个栗子:
List mList=new LinkedList();这段代码在编译的时候,并不会有错误,但是在运行的时候妥妥的会抛出个错误来
mList.add(2);
mList.add(3);
mList.add("我是一个String");
Integer i=(Integer) mList.get(2);
java.lang.String cannot be cast to java.lang.Integer
所以为神马?
因为List中可以存放各种数据类型啊,你放个String、integer..他都是正确的,但是当你要取出来用的时候,就会有问题了,你不确定你到放进去的都是猫呢?还是都是狗?还是全都都有?
这时候我们修改成参数类型的集合:
List<Integer> mList=new LinkedList<Integer>();这段代码在编译的时候就爆出了错误
mList.add(2);
mList.add(3);
mList.add("我是一个String");
Integer i=(Integer) mList.get(2);
The method add(Integer) in the type List<Integer> is not applicable for the arguments (String)
明明白白告诉你,我这只能放猫(Integer),不要狗(String),那我们在用的时候,只管按照猫(Integer)取出来即可