数组:
数组可以用来保存多个基本数据类型的数据,也可以用来保存多个对象。
数组的长度是不可改变的,一旦初始化数组时就指定了数组的长度(无论是静态初始化还是动态初始化)。
数组无法保存具有映射关系的数据。
集合:
集合是只用于存储数量不等的对象。
集合的长度是可变的。
集合可以保存具有映射关系的数据。
几种集合的区别
-
Collection接口是集合类的根接口,Java中没有提供这个接口的直接的实现类。Set和List两个类继承于它。Set中不能包含重复的元素,也没有顺序来存放。而List是一个有序的集合,可以包含重复的元素。
-
Map又是另一个接口,它和Collection接口没有关系。Map包含了key-value键值对,同一个Map里key是不能重复的,而不同key的value是可以相同的。
-
参考:https://mp.weixin.qq.com/s?__biz=MzI1NDQ3MjQxNA==&mid=2247484148&idx=1&sn=9a8d4449e8c5c853e87ad2157a03b74f&chksm=e9c5fb45deb27253292552d4a5095e73696752ef0f9d60216ba8cff88271bafe398e53634952&scene=21#wechat_redirect
首先我们来看看ArrayList的成员变量:
可以看到主要的几个成员变量如上(跟进继承的父类,父父类直到根父类都没有成员变量)。我们来一一介绍一下。首先是一个常量DEFAULT_CAPACITY,根据注释表示默认的长度为10。然后是一个EMPTY_ELEMENTDATA的常量object数组,只是空有其表没有内容。然后是一个object数组elementData。
这个就是最重要的成员了,通过注释我们可以看到这表示这个数组用来存储我们的数据。也就是说,我们代码中的add的数据都会放在这个数组里面。那么由此我们可知,ArrayList内部是由数组实现。再看最后一个变量,int类型的size。
第一眼还以为是elementData数组的长度。仔细看注释,才发现它表示的是elementData数组里面包含的数据长度。
(transient:短暂的.在实际开发过程中,我们常常会遇到这样的问题,这个类的有些属性需要序列化,而其他属性不需要被序列化,打个比方,如果一个用户有一些敏感信息(如密码,银行卡号等),为了安全起见,不希望在网络操作(主要涉及到序列化操作,本地序列化缓存也适用)中被传输,这些信息对应的变量就可以加上transient关键字。换句话说,这个字段的生命周期仅存于调用者的内存中而不会写到磁盘里持久化。)``
怎么分场合使用不同的集合。如:集合类型那么多,什么时候该用List, Set, Map?
集合类型那么多,什么时候该用List, Set, Map?
*总结
如果涉及到堆栈,队列等操作,应该考虑用List,对于需要快速插入,删除元素,应该使用LinkedList,如果需要快速随机访问元素,应该使用ArrayList。
如果程序在单线程环境中,或者访问仅仅在一个线程中进行,考虑非同步的类,其效率较高,如果多个线程可能同时操作一个类,应该使用同步的类。
要特别注意对哈希表的操作,作为key的对象要正确复写equals和hashCode方法。
尽量返回接口而非实际的类型,如返回List而非ArrayList,这样如果以后需要将ArrayList换成LinkedList时,客户端代码不用改变。这就是Java面向对象编程中抽象和多态思维的体现。