今天看了java编程思想持有对象这一章,对java的容器类有了一定的了解,这里写出来分享给大家,一起学习,一起进步!
首先我们来看一张图,摘自《java编程思想》,大家别怕,我会为大家一 一讲解。
这张图介绍的是java各个容器之间的关系,其实一般很多容器我们多没用到过,我这边主要讲解几个常用的的容器类,即上图黑色方框表示的
为:ArrayList,LinkedList,HashSet,HashMap。
这里我们先讲跟Collection有关的几个容器;
public interface Collection<E> extends Iterable<E>{};
public interface List<E> extends Collection<E>{};
public class ArrayList<E> extends AbstractList<E> implements List<E>, RandomAccess, Cloneable, java.io.Serializable{};
上面三行代码是摘自jdk的源码,对java有点基础的同学应该可以看懂,首先Collection是一个接口,然后List也是一个接口,并且继承了Collection接口,最后ArrayList实现了List接口,这与图中所表示的内容一一对应,相信现在大家对它们的关系应该有点清晰了,所以LinkedList与HashSet是类似的,只不过HashSet实现的是Set接口,既然它们都是实现Collection接口的实现类,那么我们可以这么创建Collection:
Collection <Object> c_ArrayList=new ArrayList<Object>();
Collection <Object> c_LinkedList=new LinkedList<Object>();
Collection <Object> c_HashSet=new HashSet<Object>();
这是java中的向上转型,相信大家应该都了解吧,当然这里不是讲这部份内容,需要的了解的小伙伴可以自己去查下资料;
看到这里很多小伙伴都疑惑了,既然它们都实现了Collection接口,为啥还要分成这么多个,其实博主一开始也很疑惑,不过现在也算有了基本的了解,博主是个Meizu粉,这里就以Meizu手机为例,Meizu为啥以前每年只出一款手机,而现在却每年出多款手机,并且有不同产品线,因为Meizu看到了用户的不同需求,有部分用户想要低价颜值高的产品,所以Meizu出了metal系列,有些用户想要性能高点的产品,Meizu就出了MX系列,又有些用户想要逼格高,与众不同,Meizu就出了Pro系列,也许博主比喻不当,其实它反映的却是本质,开发者需求不同,所以java就给我们提供了不同的选择,这就是为啥有不同的实现类了;
当然既然它们能抽象成一个接口,说明它们里面肯定有相同或相似的内容,举个例子:
int c_ArrayList_size=c_ArrayList.size();
int c_LinkedList_size=c_LinkedList.size();
int c_HashSet_size=c_HashSet.size();
我们发现其实每个集合都应该有返回自身长度的函数,所以java的作者就帮这个函数抽象到Collection接口中,这符合了java面对对象中的一个原则,就是封装。
ArrayList:它的底层是基于数组的,所以它的查询是依靠索引的,查询的时间复杂度是O(1),当然它的这种存储方式也有一定弊端,那就是在插入和移除元素时较慢,因为在进行这些操作时,不止对当前元素进行操作,它还会对list中其他元素的位置有影响;
LinkedList:它的实现其实可以理解为c++中的双向链表,这里博主就不展开讲了,一是不是很精通,二是大家要学会自己去找新知识去学习,既然它是基于链表的,好处跟弊处就很明显了,与ArrayList相比优势在于在list中间进行插入和移除元素速度较快,当然它在随机访问速度上相对较慢,因为它需要遍历,所以时间复杂度为O(n),另外LinkedList通常用来实现数据结构,比如栈,队列等;
HashSet:它的实现方式其实比较复杂,利用了很多哈希和散列的知识,这里就不给大家讲了,大家都懂的。。。,不过大家要知道它的一些特性,首先里面的元素是无序,另外由于运用了hashCode()和 equal()等方法,其实也就是哈希的知识,所以它的查询速度是很快的,时间复杂度是O(1)。
以上的ArrayList的方法LinkedList都有,这里就列举几个别的:
其他方法和HashSet的这里我就不写了,有兴趣的小伙伴可以去看看java的api文档,这里给大家推荐个:java api文档
以上就是博主对Collection接口下的几个容器类的理解了,大家有什么意见多多提,一起相互学习;
下面我们来看一看HashMap的知识
首先我们先来看一看Map是什么,Map是一种对象与对象相关联的设计,体现的是一种映射关系,比如一个Map对象
map
其实它表示的是一个String对象对应另一个String对象,而Map中属HashMap我们最常使用,所以我们一般可以这么得到Map对象:
Map<String,Object> map=new HashMap<String,Object>();
和HashSet一样HashMap的性能比较高,内部都用了散列码的方式进行了存储,主要是通过HashCode()函数,这里我就不多讲了,后面我会给大家写一篇散列和关于HashCode()函数的文章,到时大家也可以去看看。
写了这么多,总结一下,总的来说我这篇写的是很浅的,简单入门,更深的内容我会继续探索,到时分享给大家,希望对大家有用!!!