当前位置: 首页 > news >正文

【常用的队列总结】

文章目录

  • 队列的介绍
    • Queue队列的基本概念与操作
    • 队列的基本概念
  • 常见的队列介绍
    • 非阻塞队列
      • LinkedList:
      • ArrayDeque:
      • PriorityQueue:
    • 阻塞队列
      • ArrayBlockingQueue
      • LinkedBlockingQueue
      • PriorityBlockingQueue
    • DelayQueue
      • SynchronousQueue

队列的介绍

Queue队列的基本概念与操作

在 Java 中,队列(Queue)是一种常见的数据结构,它按照先进先出(FIFO)的原则管理元素。队列通常用于在数据集合中添加元素,并按照它们被添加的顺序移除元素。Java 提供了丰富的队列实现,可以满足不同场景下的需求。

队列的基本概念

队列是一种线性数据结构,它有两个基本操作:入队(enqueue)和出队(dequeue)。入队将元素添加到队列的末尾,而出队则从队列的头部获取并移除元素。因此,队列的特点是先进先出,即最先入队的元素最先出队。

常见的队列介绍

非阻塞队列

LinkedList:

在这里插入图片描述
LinkedList 是 Java 中实现了 List 接口的类,它基于双向链表数据结构实现了列表的操作。除了实现了 List 接口之外,LinkedList 还实现了 Queue 接口,因此也可以用作队列。
LinkedList的特点:
1.双向链表结构:每个节点都包含指向前一个节点和后一个节点的引用,这使得在任意位置插入或删除元素的操作都是高效的。
2.非线程安全:LinkedList 不是线程安全的,如果需要在多线程环境中使用,需要通过额外的同步手段来保证线程安全性。
常用的方法:

添加元素:
add(E e): 将指定元素添加到列表末尾。
add(int index, E element): 在指定位置插入元素。
获取元素:
get(int index): 返回列表中指定位置的元素。
getFirst(): 返回列表中的第一个元素。
getLast(): 返回列表中的最后一个元素。
删除元素:
remove(): 移除并返回列表中的第一个元素。
remove(int index): 移除列表中指定位置的元素。
removeFirst(): 移除并返回列表中的第一个元素。
removeLast(): 移除并返回列表中的最后一个元素。
队列操作:
offer(E e): 将指定元素添加到队列的尾部。
poll(): 移除并返回队列的头部元素。
peek(): 返回队列的头部元素,但不移除。
判断元素是否存在:
contains(Object element):检查链表是否包含指定元素。
获取链表大小和清空链表:
size():获取链表中元素的个数。
isEmpty():检查链表是否为空。
clear():清空链表中的所有元素。
栈操作(LIFO):
push(E e): 将元素压入栈(等同于 addFirst(E e))。
pop(): 移除并返回栈顶元素(等同于 removeFirst())。

ArrayDeque:

在这里插入图片描述
ArrayDeque 是 Java 中实现了 Deque 接口的类,是一个基于数组的双端队列。它在两端进行插入和删除操作都非常高效,是实现栈和队列操作的理想选择。ArrayDeque 可以用作栈、队列或双端队列。
ArrayDeque的特点:
1.双端队列:可以在队列的两端进行添加和删除操作。
2.基于数组:内部使用数组来存储元素,初始容量可以动态调整。
3.无界队列:可以根据需要自动扩容,因此不限制大小。
4.线程不安全:不是线程安全的,在多线程环境中使用时需要外部同步。
5.高效:相比 LinkedList,ArrayDeque 的性能更高,因为它没有节点的额外开销。
常用方法:

添加元素:
addFirst(E e): 在队列头部添加元素。
addLast(E e): 在队列尾部添加元素。
offerFirst(E e): 在队列头部添加元素,返回 true 如果添加成功。
offerLast(E e): 在队列尾部添加元素,返回 true 如果添加成功。
获取元素:
getFirst(): 获取队列头部的元素。
getLast(): 获取队列尾部的元素。
peekFirst(): 获取但不移除队列头部的元素,返回 null 如果队列为空。
peekLast(): 获取但不移除队列尾部的元素,返回 null 如果队列为空。
删除元素:
removeFirst(): 移除并返回队列头部的元素。
removeLast(): 移除并返回队列尾部的元素。
pollFirst(): 移除并返回队列头部的元素,返回 null 如果队列为空。
pollLast(): 移除并返回队列尾部的元素,返回 null 如果队列为空。
栈操作(LIFO):
push(E e): 将元素压入栈(等同于 addFirst(E e))。
pop(): 移除并返回栈顶元素(等同于 removeFirst())。

PriorityQueue:

在这里插入图片描述
PriorityQueue 是 Java 中提供的一个基于优先级堆实现的队列,它可以确保每次出队(移除)操作总是返回队列中优先级最高的元素。它在需要频繁访问和删除优先级最高的元素的场景下非常有用。

PriorityQueue的特点:
1.基于堆:PriorityQueue 使用二叉堆(通常是最小堆)实现,能够提供对最小(或最大)元素的高效访问和删除。
2.自然顺序或自定义顺序:可以按照元素的自然顺序(实现 Comparable 接口)或通过指定的 Comparator 进行排序。
3.无界队列:默认情况下是无界的,但其内部容量会根据需要自动扩展。
4.线程不安全:不是线程安全的,如果在多线程环境中使用,需要额外的同步。
5.元素排序:插入元素后不会保持队列的顺序,但在访问时总是返回优先级最高的元素。
常用方法:

添加元素:
add(E e): 将指定元素插入优先级队列,若插入失败抛出异常。
offer(E e): 将指定元素插入优先级队列,返回 true 如果插入成功。
获取元素:
peek(): 返回队列头部的元素(优先级最高的元素),但不移除,如果队列为空返回 null。
删除元素:
poll(): 移除并返回队列头部的元素(优先级最高的元素),如果队列为空返回 nullremove(Object o): 从队列中移除指定元素。
其他操作:
size(): 返回队列中的元素数量。
isEmpty(): 检查队列是否为空。

阻塞队列

ArrayBlockingQueue

在这里插入图片描述
ArrayBlockingQueue 是 Java 中的一种阻塞队列实现,它基于数组并具有固定容量。它在队列满或队列空时会使得相应的插入或移除操作阻塞,是在生产者-消费者场景中常用的一个类。
特点:
1.固定容量:ArrayBlockingQueue 在创建时必须指定容量。
2.线程安全:内部使用锁和条件变量来控制并发访问,确保线程安全。
3.FIFO顺序:元素按先进先出(FIFO)的顺序进行插入和删除。
常用方法:

添加元素
add(E e): 将指定元素插入队列,如果队列已满,则抛出 IllegalStateExceptionoffer(E e): 将指定元素插入队列,如果队列已满,则返回 falseput(E e): 将指定元素插入队列,如果队列已满,则阻塞直到有可用空间。
获取元素
peek(): 获取队列头部的元素,但不移除,如果队列为空,则返回 nullpoll(): 获取并移除队列头部的元素,如果队列为空,则返回 nulltake(): 获取并移除队列头部的元素,如果队列为空,则阻塞直到有可用元素。
其他操作
size(): 返回队列中的元素数量。
isEmpty(): 检查队列是否为空。
remainingCapacity(): 返回队列剩余的可用容量。

LinkedBlockingQueue

在这里插入图片描述
LinkedBlockingQueue 是 Java 中的一种阻塞队列实现,它基于链接节点(链表)并且可以选择有界或无界。它在多线程环境下非常适合用来实现生产者-消费者模型,因为它支持阻塞的插入和移除操作。
特点:
1.有界或无界:可以在初始化时指定容量,未指定时默认最大容量为 Integer.MAX_VALUE。
2.线程安全:使用独立的锁来控制插入和删除操作,确保线程安全。
3.FIFO顺序:元素按先进先出(FIFO)的顺序进行插入和删除。
4.高吞吐量:由于插入和删除操作使用了独立的锁,可以在多线程环境中提供较高的吞吐量。
常用方法:

添加元素
add(E e): 将指定元素插入队列,如果队列已满,则抛出 IllegalStateExceptionoffer(E e): 将指定元素插入队列,如果队列已满,则返回 falseput(E e): 将指定元素插入队列,如果队列已满,则阻塞直到有可用空间。
offer(E e, long timeout, TimeUnit unit): 将指定元素插入队列,在指定时间内等待可用空间,如果队列已满且超时,则返回 false。
获取元素
peek(): 获取队列头部的元素,但不移除,如果队列为空,则返回 nullpoll(): 获取并移除队列头部的元素,如果队列为空,则返回 nulltake(): 获取并移除队列头部的元素,如果队列为空,则阻塞直到有可用元素。
poll(long timeout, TimeUnit unit): 获取并移除队列头部的元素,在指定时间内等待,如果队列为空且超时,则返回 null。
其他操作
size(): 返回队列中的元素数量。
isEmpty(): 检查队列是否为空。
remainingCapacity(): 返回队列剩余的可用容量。

PriorityBlockingQueue

在这里插入图片描述
PriorityBlockingQueue 是 Java 中的一种阻塞队列实现,它基于优先级堆实现,元素按自然顺序或指定的比较器顺序进行排序。与普通的阻塞队列不同,PriorityBlockingQueue 中的元素不是按照插入顺序进行处理,而是按照优先级顺序进行处理。这使得它非常适合需要处理优先级任务的场景。
特点:
1.无界队列:PriorityBlockingQueue 是一个无界队列,其容量为 Integer.MAX_VALUE。
2.线程安全:内部使用并发控制机制,确保多线程环境下的安全性。
3.元素排序:元素按自然顺序(通过 Comparable 接口)或指定的比较器进行排序。
4.阻塞操作:在获取元素时会阻塞直到有可用元素。
常用方法:

添加元素
add(E e): 将指定元素插入队列。
offer(E e): 将指定元素插入队列。
put(E e): 将指定元素插入队列(由于队列无界,此方法实际上不会阻塞)。
offer(E e, long timeout, TimeUnit unit): 将指定元素插入队列,等待指定时间(由于队列无界,此方法实际上不会阻塞)。
获取元素
peek(): 获取队列头部的元素,但不移除,如果队列为空,则返回 nullpoll(): 获取并移除队列头部的元素,如果队列为空,则返回 nulltake(): 获取并移除队列头部的元素,如果队列为空,则阻塞直到有可用元素。
poll(long timeout, TimeUnit unit): 获取并移除队列头部的元素,等待指定时间,如果队列为空且超时,则返回 null。
其他操作
size(): 返回队列中的元素数量。
isEmpty(): 检查队列是否为空。

DelayQueue

在这里插入图片描述
DelayQueue 是 Java 中的一种阻塞队列实现,它适用于在一段时间之后才能获取元素的场景。队列中的元素必须实现 Delayed 接口,并在指定的延迟期满之后才能从队列中获取到。这使得 DelayQueue 特别适用于实现任务调度和超时任务处理等功能。
特点:
1.无界队列:DelayQueue 是一个无界队列,其容量为 Integer.MAX_VALUE。
2.线程安全:内部使用并发控制机制,确保多线程环境下的安全性。
3.基于时间的排序:元素根据剩余的延迟时间进行排序,延迟时间最短的元素优先处理。
4.元素必须实现 Delayed 接口:队列中的元素需要实现 getDelay(TimeUnit unit) 和 compareTo(Delayed o) 方法。
常用方法:

添加元素
add(E e): 将指定元素插入队列。
offer(E e): 将指定元素插入队列。
put(E e): 将指定元素插入队列(由于队列无界,此方法实际上不会阻塞)。
offer(E e, long timeout, TimeUnit unit): 将指定元素插入队列,等待指定时间(由于队列无界,此方法实际上不会阻塞)。
获取元素
peek(): 获取队列头部的元素,但不移除,如果队列为空或头部元素的延迟时间未到,则返回 nullpoll(): 获取并移除队列头部的元素,如果队列为空或头部元素的延迟时间未到,则返回 nulltake(): 获取并移除队列头部的元素,如果队列为空或头部元素的延迟时间未到,则阻塞直到有可用元素。
poll(long timeout, TimeUnit unit): 获取并移除队列头部的元素,等待指定时间,如果队列为空或头部元素的延迟时间未到且超时,则返回 null。
其他操作
size(): 返回队列中的元素数量。
isEmpty(): 检查队列是否为空。

SynchronousQueue

在这里插入图片描述
SynchronousQueue 是 Java 中的一种特殊的阻塞队列实现,它没有内部容量或者缓冲区,每一个 put 操作必须等待一个对应的 take 操作,反之亦然。这意味着在 SynchronousQueue 中,元素只能在生产者和消费者线程之间直接传递。
特点:
1.无容量:SynchronousQueue 没有容量,无法缓存元素。
2.线程安全:内部使用并发控制机制,确保多线程环境下的安全性。
3.直接传递:每个插入操作必须等待一个移除操作,反之亦然。
4.适用于移交:特别适用于需要在线程之间移交任务的场景。
常用方法:

添加元素
put(E e): 将指定元素插入队列,如果没有相应的取出操作,则阻塞。
offer(E e): 将指定元素插入队列,如果没有相应的取出操作,则返回 falseoffer(E e, long timeout, TimeUnit unit): 将指定元素插入队列,等待指定时间,如果没有相应的取出操作,则返回 false。
获取元素
take(): 获取并移除队列中的元素,如果没有相应的插入操作,则阻塞。
poll(): 获取并移除队列中的元素,如果没有相应的插入操作,则返回 nullpoll(long timeout, TimeUnit unit): 获取并移除队列中的元素,等待指定时间,如果没有相应的插入操作,则返回 null。
其他操作
size(): 始终返回 0,因为 SynchronousQueue 不存储任何元素。

相关文章:

【常用的队列总结】

文章目录 队列的介绍Queue队列的基本概念与操作队列的基本概念 常见的队列介绍非阻塞队列LinkedList:ArrayDeque:PriorityQueue: 阻塞队列ArrayBlockingQueueLinkedBlockingQueuePriorityBlockingQueue DelayQueueSynchronousQueue 队列的介绍 Queue队列的基本概念与操作 在 …...

机器学习过拟合和欠拟合!看这一篇文章就够了 建议收藏!(上篇)

在机器学习中,有一项非常重要的概念,那就是:过拟合(Overfitting)和欠拟合(Underfitting)。 它们涉及到机器学习中常见的两种模型性能问题,分别表示模型在训练数据上表现得过于复杂或…...

关于阳光雨露外派联想的面试感想

最近在找工作,接到了一个阳光雨露外派联想的面试邀请。说实在的一开始就有不对劲的感觉。想必这就是大厂的自信吧,上就问能不能现场面试,然后直接发面试邀请。这时候我倒是没觉得有啥问题。 然后今天就去面试去了,住的比较偏&…...

深度神经网络介绍与实战

一、介绍 深度神经网络(Deep Neural Networks,DNNs)是一种强大的机器学习算法,被广泛应用于计算机视觉、自然语言处理、语音识别等领域。它是人工神经网络的一种扩展,包含多个隐藏层,每一层都由多个神经元组成。 与传统的机器学习算法相比,深度神经网络具有以下特点:…...

图解 Transformer

节前,我们星球组织了一场算法岗技术&面试讨论会,邀请了一些互联网大厂朋友、参加社招和校招面试的同学. 针对算法岗技术趋势、大模型落地项目经验分享、新手如何入门算法岗、该如何准备、面试常考点分享等热门话题进行了深入的讨论。 汇总合集&…...

SpringCloud配置文件bootstrap不生效问题解决

解决方案&#xff1a; 情况一、SpringBoot 版本 小于 2.4.0 版本&#xff0c;添加以下依赖 <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-context</artifactId> </dependency> 情况二、SpringBoot…...

Java面试八股之自旋是什么意思

Java中的自旋是什么意思 自旋是多线程编程中的一种同步机制&#xff0c;尤其在Java中与锁的实现密切相关。当一个线程尝试获取某个锁&#xff08;如内置锁或显式锁&#xff09;时&#xff0c;如果锁已被其他线程持有&#xff0c;通常的做法是将该线程置于阻塞状态&#xff0c;…...

做好随时离开的准备:前一天还在为618加班到凌晨,第二天就被裁了

今日感悟 最近&#xff0c;一则令人唏嘘的新闻在网络上引起了广泛关注&#xff1a;一名员工前一天还在为618大促活动加班到凌晨&#xff0c;身心疲惫&#xff0c;然而第二天却收到了裁员通知&#xff0c;顿时陷入了失业的困境。 这则新闻不仅揭示了职场竞争的残酷现实&#xff…...

利用ESP32(Arduino IDE)向匿名上位机发送欧拉角

文章目录 一. 匿名上位机介绍二. 匿名协议说明1. 匿名协议官方说明文档2. 协议说明 三. 向匿名上位机发送数据(基于Arduino IDE的esp32)四. 运行效果 一. 匿名上位机介绍 匿名上位机官方介绍视频 匿名上位机官方下载 二. 匿名协议说明 1. 匿名协议官方说明文档 官方对于协…...

Java开发工具类(JDK、Hutool、Guava)

目录 Java开发常用的工具类1、JDK自带程序读取控制台输入内容&#xff08;调试程序或者学习的时候比较有用&#xff09;Arrays工具类 数组转集合Collections 集合工具类 排序Collections 集合工具类 查找Lambda表达式 操作集合 收集、转map、分组 2、Apache 的 commons-lang3 和…...

TCP协议的相关特性

目录 正文&#xff1a; 1.可靠性 2.连接管理 3.滑动窗口 4.流量控制 5.拥塞控制 6.延迟应答 7.捎带应答 总结&#xff1a; 正文&#xff1a; 1.可靠性 TCP协议是一个有连接&#xff0c;可靠传输&#xff0c;面向字节流&#xff0c;全双工的协议。其中可靠传输的实现…...

Lombok,一款超级强大的Java工具库

在软件开发过程中&#xff0c;繁琐的模板代码经常让开发者感到烦恼。 Lombok 是一款 Java 库&#xff0c;能够帮助开发者减少这些冗余代码&#xff0c;提高开发效率。本文将介绍 Lombok 的基本概念、安装和配置方法&#xff0c;以及如何在实际项目中使用它。 Lombok 是什么 L…...

FreeBSD下使用原生虚拟机管理器bhyve

hbyve简介 自 FreeBSD 10.0-RELEASE 起&#xff0c;BSD 许可的 bhyve 虚拟机管理器已成为底层系统不可或缺的一部分。bhyve 强大而灵活&#xff0c;支持多种客户机操作系统&#xff0c;涵盖 FreeBSD、OpenBSD 以及多个 Linux 发行版。在默认配置下&#xff0c;bhyve 提供对串行…...

CTFshow之文件上传web入门151关-161关解密。包教包会!!!!

这段时间一直在搞文件上传相关的知识&#xff0c;正好把ctf的题目写了写&#xff0c;也算是给自字做个总结&#xff01; 不过ctf有一个缺点就是所有的测试全部是黑盒测试&#xff0c;无法从代码层面和大家解释&#xff0c;我找个时间把upload-labs靶场做一做给大家讲讲白盒的代…...

【学习记录】服务器转发使用tensorboard

场景 代码在服务器上运行&#xff0c;想使用tensorboard查看训练的过程。 但是服务器上不能直接访问地址&#xff0c;所以要转发端口到本地&#xff0c;从而在本地网页中能够打开tensorboard。 参考&#xff1a;https://zhuanlan.zhihu.com/p/680596384 这时我们需要建立本地…...

类型转换之显式转换

显式转换——>手动处理&#xff0c;强制转换 括号强转 作用&#xff1a;一般情况下&#xff0c;将高精度的类型转换为低精度。 语法&#xff1a;变量类型 变量名 &#xff08;变量类型&#xff09;变量; 注意&#xff1a;精度问题&#xff0c;范围问题。 括号强转&#x…...

Mybatis多表查询,报错:Column ‘id‘ in field list is ambiguous

错误原因&#xff1a; Mybatis 多表查询时&#xff0c;多个表有相同名字的字段&#xff0c;比如 id&#xff0c;名字重复&#xff0c;没有指定对应的表名。 有两个地方需要注意&#xff1a;(1)将其中一个重复字段的 Mybatis的 column 修改为其他的名字。(2)字段加上对应的表名…...

PyCharm面板ctrl+鼠标滚轮放大缩小代码

1.【File】➡【Settings】 2.点击【Keymap】&#xff0c;在右边搜索框中搜incre&#xff0c;双击出现的【Increase Font Size】 3.在弹出的提示框中选择【Add Mouse Shortcut】 4.弹出下面的提示框后&#xff0c;键盘按住【ctrl】&#xff0c;并且上滑鼠标滚轮。然后点击【O…...

【Qt】数据库(一)SQLITE创建、增删查改

填坑1&#xff1a;如何连续插入 汇总SQlite语句 创建表格&#xff1a;create table <table_name> (f1 type1, f2 type2,…); 增&#xff1a;insert into <table_name> values (value1, value2,…); 改&#xff1a;update <table_name> set <f1value1>,…...

【模拟面试问答】力扣165题:比较版本号(逐个比较与双指针法详解及模拟面试问答)

在本篇文章中&#xff0c;我们将详细解读力扣第165题“比较版本号”。通过学习本篇文章&#xff0c;读者将掌握如何使用多种方法来解决这一问题&#xff0c;并了解相关的复杂度分析和模拟面试问答。每种方法都将配以详细的解释和ASCII图解&#xff0c;以便于理解。 问题描述 …...

Auto-Coder使用GPT-4o完成:在用TabPFN这个模型构建一个预测未来3天涨跌的分类任务

通过akshare库&#xff0c;获取股票数据&#xff0c;并生成TabPFN这个模型 可以识别、处理的格式&#xff0c;写一个完整的预处理示例&#xff0c;并构建一个预测未来 3 天股价涨跌的分类任务 用TabPFN这个模型构建一个预测未来 3 天股价涨跌的分类任务&#xff0c;进行预测并输…...

2.Vue编写一个app

1.src中重要的组成 1.1main.ts // 引入createApp用于创建应用 import { createApp } from "vue"; // 引用App根组件 import App from ./App.vue;createApp(App).mount(#app)1.2 App.vue 其中要写三种标签 <template> <!--html--> </template>…...

python如何将word的doc另存为docx

将 DOCX 文件另存为 DOCX 格式&#xff08;Python 实现&#xff09; 在 Python 中&#xff0c;你可以使用 python-docx 库来操作 Word 文档。不过需要注意的是&#xff0c;.doc 是旧的 Word 格式&#xff0c;而 .docx 是新的基于 XML 的格式。python-docx 只能处理 .docx 格式…...

Linux-07 ubuntu 的 chrome 启动不了

文章目录 问题原因解决步骤一、卸载旧版chrome二、重新安装chorme三、启动不了&#xff0c;报错如下四、启动不了&#xff0c;解决如下 总结 问题原因 在应用中可以看到chrome&#xff0c;但是打不开(说明&#xff1a;原来的ubuntu系统出问题了&#xff0c;这个是备用的硬盘&a…...

Spring AI 入门:Java 开发者的生成式 AI 实践之路

一、Spring AI 简介 在人工智能技术快速迭代的今天&#xff0c;Spring AI 作为 Spring 生态系统的新生力量&#xff0c;正在成为 Java 开发者拥抱生成式 AI 的最佳选择。该框架通过模块化设计实现了与主流 AI 服务&#xff08;如 OpenAI、Anthropic&#xff09;的无缝对接&…...

HTML前端开发:JavaScript 常用事件详解

作为前端开发的核心&#xff0c;JavaScript 事件是用户与网页交互的基础。以下是常见事件的详细说明和用法示例&#xff1a; 1. onclick - 点击事件 当元素被单击时触发&#xff08;左键点击&#xff09; button.onclick function() {alert("按钮被点击了&#xff01;&…...

在鸿蒙HarmonyOS 5中使用DevEco Studio实现录音机应用

1. 项目配置与权限设置 1.1 配置module.json5 {"module": {"requestPermissions": [{"name": "ohos.permission.MICROPHONE","reason": "录音需要麦克风权限"},{"name": "ohos.permission.WRITE…...

论文笔记——相干体技术在裂缝预测中的应用研究

目录 相关地震知识补充地震数据的认识地震几何属性 相干体算法定义基本原理第一代相干体技术&#xff1a;基于互相关的相干体技术&#xff08;Correlation&#xff09;第二代相干体技术&#xff1a;基于相似的相干体技术&#xff08;Semblance&#xff09;基于多道相似的相干体…...

基于SpringBoot在线拍卖系统的设计和实现

摘 要 随着社会的发展&#xff0c;社会的各行各业都在利用信息化时代的优势。计算机的优势和普及使得各种信息系统的开发成为必需。 在线拍卖系统&#xff0c;主要的模块包括管理员&#xff1b;首页、个人中心、用户管理、商品类型管理、拍卖商品管理、历史竞拍管理、竞拍订单…...

【Android】Android 开发 ADB 常用指令

查看当前连接的设备 adb devices 连接设备 adb connect 设备IP 断开已连接的设备 adb disconnect 设备IP 安装应用 adb install 安装包的路径 卸载应用 adb uninstall 应用包名 查看已安装的应用包名 adb shell pm list packages 查看已安装的第三方应用包名 adb shell pm list…...