数组
特点:有序(插入顺序)、可重复、固定长度、增删慢、查找快。
适用场景:适用于查找或遍历操作的场景适用。
基于数组的集合:ArrayList(非线程安全)、Vector(线程安全)
链表
特点:有序(插入顺序)、可重复、无固定长度、增删快、查找慢。
适用场景:适用于对集合数据多新增或修改操作的场景。
基于链表的集合:LinkedList(非线程安全)。
链表的实现
单向链表
单链表就是链表中的某个节点(Node),只指向它的下一个节点。
双向链表
双向链表就是链表中的某个节点,同时指向该节点的上一个和下一个节点的信息。
头节点:上一个节点信息为空。
尾节点:下一个节点信息为空。
Java常见算法
递归
递归就是方法的自我调用,例如下图:
程序会一直输出hello,类似死循环。递归程序开始后,就会有N个say()的方法等待本方法内的say()方法执行完毕自己才结束。
注意事项
- 递归调用必须在某个条件下结束,否则就是死循环。
- 递归的层数不宜太多,否则可能会出现堆栈溢出。
- 构造方法不能递归调用。
阶乘
阶乘:5的阶乘就是 5 * 4 * 3 * 2 * 1
- 使用循环方式
- 使用递归方式
排序算法
冒泡排序
冒泡排序的特点是小数下沉大数上浮,类似看鱼吐气泡。
快速排序
快速排序的基本思想:通过一趟排序将待排记录分隔成独立的两部分,其中一部分记录的关键字(通常使用第一个或最后一个元素)均比另一部分的关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有序。
其它排序
排序算法有很多种,简单选择排序、二分查找排序、堆排序、快速排序等等。
http://www.codeceo.com/article/8-java-sort.html
稳定性指:数据量不管大小,算法的时间复杂度和空间复杂度是否变化。
表格中排序算法非特殊情况,快速排序性能最好。
查找算法
顺序查找
顺序查找顾名思义就是按照顺序依次查找。
二分查找
二分查找(Binary Search)也叫作折半查找。二分查找有两个要求:一个是数列有序(可利用排序算法进行排序,如冒泡、快排等),二是数列使用顺序存储结构(比如数组、集合)。
算法核心:将数据排序后,折半,并找到中间元素。如果目标值小于中间元素,就在左边的数据中在折半,选取新的中间元素,如果目标值还小于新的中间元素就继续折半。直到目标值等于中间值结束。
数据操作小技巧
去重
可以利用一些不可重复的数据结构完成,如Map、Set。
统计