学习笔记

来源:互联网 发布:php和js 编辑:程序博客网 时间:2024/06/05 09:40

本文记录一些学习过程中觉得重要的笔记,不定期更新扩充。如有错误,欢迎指正。

1. 尽量使用fori循环而不是foreach或者迭代器iterator
(1)foreach的底层也是由iterator实现的
(2)iterator效率很低,因为每一次遍历都要hasNext()
(3)iterator不是线程安全的,会抛出并发修改异常ConcurrentModificationException

2. 使用ArrayList时,如果事先知道大致范围,那就在创建时设置长度
(1)ArrayList可以自动扩容
(2)扩容很耗时间耗内存

3. 及时回收Bitmap
(1)Bitmap很耗内存,更别说大量
(2)不再引用Bitmap时,主动调用bitmap.recycler()告诉GC去回收它,及时释放内存,避免内存泄漏

4. 避免循环体内高频率创建或销毁对象
(1)对于创建的对象,应尽量在循环体外创建
(2)循环体内短时间高频率创建并销毁对象会导致内存抖动,严重则导致内存溢出

5. 遍历时,对于多层引用的对象,应先声明,再操作
(1)逐层访问多层引用对象objectA.objectB.objectC,耗的时间是直接访问该对象objectC的很多倍
(2)对该对象多次操作会放大这个时间差距,遍历又会再次累加这个时间差距
(3)先声明一个实例,指向这个多层引用Object object = objectA.objectB.objectC,再对这个对象object直接操作

6. 按照业务需求来选择LinkedList和ArrayList
(1)LinkedList由链表(不连续的内存)实现,而ArrayList由数组(连续内存)实现
(2)偏向于增删操作:使用LinkedList,因为ArrayList每一次增删操作都会引起索引的移动,很耗时
(3)偏向于查改操作:使用ArrayList,因为查找的时间复杂度LinkedList是O(n),ArrayList是O(1)

7. String,StringBuffer,StringBuilder的选取
(1)避免频繁修改String浪费内存,String是定长的,任意修改实际上是创建了新的对象,旧对象仍在内存中
(2)StringBuffer和StringBuilder适合频繁修改String的场景,因为不会产生多余的“垃圾”
(3)StringBuilder效率比StringBuffer高,但StringBuffer是线程安全的

8. equal(),hashCode(),==的区别
(1)equal是内容相等
(2)hashCode是由内容计算hash值,即使不同的内容,计算结果也可能相同
(3)==是内存相等

9. 关于多继承
(1)接口支持多继承:interface A extends B, C{} 正确
(2)类不支持多继承:class A extends B, C{} 错误!假设B有方法fun(),C也有方法fun(),但二者具体实现不一样,试问:A中super.fun()该调用谁的?
(3)接口方法是抽象的,无具体实现,所以无上一条隐患
(4)问:Java支持多继承吗?答:Java支持多继承,因为Java接口支持多继承,但Java类不支持多继承