Java学习与实践--集合类与泛型

最近又把《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);
	}
这个功能并不复杂,但的确是一个很有意义的例子,主要的用到Java集合的使用和排序(插入排序)
其中有一些注意事项:
(1) 在用iterator遍历原list的时候, 在对原list做增删改操作的时候, 程序在运行时会报错
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)
java中, 在对一些集合迭代的过程中对集合进行一些修改的操作, 比如说add,remove之类的操作, 有可能会抛ConcurrentModificationException, 这一点在API文档上也有说明: 在迭代时只可以用迭代器进行删除! 
针对List在迭代中进行增删改查会抛出ConcurrentModificationException的原因分析这里有一篇不错的文章
http://bbs.csdn.net/topics/370149418
当然,我们上面的例子中其实是避开了这个问题,并没有直接在迭代到指定位置后直接插入,而是用一份变量记录对应位置,结束迭代然后进行插入的操作。
(2)ArrayList和LinkedList的使用场景
以前我在 ArrayList和LinkedList中更多使用ArrayList。但事实上ArrayList和LinkedList有他们分别适应的场景。
ArrayList:是根据Array反推出来的,所以其实ArrayList具备了一些Array的特性,ArrayList也是更适合频繁查找场景,尤其常常需要查询特定位置的 元素的场景,但是在增删元素的时候,效率较低,因为和数组删除元素一样,被删除的元素后面的所有元素都要向前移动。
LinkedList:由链表构成,由于LinkedList是由链表构成,所以也就使他更适合频繁增删的场景,链表上的增删元素不需要移动其他元素
(3)集合与泛型
public static List mList=new LinkedList();

在这个例子中,集合用的是原始类型,在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)取出来即可

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值