集合这块内容还算简单,重点是集合体系和如何选择。还是老样子,先上图
看着这框架图,好吧,我自己都怀疑自己是有点强迫症了….
学集合,首先要明白集合和数组的区别。
先看表面上的不同:数组可以存储基本数据类型和对象(要看数组定义的元素类型是什么,如果是Object的话,就什么都能存了),长度固定;而集合只能存储对象(存的也是对象的引用地址),长度可变。
再考虑深层次一点的:数组由于长度不变,是静态的,元素类型统一,访问速度快;集合长度可变,没有泛型限定时可以存贮不同类型的对象,对成员的操作方法非常多,访问速度慢一点。
因此,当需要存贮不怎么改变操作,需要频繁读取的数据时,使用数组更好一点;当需要存贮经常操作改变、读取不是太频繁的数据时,使用集合更好一点。
集合和数组是可以相互转化的,一旦需求改变就可以选择把它转化。说到这里,提一下Collections和Arrays,这是集合和数组的两个工具类,内含很多经常被需要使用的功能,基本上我们需要的功能都在里面了。集合转化为数组可用Collections的toArray方法,数组转化为集合可以用Arrays的asList方法。
决定选择集合存贮数据以后,就要考虑具体用哪个集合容器来使用了。集合体系里容器众多,我的框架图里肯定是有很多子类或分类没写的。要选择正确的话首先要明白自己的存储需求:允不允许元素重复,是要有序还是无序,是增删比较多还是查询比较多,等等。然后就要知道这些众多容器的不同之处或者说优劣是什么。我在框架图里把现在基础阶段涉及到的一些都写了,更多的需要的话勤快点去找资源看。
如我博客开始所写,集合这块是不难的,前面的面向对象那块学的扎实点,再把集合框架记住,写程序基本是没问题了。所以这里就不写网上几乎雷同的示例了:定义类实现Comparable接口,定义一些成员变量,把equals、hashCode和compareTo方法定义一下。然后用这个类创建几个对象,和另外的一些基本数据类型凑成键值对存入到Map子类(TreeMap或HashMap)的对象中。这个Map子类对象用entrySet和keySet两种方式来得到Set集合,然后Set集合调用迭代器来实现遍历。
最后,来谈下集合容器众多的原因:存贮方式的多样性,即数据结构的多样性。数据结构是非常非常考验思维的东西,创建一个好的数据结构的影响会非常巨大,可以这样想:我们现在学的是软件编程,不管语言多高级,程序的一切,归根结底是要依靠数据的存贮的。我们自己还不到能创建数据结构的境界,不过我们要尽可能去掌握一些常见常用的数据结构:不只这些数据结构的用法,更重要的是它的存贮思想。如果能对数据结构理解的好一点,学起数组、集合这些容器来会事半功倍、触类旁通。举个例子来说:LinkedList的特点是增删快,查询慢。为什么呢,因为其底层是链表数据结构,何为链表?形象来说,如同自行车上的链条一般:加一个链节不需要把其他的已有链节移动,只需要拆开所要拆入点的两个链节,再将这两个链节同要加进来的链节建立联系就好;而要查询到某个链节在哪个位置,就要挨个问你的旁边是哪位了。
ArrayList的特点是查询快,增删慢,至于为什么,结合数据结构看看能不能解释得通吧。