自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(196)
  • 收藏
  • 关注

原创 Android初学者书籍推荐

从学安卓到用安卓再到教安卓,我翻阅了不下二十本书,培养了多位Android开发者,《疯狂Android讲义》的第二版、第三版、第四版,《第一行代码Android》的第二版、第三版,各种大学出的Android教材,培训机构出的Android教材等等。下面挑几本比较好的,点评一下,仅供参考,不当之处还望指正。

2024-07-11 11:03:18 2345

原创 Android应用开发项目式教程——开篇

此类竞赛包括互联网+创新创业大赛、“挑战杯”、中美青年创客大赛等,此类竞赛没有限定题目,提倡创新创意,Android应用开发作为重要的客户端技术,可以作为此类竞赛作品的主体,也可以作为此类竞赛作品的配套或补充,以扩大作品用户群,提高获奖概率。本人从事Android应用开发十余年,指导大学生竞赛十余载,多次指导竞赛任务的Android应用开发,开设本专栏,介绍如何快速入门Android应用开发并将其应用于各类竞赛,同时顺带聊聊比赛感想。作为开篇,本文介绍与Android应用开发相关的竞赛。

2024-06-25 19:40:12 368

原创 Java笔试面试题AI答之面向对象(10)

因此,当你尝试在子类中创建一个与父类中签名完全相同的静态方法时,这并不是方法的覆盖(Override),而是方法的隐藏(Hide)。但是,对于静态方法,由于它们属于类级别,所以子类中的静态方法并不会覆盖父类中的静态方法,而是隐藏了它。这样,只有第一次创建实例的时候才会进行同步,一旦实例被创建,之后获取实例的时候就直接返回了,避免了每次获取实例时都要进行同步,从而提高了效率。:Java的设计者希望保持语言的简单性,避免增加复杂的特性,如运算符重载,这可能会使语言更难学习和使用。允许在运行时动态加载类。

2024-08-31 08:27:40 736

原创 Java笔试面试题AI答之面向对象(9)

父类静态变量和静态代码块(按出现顺序)子类静态变量和静态代码块(按出现顺序)父类非静态变量初始化父类构造代码块父类构造方法子类非静态变量初始化子类构造代码块子类构造方法需要注意的是,静态成员(包括静态变量和静态代码块)的初始化只会在类加载时执行一次,与创建多少个类的实例无关。而非静态成员的初始化和构造方法的调用则是在每次创建类的实例时都会进行的。此外,如果子类构造方法中显式调用了父类的有参构造方法,则不会调用父类的无参构造方法。场景描述。

2024-08-31 08:19:35 699

原创 Java笔试面试题AI答之面向对象(8)

浅拷贝:只复制对象本身和基本数据类型字段,对于引用类型字段,只复制引用而不复制引用的对象。深拷贝:不仅复制对象本身和基本数据类型字段,还复制引用类型字段指向的对象,并创建全新的对象实例。用途super()用于调用父类构造方法,确保父类被正确初始化;this()用于调用当前类的另一个构造方法,实现代码复用。调用时机和位置:两者都必须是构造方法中的第一条语句(super()除外,如果它是自动插入的)。this()调用必须在super()调用之后(如果存在super()调用)。限制。

2024-08-30 21:20:02 1539

原创 Java笔试面试题AI答之面向对象(7)

Java中的成员变量(也称为字段或属性)和局部变量是两种不同类型的变量,它们在多个方面存在显著差异。这些差异主要体现在以下几个方面:定义位置:生命周期:作用域:默认值:访问修饰符:存储位置:了解这些差异有助于更好地编写和组织Java代码,以及理解程序的行为和内存管理。在Java中,创建对象通常使用关键字作为运算符。关键字用于分配内存给对象,并返回指向该内存的引用。这个引用可以被存储在变量中,之后可以通过这个变量来访问对象。对象实体(Object Instance):对象引用(Object Reference

2024-08-30 21:13:10 1394

原创 Java笔试面试题AI答之面向对象(6)

静态变量:被static关键字修饰的变量,属于类级别,不属于任何特定对象实例。这意味着静态变量在内存中只有一份拷贝,由所有实例共享。实例变量:没有static关键字修饰的变量,属于对象级别,每个对象实例都有自己的实例变量副本。

2024-08-28 13:15:46 958

原创 Java笔试面试题AI答之面向对象(5)

在大多数情况下,Java的包装类实例是不可变的。这意味着一旦你创建了一个包装类对象并给它赋了一个值,你就不能改变这个对象所持有的值了。然而,需要注意的是,尽管这些类被设计为不可变,但某些情况下(如Boolean的弃用构造函数)可能会创建出可变实例,但这并不是推荐的做法。此外,浮点数(Float和Double)的精度问题可能导致看似“变化”的行为,但这与对象本身的状态是否可变是两个不同的概念。

2024-08-28 13:07:42 765

原创 Java笔试面试题AI答之面向对象(4)

抽象类是一个不完全的类,它不能被实例化。抽象类通常包含一个或多个抽象方法,即只有声明没有实现的方法。但这不是必须的,抽象类也可以包含已实现的方法。抽象类的主要目的是提供一个公共的接口给其子类,子类需要实现抽象类中声明的所有抽象方法(除非子类也是抽象的)。抽象类可以使用abstract关键字来声明。

2024-08-28 08:19:19 903

原创 Java笔试面试题AI答之面向对象(3)

关联:对象之间的一种较为松散的关系,没有明显的所有权或包含关系。聚合:一种特殊类型的关联,表示“整体-部分”的关系,但整体与部分可以独立存在。组合:另一种特殊类型的关联,也表示“整体-部分”的关系,但整体与部分的关系更为紧密,部分不能脱离整体而独立存在,整体的生命周期控制部分的生命周期。理解这些概念对于设计具有良好结构和可维护性的软件系统至关重要。聚集关系(Aggregation)定义:聚集关系表示一种较弱的“整体-部分”关系,其中整体对象拥有部分对象,但这些部分对象可以独立于整体对象存在。

2024-08-28 08:15:19 1165

原创 Java笔试面试题AI答之面向对象(2)

关联:两个类之间存在某种联系,但关系较弱,没有特定的语义约束。聚合:表示“整体-部分”的关系,但整体与部分之间是可分离的。组合:也表示“整体-部分”的关系,但整体与部分之间是不可分离的,部分的生命周期依赖于整体。在设计类结构时,正确理解和使用这些关系可以帮助我们构建更加合理、易于维护和扩展的系统。首先,我们定义一个支付策略的接口,所有具体的支付方式都将实现这个接口。关联:表示类之间的连接,可以是任意的,不强调拥有或整体与部分的关系。聚合。

2024-08-27 21:55:56 848

原创 Java笔试面试题AI答之面向对象(1)

抽象是将复杂现实世界的简化表示的过程。在面向对象编程中,抽象是通过类(Class)来实现的。类定义了对象的属性和方法,但它并不表示具体的对象实例。通过抽象,我们可以忽略对象的细节,只关注对象的行为和属性。此外,Java中的抽象类(Abstract Class)和接口(Interface)是实现抽象的重要工具,它们允许我们定义类的部分或全部方法为抽象方法,这些抽象方法没有实现体,必须由子类或实现类提供具体的实现。

2024-08-27 19:29:00 838

原创 Java笔试面试题AI答之集合(10)

HashMap 在 Java 中是一种基于哈希表的 Map 接口实现,用于存储键值对(key-value pairs)。在 HashMap 中,键(key)必须是唯一的,并且 HashMap 通过键的哈希码(hashCode)来确定元素在哈希表中的存储位置。这种机制使得 HashMap 的查找、插入和删除操作都非常高效,平均时间复杂度为 O(1)。String 和 Integer 这样的包装类特别适合作为 HashMap 的键(key),主要原因有以下几点:不可变性(Immutability):String

2024-08-27 18:46:16 900

原创 Java笔试面试题AI答之集合(9)

在开放寻址法中,当哈希冲突发生时,不是将冲突的元素存储在链表中,而是寻找数组中的下一个空闲位置来存储该元素。然而,由于哈希函数的输出范围有限(通常是数组的长度),而输入范围可能非常大,因此不同的键可能会映射到数组的同一个位置,这种现象称为哈希冲突(Hash Collision)。get()操作的过程与put()操作类似,也是首先计算键的hashCode值并转换成数组的下标,然后遍历对应位置上的链表或红黑树来查找是否存在相同的键。:确保不同的元素(即不相等的元素)尽可能地映射到不同的桶中,从而减少哈希冲突。

2024-08-27 09:05:45 821

原创 Java笔试面试题AI答之集合(8)

定义:fail-fast机制是Java集合框架(Collection Framework)中的一种错误检测机制。当多线程环境下一个线程在遍历集合时,若另一个线程对集合的结构进行了修改(如添加、删除元素),则遍历的线程会立即抛出异常,从而快速失败。目的:通过立即抛出异常来通知程序员发生了并发修改,避免程序出现未定义行为,确保线程安全。fail-fast机制是Java集合框架中一种重要的错误检测机制,它通过抛出异常来防止多线程环境下的并发修改问题。

2024-08-27 08:59:41 802

原创 Java笔试面试题AI答之集合(7)

HashMap 的长度(即容量,Capacity)设计为 2 的 N 次方,主要是出于优化哈希表性能和减少哈希冲突(Collision)的考虑。优化索引计算当 HashMap 的容量是 2 的 N 次方时,可以通过位运算(位与操作)来快速计算元素的索引位置,这比使用取模运算()要快得多。位与操作()通常比取模运算更高效,因为位与操作可以直接在硬件层面执行,而取模运算则可能需要更多的计算步骤。具体来说,如果 HashMap 的容量是2^n,那么对于任意哈希值hash,其索引位置可以通过来计算。这是因为。

2024-08-27 08:50:33 886

原创 Java笔试面试题AI答之集合(6)

ConcurrentHashMap和HashTable在线程安全机制、支持null键和值、迭代器和分割器、性能和扩展性等方面存在明显的区别。在选择使用时,应根据具体的应用场景和需求来决定使用哪个类。在需要高并发性能和灵活性的场景中,ConcurrentHashMap通常是更好的选择。

2024-08-26 09:55:03 991

原创 Java笔试面试题AI答之集合(5)

选择使用 Array 还是 ArrayList 取决于你的具体需求,包括是否需要动态调整大小、是否关心性能、是否需要类型安全等。在大多数情况下,如果你不确定数据集合的大小是否会改变,或者需要更多的功能,ArrayList 是一个更好的选择。如果你需要高性能的随机访问或者已知数据集合的大小不会改变,那么数组可能更合适。

2024-08-26 09:50:16 1113

原创 Java笔试面试题AI答之集合(4)

综上所述,集合框架中的泛型通过提供类型安全、消除强制类型转换、提高代码的可读性和可维护性、提高性能以及与集合框架的集成等优点,极大地增强了Java集合框架的功能和实用性。总之,Java集合框架是Java平台中非常重要的一部分,它提供了一套统一的集合操作接口和实现,使得程序员可以更加方便地操作集合类,提高了程序的设计效率和运行质量。接口的主要原因是它们在 Java 集合框架中扮演着截然不同的角色,并提供了不同的功能集合。在Java集合框架中,如果需要支持克隆或序列化操作,通常是通过具体的集合实现类来实现的。

2024-08-25 21:41:55 952

原创 Java笔试面试题AI答之集合(3)

集合类型默认大小扩容机制ArrayList底层数组默认初始化大小为10(但无参构造函数初始化为空数组,首次添加元素时分配大小为10的数组)扩容时,通常会创建一个新的数组,其大小为原数组大小的1.5倍(向下取整),但最大不超过HashMap16扩容时,通常会创建一个新的数组,其大小为原数组大小的2倍,并重新计算哈希值这些默认大小和扩容机制是Java集合框架中为了优化性能和内存使用而设计的。在实际应用中,如果已知将要存储的元素数量,可以通过构造函数指定初始容量来避免不必要的扩容操作,从而提高性能。

2024-08-25 21:37:51 789

原创 Java笔试面试题之多线程偏门考点总结

这些考点通常需要在深入理解和实践Java多线程编程的基础上才能全面掌握。在面试中,如果面试官希望考察面试者的深度和广度,可能会涉及这些偏门的考点。

2024-08-25 14:50:31 293

原创 Java笔试面试题之多线程补充考点总结

请注意,这些考点可能并不完全适用于所有Java多线程面试,在准备面试时,根据职位要求和公司文化,选择合适的考点进行深入学习和准备是很重要的。常见考点虽然总结涵盖了文档中的大部分考点,但仍然存在一些未在总结中明确提到的具体考点。

2024-08-25 14:48:47 204

原创 Java笔试面试题之多线程常见考点总结

这些考点涵盖了Java多线程编程的各个方面,从基本概念到高级应用,再到性能优化和调试监控,都是面试中常见的考察点。掌握这些知识点,对于提高Java并发编程能力具有重要意义。Java多线程面试题涵盖了Java多线程编程的多个重要方面,主要考察面试者对Java并发编程的理解和应用能力。

2024-08-25 14:44:40 434

原创 Java笔试面试题AI答之线程(24)

Thread 类的 sleep() 和 yield() 方法被设计为静态方法,主要是因为它们都是作用于当前正在执行的线程,而不是某个特定的 Thread 对象。这种设计方式避免了程序员在调用这些方法时可能产生的误解,并简化了多线程编程的复杂性。同时,这也符合 Java 编程语言的设计哲学,即尽可能减少不必要的对象创建和状态管理,以提高程序的性能和可维护性。Java 中的Timer类是一个工具类,用于在后台线程中安排任务进行单次或重复执行。它提供了一种简单的方式来调度任务在将来的某个时间执行,或者定期地执行。

2024-08-25 12:23:15 1088

原创 Java笔试面试题AI答之线程(23)

定义:线程优先级是操作系统用于决定哪个线程应该获得CPU时间的一个标准。在多线程环境中,优先级高的线程通常会比优先级低的线程更早获得CPU时间。范围:不同编程语言和操作系统中,线程优先级的表示范围和具体数值可能有所不同。例如,在Java中,线程优先级用整数表示,范围从1(最低)到10(最高);而在某些Windows API中,线程优先级可能用0到31的整数表示,其中0为最低,31为最高。

2024-08-25 12:22:58 874

原创 Java笔试面试题AI答之线程(25)

继承Thread类适合简单的应用场景,但存在Java单继承的限制和类耦合性问题。实现Runnable接口是更推荐的方式,因为它提供了更高的灵活性和复用性,且与线程池等高级功能兼容。**使用(线程池)**是处理大量并发任务时的首选方式,因为它能够有效地管理线程资源,提高系统性能。然而,它也需要更多的配置和管理工作。在Java中,BIO(Blocking I/O,阻塞式I/O)是一种传统的I/O模型,它属于同步阻塞I/O。BIO是JDK 1.4之前的标准Java I/O模型,用于处理输入输出操作。

2024-08-25 12:22:00 793

原创 Java笔试面试题AI答之线程(22)

同步集合并发集合应用场景适用于简单的并发场景,线程对集合的访问和修改不频繁适用于高并发场景,多个线程需要频繁地读取和修改集合的不同部分线程安全性的实现通过关键字或显式锁机制来保证线程安全采用多种高效的并发控制机制,如分段锁、CAS等性能与可扩展性可能因同步机制的引入而影响性能,尤其是在高并发场景下通常具有更好的性能和可扩展性,支持更多的并发操作在选择使用哪种集合时,需要根据具体的应用场景和需求进行权衡。如果应用场景中并发不高,且对性能要求不是非常严格,可以选择同步集合;

2024-08-25 12:02:35 691

原创 Java笔试面试题AI答之线程(21)

这是因为 Java 的同步机制(包括 synchronized 关键字)具有使缓存失效的作用,它确保了在同步块中访问的共享变量对于所有线程都是可见的。通过在每个修改操作(如添加、设置等)时,都会先复制底层数组,并在复制的数组上进行修改,最后再将原数组引用指向新数组的方式,来实现线程安全。在两个线程间共享数据是并发编程中常见的一个需求,也是实现线程间通信的一种方式。竞态条件(race condition)是并发编程中常见的问题,它发生在两个或多个线程访问共享资源,并且它们的执行顺序可能导致不期望的结果时。

2024-08-25 11:59:34 474

原创 Java笔试面试题AI答之线程(20)

并发容器的实现是Java并发编程中的一个重要概念,它旨在允许多个线程同时访问和操作容器内的数据,同时保证线程安全和数据一致性。并发容器指的是允许多个线程同时访问和操作容器内的数据,而无需进行外部同步的容器。这些容器通过内部机制(如锁、CAS、COW等)来保证线程安全,从而提高了并发性能。并发容器的实现通过内部机制(如锁、CAS、COW等)来保证线程安全和数据一致性,同时提高了并发性能。不同的并发容器适用于不同的并发场景和数据访问模式。在Java中,包提供了多种并发容器供开发者使用。

2024-08-24 14:29:35 710

原创 Java笔试面试题AI答之线程(19)

Java中的并发和并行是两种不同的任务执行方式,分别适用于不同的场景和需求。在单核处理器上,主要通过并发来提升性能;而在多核处理器上,则可以通过并行来进一步提高程序的执行效率。了解并发和并行的区别,有助于更好地设计和实现高效的Java程序。线程组(ThreadGroup)是Java中用于管理线程的一个类,即类。在Java中,每一个线程都归属于某个线程组,这个线程组负责管理其内的线程。

2024-08-24 14:25:51 689

原创 Java笔试面试题AI答之线程(18)

AQS(AbstractQueuedSynchronizer)是Java中的一个抽象类,主要用于构建锁和同步器。它是并发包(java.util.concurrent)中许多同步类的基础,如ReentrantLock、Semaphore、CountDownLatch等,都是基于AQS实现的。AQS提供了一种可靠且高效的机制,用于自定义同步器,让开发者能够更轻松地实现各种同步控制。AQS是Java中用于构建锁和同步器的框架级工具类,它通过同步状态管理和等待队列管理来实现线程的同步控制。

2024-08-24 14:21:17 969

原创 Java笔试面试题AI答之线程(17)

是否改变中断状态会清除中断状态(如果它为true),而不会改变中断状态。返回值:两者都返回当前线程的中断状态(true或false),但的返回值受到它清除中断状态行为的影响。用途通常用于在需要清除中断状态并据此采取行动的循环或阻塞操作中;而则用于检查中断状态,而不改变它,适用于更一般的检查场景。线程安全是编程中的一个概念,特别是在多线程环境下。它指的是一个函数、代码块或程序在并发执行时,能够保持正确的执行顺序,处理共享数据,并且不会产生意外的结果或状态。

2024-08-24 09:39:57 824

原创 Java笔试面试题AI答之线程(16)

综上所述,当一个线程进入一个对象的一个synchronized方法后,其他线程是否可以进入此对象的其它方法取决于多个因素,包括方法是否被synchronized修饰、方法的类型(静态或非静态)以及是否调用了同步监视器的wait()方法等。在设计和实现多线程程序时,需要仔细考虑这些因素以确保程序的正确性和性能。

2024-08-24 09:35:06 944

原创 Java笔试面试题AI答之线程(15)

以上四种同步工具类各有特点,适用于不同的多线程同步场景。Semaphore适用于控制同时访问资源的线程数量,CountDownLatch适用于等待一组线程完成操作,CyclicBarrier适用于一组线程在继续执行前相互等待,而Exchanger则适用于两个线程之间的数据交换。这些工具类共同构成了Java多线程同步的强大机制。线程池任务饱和时的处理策略是线程池管理中的一个重要环节,需要根据具体的业务场景和需求进行选择和配置。

2024-08-24 09:26:53 901

原创 Java笔试面试题AI答之线程(14)

综上所述,降低锁的竞争需要从多个方面入手,包括优化查询语句和索引、使用合适的锁类型、控制事务长度、减小锁的范围、使用并发容器和工具、锁分解、使用读写锁、考虑使用无锁数据结构、分布式锁、锁超时机制以及利用并发编程框架等。支持高并发的读写操作。综上所述,Java中的同步机制是一套多样化的工具集,开发者可以根据具体的应用场景和需求选择合适的同步机制来确保多线程环境下的数据一致性和线程安全。修饰的不可变对象,这既保证了调用者不能修改这个对象的引用,也保证了调用者不能修改对象本身的状态。然而,需要明确的是,

2024-08-24 09:26:37 805

原创 Java笔试面试题AI答之线程(13)

在停止线程时,推荐使用退出标志或interrupt方法,因为它们提供了更安全和可控的方式来结束线程的执行。而stop方法由于存在安全风险,应该避免使用。在实际编程中,应根据具体需求和场景选择最适合的线程停止方法。锁顺序死锁是并发编程中常见的一种死锁类型,它发生在多个线程以不同的顺序尝试获取相同的锁集合时。锁顺序死锁是指当多个线程在访问多个资源时,每个线程都按照各自的顺序获取锁,而这些顺序在某些情况下相互冲突,导致线程相互等待对方释放锁,从而形成死锁。

2024-08-24 09:18:03 1010

原创 Java笔试面试题AI答之线程(12)

线程池的状态转换反映了线程池在不同操作下的行为变化,从创建时的RUNNING状态,到关闭时的SHUTDOWN和STOP状态,再到任务全部完成后的TIDYING状态,并最终进入TERMINATED状态。这些状态转换确保了线程池资源的有序释放和任务的正确执行。

2024-08-24 09:12:04 650

原创 Java笔试面试题AI答之线程(11)

原子操作(atomic operation)指的是在执行过程中不会被其他线程中断的操作。它要么全部执行成功,要么全部不执行,不存在中间状态。原子操作可以保证数据的一致性和线程安全性,是并发编程中常用的同步机制之一。Java中的竞态条件是指当多个线程同时访问共享资源,并且至少有一个线程在修改这个资源时,由于线程执行的时序或顺序不同,导致最终结果与预期不符或不可预测的现象。这种现象通常发生在多线程环境下,当多个线程试图同时读取、写入或修改同一资源时,如果没有适当的同步控制,就可能出现竞态条件。

2024-08-23 21:58:13 642

原创 Java笔试面试题AI答之线程(10)

Java中用到的线程调度算法主要包括抢占式调度、时间片轮转调度和公平调度。这些算法各有特点,适用于不同的场景和需求。在实际应用中,JVM会根据具体情况和配置选择合适的调度算法或组合使用多种算法来优化线程的执行。同时,开发者也可以通过设置线程的优先级和选择适当的调度策略来影响线程的执行顺序和性能。当线程进入一个对象的synchronized方法后,其他线程能否进入此对象的其它方法,取决于这些方法的同步性质以及它们是否请求了与当前synchronized方法相同的锁。

2024-08-23 18:38:56 1058

原创 Java笔试面试题AI答之线程(9)

锁的升级过程是从偏向锁开始,根据线程的竞争情况逐步升级到轻量级锁和重量级锁。这种升级机制是为了优化同步操作的性能,减少不必要的锁竞争和CPU资源消耗。在竞争不激烈的情况下,偏向锁和轻量级锁能够显著提高程序的执行效率;而在竞争激烈的情况下,重量级锁则能够确保线程访问的同步性,保证数据的一致性。Lock接口提供了比关键字更加灵活和强大的锁定机制,特别是在需要尝试非阻塞地获取锁、响应中断、超时尝试获取锁、更灵活的锁操作、公平锁以及可组合性等场景下。然而,

2024-08-23 18:03:30 955

CP210x 串口转USB设备驱动

CP210x 串口转USB设备驱动,Win11可用

2024-08-13

Android登录页面,使用SharePreferences保存登录账号密码

Android登录页面,使用SharePreferences保存登录账号密码

2024-07-14

sdk-bsp-stm32f407-spark-1.0.0.zip

星火1号离线SDK:sdk-bsp-stm32f407-spark-1.0.0.zip

2024-07-14

sdk-rt-thread-source-code-4.1.1.zip

RT-Thread源码SDK:sdk-rt-thread-source-code-4.1.1.zip

2024-07-14

MobaXterm-Installer-v24.2.zip

MobaXterm_Installer_v24.2.zip 串口调试工具

2024-07-14

opencv-3.4.16-android-sdk.zip

opencv-3.4.16-android-sdk.zip

2024-07-14

安卓一键拨号,一键拨打电话

安卓一键拨号,一键拨打电话

2023-09-19

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除