ArrayList与LinkedList的区别
java中ArrayList
和LinkedList
的区别
ArrayList
是实现了基于动态数组的数据结构,LinkedList
基于链表的数据结构。- 对于随机访问
get
和set
,ArrayList
觉得优于LinkedList
,因为LinkedList
要移动指针。 - 对于新增和删除操作
add
和remove
,LinedList
比较占优势,因为ArrayList
要移动数据。
ArrayList
使用动态数组存储数据,
使用无参构造函数时默认大小是10
,初始化时动态数组是个空数组{}
当数组容量不够时会扩容,扩容方式是 newCapacity=oldCapacity+(oldCapacity>>1)
, 当前数组大小*1.5
所以当插入数据量比较大时可能会浪费一部分空间,在可以确定数据量大小时给定初始化容量大小可以提高效率
在空间分配完毕后可以使用trimToSize
去除掉多余的空间
LinkedList
使用链表存储数据,
effective-java-九
effective-java-八
effective-java-七
方法
第38条: 检查参数的有效性
第39条: 必要时进行保护性拷贝
第40条: 谨慎设计方法签名
1. 谨慎地选择方法的名称。方法的名称应该始终遵循标准的命名习惯
2. 不要过于追求提供便利的方法。每个方法应该尽其所能。只有当一项操作被经常用到的时候,才考虑为它提供快捷方式。如果不能确定,还是不提供快捷为好
3. 避免过长的参数列表。 目标是4个或更少
缩短过长参数的方法
1. 把方法分解成多个方法,每个方法只需要这些参数的一个子集。
2. 创建辅助类,用来保存参数的分组。这些辅助类一般为静态成员类。
3. 从对象构建到方法调用都采用Builder模式,设置完参数再调用执行(execute)方法
4. 对于参数类型,要优先使用接口而不是类
第41条:慎用重载
effective-java-六
effective-java-五
effective-java-四
effective-java-三
第八条:覆盖equals时请遵守通用约定
- 类的每个实例本质上都是唯一的
- 不关心类是否提供了“逻辑相等”的测试功能
- 超类已经覆盖了equals, 从超类继承过来的行为对于子类也是合适的
- 类是私有的或者包级别私有的,可以确定它的equals方法永远不会被调用
equals方法实现了等价关系
- 自反性: 对于任何非
null
的引用值x
,x.equals(x)
必须返回true
; - 对称性: 对于任何非
null
的引用值x
和y
, 当且仅当x.equals(y)
返回true
时,y.equals(x)
必须返回true
; - 传递性: 对于任何非
null
的引用值x
,’y’和z
,如果x.equals(y)
返回true
,并且y.equals(z)
也返回true
,那么x.equals(z)
也必须返回true
; - 一致性: 对于任何非
null
的引用值x
和y
,只要equals
中的比较信息没有被改变,多次调用x.equals(y)
就会一直返回true
或者false
; - 对于任何非
null
的引用值x
,x.equals(null)
必须返回false
;