选择排序
链表
package com.damu.mc; import java.util.ArrayList; import java.util.LinkedList; import java.util.List;public class LinkedTest { public static void main(String[] args) { // 数组实现 List<String> array = new ArrayList<>(); // 链表实现 List<String> linked = new LinkedList<>(); // 新增数据 long start = System.nanoTime(); for (int i = 0; i < 1000; i++) { array.add("hello damu"); // 769 9897 // 查询、修改 } long end = System.nanoTime(); System.out.println("array: " + (end - start)); long start2 = System.nanoTime(); for (int i = 0; i < 1000; i++) { linked.add("hello damu"); // 367 9529 // 新增、删除 } long end2 = System.nanoTime(); System.out.println("linked: " + (end2 - start2)); }}
队列代码
package com.damu.mc;
import java.util.Queue;
import java.util.concurrent.ArrayBlockingQueue;
/**
* 队列操作:项目需求
*
* 高并发的业务操作,需要同时处理多个用户的请求(抢购系统)
* 问题:后端的程序不能及时的处理所有用户的请求
* 缓冲操作:将用户的请求排队存放(有顺序的存放),让后台系统逐个处理
* 思考:使用什么样的技术实现起来更加友好?
* 可以使用普通集合实现
* 提高效率,使用多线程操作,普通集合存在并发问题需要处理
* 可以使用线程安全的集合
* 使用多线程的情况下,完成高效率的操作
* 处理完每个请求之后,需要删除对应的 请求数据
* 可以使用队列操作(线程安全)
* 既能保证多线程情况下的高效率处理
* 能保证每个请求处理之后自动删除
* [
* > 保存每个抢购请求时--> 入队操作 offer(url)
* > 处理每个抢购请求时--> 出队操作 poll()
* ]
*/
public class QueueTest {
public static void main(String[] args) {
// 声明一个队列:存储3个数据
Queue<String> msg = new ArrayBlockingQueue<String>(3);
msg.add("damu"); // Collections集合的方法
msg.offer("大牧"); // 队列的操作方法:增加数据:入队
msg.element(); // 查询队首位置的第一个数据:不删除
msg.poll(); // 查询并的删除队首位置的第一个数据:head/front
msg.size(); // Collections集合的方法,查询队列中的所有数据总数
}
}
队列代码
package com.damu.mc;
import java.util.Queue;
import java.util.concurrent.ArrayBlockingQueue;
/**
* 队列操作:项目需求
*
* 高并发的业务操作,需要同时处理多个用户的请求(抢购系统)
* 问题:后端的程序不能及时的处理所有用户的请求
* 缓冲操作:将用户的请求排队存放(有顺序的存放),让后台系统逐个处理
* 思考:使用什么样的技术实现起来更加友好?
* 可以使用普通集合实现
* 提高效率,使用多线程操作,普通集合存在并发问题需要处理
* 可以使用线程安全的集合
* 使用多线程的情况下,完成高效率的操作
* 处理完每个请求之后,需要删除对应的 请求数据
* 可以使用队列操作(线程安全)
* 既能保证多线程情况下的高效率处理
* 能保证每个请求处理之后自动删除
* [
* > 保存每个抢购请求时--> 入队操作 offer(url)
* > 处理每个抢购请求时--> 出队操作 poll()
* ]
*/
public class QueueTest {
public static void main(String[] args) {
// 声明一个队列:存储3个数据
Queue<String> msg = new ArrayBlockingQueue<String>(3);
msg.add("damu"); // Collections集合的方法
msg.offer("大牧"); // 队列的操作方法:增加数据:入队
msg.element(); // 查询队首位置的第一个数据:不删除
msg.poll(); // 查询并的删除队首位置的第一个数据:head/front
msg.size(); // Collections集合的方法,查询队列中的所有数据总数
}
}
队列
队列
栈
数组结构
front == tail :空队列
新数据入队,后置计数器自增(tail++ )
队列长度:tail - front
数据出队:数据从队首出去(删除),前置计数器自增(front++)
入队和出队操作过程中,为了有效利用空间,会进行数据平移(消耗系统性能),为了改进这个缺点,我们可以用循环队列,就是不用再平移了
循环队列的判断
front == tail 空队列
(front+1) % len = =front 说明队列中的数据满了
数组(ArrayList):查询、修改效率高;新增、删除效率低;
列表(LinkedList):查询、修改效率低;新增、删除效率高;
冒泡排序 空间O(1)
时间: O(1)
最坏 o(n评方)