您的位置:首页 > 新闻 > 资讯 > 武汉掌上人才网_软件界面设计方案_国际重大新闻事件2023_如何免费推广网站

武汉掌上人才网_软件界面设计方案_国际重大新闻事件2023_如何免费推广网站

2025/1/4 14:32:58 来源:https://blog.csdn.net/Itissohardtog/article/details/144586868  浏览:    关键词:武汉掌上人才网_软件界面设计方案_国际重大新闻事件2023_如何免费推广网站
武汉掌上人才网_软件界面设计方案_国际重大新闻事件2023_如何免费推广网站

2024年末java面试第一弹

    • 1、SQL优化的15种常用方法‌包括:‌
    • 2、64 位 JVM 中,int 的长度是多数?
    • 3、32 位 JVM 和 64 位 JVM 的最大堆内存分别是多数?
    • 4、JRE、JDK、JVM 及 JIT 之间有什么不同?
    • 5、解释 Java 堆空间及 GC?
    • 6、你能保证 GC 执行吗?
    • 7、怎么获取 Java 程序使用的内存?堆使用的百分比?
    • 8、Java 中堆和栈有什么区别?
    • 9、描述一下 JVM 加载 class 文件的原理机制
    • 10、GC 是什么?为什么要有 GC?
    • 11、JVM 类加载机制
    • 12、栈
    • 13、本地方法栈
    • 14、程序计数器
    • 15、堆
    • 16、方法区
    • 17、堆和栈的区别
    • 18、什么是Java虚拟机?为什么Java被称作是“平台无关的编程语言”?
    • 19、Java对象创建过程
    • 20、简述Java的对象结构
    • 21、如何判断对象可以被回收
    • 22、JVM的永久代中会发生垃圾回收么
    • 23、垃圾收集算法
    • 24、调优命令有哪些?
    • 25、调优工具
    • 26、你知道哪些JVM性能调优
    • 27、什么是线程池?为什么使用线程池?
    • 28、Java中有哪些线程池实现?
    • 29、ThreadPoolExecutor的核心参数是什么?
    • 30、线程池的工作原理是什么?
    • 31、线程池的拒绝策略有哪些?
    • 32、线程池中的线程是如何复用的?
    • 33、如何选择线程池的核心线程数和最大线程数?
    • 34、什么是线程池的预热机制?
    • 35、线程池的优点是什么?
    • 36、线程池的缺点是什么?
    • 37、线程池中的线程是如何管理的?
    • 38、什么是任务队列?线程池中的任务队列有什么作用?
    • 39、线程池中的线程是如何执行任务的?
    • 40、有哪些线程池的最佳实践?
    • 41、线程池中的任务可以返回结果吗?如何实现带返回值的任务执行?
    • 42、如何处理线程池中的异常?
    • 43、什么是线程工厂(Thread Factory)?线程池中的线程工厂有什么作用?
    • 44、线程池和单线程执行有什么区别?
    • 45、线程池的资源泄漏问题如何避免?
    • 46、在多线程环境下,如何确保线程池中的任务按照特定顺序执行?
    • 47、MySQL存储引擎及比较?
    • 48、存储引擎索引结构
    • 49、简述事务及其特性,mysql 如何实现事务?
    • 50、事务的隔离级别有哪些?
    • 51、什么是脏读,幻读,不可重复读,可重复读?
    • 52、Mysql高可用方案有哪些?
    • 53、简述触发器,函数,视图,存储过程
    • 54、mysql常见的函数
    • 55、char 和varchar的区别?
    • 56、mysql-explain执行计划
    • 57、1000w条数据, 使用limit分页, 为什么越往后越慢
    • 58、读写分离
    • 59、什么是读写分离?
    • 60、数据库分组架构解决什么问题?
    • 61、sql半同步复制原理
    • 62、sql注入攻击原理,代码层防止sql注入
      • 原理
      • 出现在哪里
      • 如何防止
    • 63、慢日志
    • 64、乐观锁与悲观锁
    • 65、表锁
    • 66、行锁
    • 67、在普通索引中,什么情况下会引发表锁
    • 68、聚集索引和非聚集索引
    • 69、sql断点调试怎么开启?
    • 70、mysql为什么选择B+树?
    • 71、B树
    • 72、B+树
    • 73、当mysql执行一条sql时,内部流程
    • 74、synchronized 的原理
    • 75、什么是 IoC?
    • 76、IoC 解决了什么问题?
    • 77、什么是 AOP?
    • 78、AOP 为什么叫面向切面编程?
    • 79、AOP 常见的通知类型有哪些?
    • 80、AOP 解决了什么问题?
    • 81、AOP 的应用场景有哪些?
    • 82、AOP 实现方式有哪些?

1、SQL优化的15种常用方法‌包括:‌

‌避免使用SELECT * :选择具体的字段而不是所有字段,可以节省资源并减少网络开销,同时避免回表查询,提高查询效率。
‌使用合适字段类型‌:选择合适的字段类型,例如使用数值类型代替字符串,可以减少存储空间并加快比较速度。
‌使用覆盖索引‌:确保索引包含查询所需的所有列,减少回表查询。
‌合理使用JOIN‌:避免不必要的表连接,特别是多表连接时,确保连接条件足够严格。
‌使用子查询和临时表‌:对于复杂的查询,先通过子查询或创建临时表来简化主查询。
‌分页查询优化‌:使用主键范围查询等方式优化分页,避免使用大的OFFSET值。
‌使用EXISTS代替IN‌:在某些情况下,EXISTS比IN更高效,特别是在子查询返回大量数据时。
‌使用UNION ALL代替UNION‌:UNION ALL不进行去重操作,效率更高。
‌避免使用OR条件‌:OR条件可能导致索引失效,尽量使用UNION ALL替代。
‌控制索引的数量‌:过多的索引会增加数据插入、删除和更新的成本,定期审查索引使用情况,删除不必要的索引。
‌批量操作‌:批量插入、删除和更新操作比单条操作更高效。
‌避免在WHERE子句中使用NULL‌:尽量使用具体的值代替NULL,以避免全表扫描。
‌使用LIMIT‌:避免返回不必要的数据,提升查询效率。
避免在索引列上使用函数‌:在索引列上使用函数会导致索引失效。
‌在GROUP BY前进行条件过滤‌:先进行条件过滤再执行GROUP BY操作,以提高效率。

2、64 位 JVM 中,int 的长度是多数?

Java 中,int 类型变量的长度是一个固定值,与平台无关,都是 32 位。意思就是说,在 32 位 和 64 位 的 Java 虚拟机中,int 类型的长度是相同的。

3、32 位 JVM 和 64 位 JVM 的最大堆内存分别是多数?

理论上说上 32 位的 JVM 堆内存可以到达 2^32, 即 4GB,但实际上会比这个小很多。不同操作系统之间不同,如 Windows 系统大约 1.5GB,Solaris 大约3GB。64 位 JVM 允许指定最大的堆内存,理论上可以达到 2^64,这是一个非常大的数字,实际上你可以指定堆内存大小到 100GB。甚至有的 JVM,如 Azul,堆内存到 1000G 都是可能的。

4、JRE、JDK、JVM 及 JIT 之间有什么不同?

JRE 代表 Java 运行时(Java run-time),是运行 Java 引用所必须的。JDK 代表 Java 开发工具(Java development kit),是 Java 程序的开发工具,如 Java编译器,它也包含 JRE。JVM 代表 Java 虚拟机(Java virtual machine),它的责任是运行 Java 应用。JIT 代表即时编译(Just In Time compilation),当代码执行的次数超过一定的阈值时,会将 Java 字节码转换为本地代码,如,主要的热点代码会被准换为本地代码,这样有利大幅度提高 Java 应用的性能。

5、解释 Java 堆空间及 GC?

当通过 Java 命令启动 Java 进程的时候,会为它分配内存。内存的一部分用于创建堆空间,当程序中创建对象的时候,就从对空间中分配内存。GC 是 JVM 内部的一个进程,回收无效对象的内存用于将来的分配。

6、你能保证 GC 执行吗?

不能,虽然你可以调用 System.gc() 或者 Runtime.gc(),但是没有办法保证 GC的执行。

7、怎么获取 Java 程序使用的内存?堆使用的百分比?

可以通过 java.lang.Runtime 类中与内存相关方法来获取剩余的内存,总内存及最大堆内存。通过这些方法你也可以获取到堆使用的百分比及堆内存的剩余空间。Runtime.freeMemory() 方法返回剩余空间的字节数,Runtime.totalMemory()方法总内存的字节数,Runtime.maxMemory() 返回最大内存的字节数。

8、Java 中堆和栈有什么区别?

JVM 中堆和栈属于不同的内存区域,使用目的也不同。栈常用于保存方法帧和局部变量,而对象总是在堆上分配。栈通常都比堆小,也不会在多个线程之间共享,而堆被整个 JVM 的所有线程共享。

9、描述一下 JVM 加载 class 文件的原理机制

JVM 中类的装载是由类加载器(ClassLoader)和它的子类来实现的,Java 中的类加载器是一个重要的 Java 运行时系统组件,它负责在运行时查找和装入类文件中的类。
由于 Java 的跨平台性,经过编译的 Java 源程序并不是一个可执行程序,而是一个或多个类文件。当 Java 程序需要使用某个类时,JVM 会确保这个类已经被加载、连接(验证、准备和解析)和初始化。类的加载是指把类的.class 文件中的数据读入到内存中,通常是创建一个字节数组读入.class 文件,然后产生与所加载类对应
的 Class 对象。

加载完成后,Class 对象还不完整,所以此时的类还不可用。当类被加载后就进入连接阶段,这一阶段包括验证、准备(为静态变量分配内存并设置默认的初始值)和解析(将符号引用替换为直接引用)三个步骤。最后 JVM 对
类进行初始化,包括:1)如果类存在直接的父类并且这个类还没有被初始化,那么就先初始化父类;2)如果类中存在初始化语句,就依次执行这些初始化语句。
类的加载是由类加载器完成的,类加载器包括:根加载器(BootStrap)、扩展加载器(Extension)、系统加载器(System)和用户自定义类加载器(java.lang.ClassLoader 的子类)。

从 Java 2(JDK 1.2)开始,类加载过程采取了父亲委托机制(PDM)。PDM 更好的保证了 Java 平台的安全性,在该机制中,JVM 自带的Bootstrap 是根加载器,其他的加载器都有且仅有一个父类加载器。类的加载首先请求父类加载器加载,父类加载器无能为力时才由其子类加载器自行加载。JVM 不会向 Java 程序提供对 Bootstrap 的引用。下面是关于几个类
加载器的说明:

Bootstrap:一般用本地代码实现,负责加载 JVM 基础核心类库(rt.jar);
Extension:从 java.ext.dirs 系统属性所指定的目录中加载类库,它的父加载器是 Bootstrap;
System:又叫应用类加载器,其父类是 Extension。它是应用最广泛的类加载器。它从环境变量 classpath 或者系统属性
java.class.path 所指定的目录中记载类,是用户自定义加载器的默认父加载器。

10、GC 是什么?为什么要有 GC?

GC 是垃 圾收 集的 意思 ,内存 处理 是编 程人 员容 易出 现问 题的 地方 ,忘记 或者 错误的内 存回 收会 导致 程序 或系 统的 不稳 定甚 至崩 溃, Java 提供 的 GC 功能 可以 自动监测 对象 是否 超过 作用 域从 而达 到自 动回 收内 存的 目的 ,Java 语言 没有 提供 释放已分 配内存的 显示 操作 方法 。Java 程序 员不 用担 心内 存管 理, 因为 垃圾 收集 器会自动 进行 管理 。要 请求 垃圾 收集 ,可 以调 用下 面的 方法 之一 :System.gc() 或Runtime.getRuntime().gc() ,但 JVM 可以 屏蔽 掉显 示的 垃圾 回收 调用 。
垃圾回收可以有效的防止内存泄露,有效的使用可以使用的内存。垃圾回收器通常是作为一个单独的低优先级的线程运行,不可预知的情况下对内存堆中已经死亡的或者长时间没有使用的对象进行清除和回收,程序员不能实时的调用垃圾回收器对某个对象或所有对象进行垃圾回收。

11、JVM 类加载机制

JVM 类加载机制分为五个部分:加载,验证,准备,解析,初始化
加载 加载是类加载过程中的一个阶段, 这个阶段会在内存中生成一个代表这个类的 java.lang.Class 对象, 作为方法区这个类的各种数据的入口。注意这里不一定非得要从一个 Class 文件获取,这里既可以从 ZIP 包中读取(比如从 jar 包和 war 包中读取),也可以在运行时计算生成(动态代理),也可以由其它文件生成(比如将 JSP 文件转换成对应的 Class 类)。
验证 这一阶段的主要目的是为了确保 Class 文件的字节流中包含的信息是否符合当前虚拟机的要求,并且不会危害虚拟机自身的安全。 准备 准备阶段是正式为类变量分配内存并设置类变量的初始值阶段,即在方法区中分配这些变量所使用的内存空间。
解析 解析阶段是指虚拟机将常量池中的符号引用替换为直接引用的过程。
初始化 初始化阶段是类加载最后一个阶段,前面的类加载阶段之后,除了在加载阶段可以自定义类加载器以外,其它操作都由 JVM 主导。到了初始阶段,才开始真正执行类中定义的 Java 程序代码。

JVM内存模型
线程独占:栈,本地方法栈,程序计数器线程共享:堆,方法区

12、栈

又称方法栈,线程私有的,线程执行方法是都会创建一个栈阵,用来存储局部变量表,操作栈,动态链接,方法 出口等信息.调用方法时执行入栈,方法返回式执行出栈.

13、本地方法栈

与栈类似,也是用来保存执行方法的信息.执行Java方法是使用栈,执行Native方法时使用本地方法栈.

14、程序计数器

保存着当前线程执行的字节码位置,每个线程工作时都有独立的计数器,只为执行Java方法服务,执行Native方法时,程序计数器为空.

15、堆

JVM内存管理最大的一块,对被线程共享,目的是存放对象的实例,几乎所欲的对象实例都会放在这里,当堆没有可用空间时,会抛出OOM异常.根 据对象的存活周期不同,JVM把对象进行分代管理,由垃圾回收器进行垃圾的回收管理

16、方法区

又称非堆区,用于存储已被虚拟机加载的类信息,常量,静态变量,即时编译器优化后的代码等数据.1.7的永久代和1.8的元空间都是方法区的一种 实现。

17、堆和栈的区别

栈是运行时单位,代表着逻辑,内含基本数据类型和堆中对象引用,所在区域连续,没有碎片;堆是存储单位,代表着数据,可被多个栈共享(包括成员中基本数据类型、引用和引用对象),所在区域不连续,会有碎片。

  1. 功能不同
    栈内存用来存储局部变量和方法调用,而堆内存用来存储Java中的对象。无论是成员变量,局部变量, 还是类变量,它们指向的对象都存储在堆内存中。
  2. 共享性不同
    栈内存是线程私有的。
    堆内存是所有线程共有的。
  3. 异常错误不同
    如果栈内存或者堆内存不足都会抛出异常。
    栈空间不足:java.lang.StackOverFlowError。堆空间不足:java.lang.OutOfMemoryError。
  4. 空间大小
    栈的空间大小远远小于堆的

18、什么是Java虚拟机?为什么Java被称作是“平台无关的编程语言”?

Java虚拟机是一个可以执行Java字节码的虚拟机进程。Java源文件被编译成能被Java虚拟机执行的字节码文件。Java被设计成允许应用程序可以运行在任意的平台,而不需要程序员为每一个平台单独重写或者是重新编译。Java虚拟机让这个变为可能,因为它知道底层硬件平台的 指令长度和其他特性。

19、Java对象创建过程

JVM遇到一条新建对象的指令时首先去检查这个指令的参数是否能在常量池中定义到一个类的符号引用。然后加载这个类(类加载过程在 后边讲) 2. 为对象分配内存。一种办法“指针碰撞”、一种办法“空闲列表”,最终常用的办法“本地线程缓冲分配(TLAB)”
将除对象头外的对象内存空间初始化为0
对对象头进行必要设置

20、简述Java的对象结构

Java对象由三个部分组成:对象头、实例数据、对齐填充。
对象头由两部分组成,第一部分存储对象自身的运行时数据:哈希码、GC分代年龄、锁标识状态、线程持有的锁、偏向线程ID(一般占32/64 bit)。第二部分是指针类型,指向对象的类元数据类型(即对象代表哪个类)。如果是数组对象,则对象头中还有一部分用来记录数组长度。
实例数据用来存储对象真正的有效信息(包括父类继承下来的和自己定义的) 对齐填充:JVM要求对象起始地址必须是8字节的整数倍(8字节对齐 )

21、如何判断对象可以被回收

判断对象是否存活一般有两种方式:
引用计数:每个对象有一个引用计数属性,新增一个引用时计数加1,引用释放时计数减1,计数为0时可以回收。此方法简单,无法解决对象相互循环引用的问题。
可达性分析(Reachability Analysis):从GC Roots开始向下搜索,搜索所走过的路径称为引用链。当一个对象到GC Roots没有任何引用链相连时,则证明此对象是不可用的,不可达对象。

22、JVM的永久代中会发生垃圾回收么

垃圾回收不会发生在永久代,如果永久代满了或者是超过了临界值,会触发完全垃圾回收(Full GC)。如果你仔细查看垃圾收集器的输出信息,就会发现永久代也是被回收的。这就是为什么正确的永久代大小对避免Full GC是非常重要的原因。请参考下Java8:从永久代到元数据区 (注:Java8中已经移除了永久代,新加了一个叫做元数据区的native内存区)

23、垃圾收集算法

GC最基础的算法有三种:标记 -清除算法、复制算法、标记-压缩算法,我们常用的垃圾回收器一般都采用分代收集算法。
标记 -清除算法,“标记-清除”(Mark-Sweep)算法,如它的名字一样,算法分为“标记”和“清除”两个阶段:首先标记出所有需要回收的对象,在标记完成后统一回收掉所有被标记的对象。
复制算法,“复制”(Copying)的收集算法,它将可用内存按容量划分为大小相等的两块,每次只使用其中的一块。当这一块的内存用完了,就将还存活着的对象复制到另外一块上面,然后再把已使用过的内存空间一次清理掉。
标记-压缩算法,标记过程仍然与“标记-清除”算法一样,但后续步骤不是直接对可回收对象进行清理,而是让所有存活的对象都向一端移动,然后直接清理掉端边界以外的内存
分代收集算法,“分代收集”(Generational Collection)算法,把Java堆分为新生代和老年代,这样就可以根据各个年代的特点采用最适当的收集算法

24、调优命令有哪些?

Sun JDK监控和故障处理命令有jps jstat jmap jhat jstack jinfo

jps,JVM Process Status Tool,显示指定系统内所有的HotSpot虚拟机进程。
jstat,JVM statistics Monitoring是用于监视虚拟机运行时状态信息的命令,它可以显示出虚拟机进程中的类装载、内存、垃圾收集、JIT编译等运行数据。
jmap,JVM Memory Map命令用于生成heap dump文件
jhat,JVM Heap Analysis Tool命令是与jmap搭配使用,用来分析jmap生成的dump,jhat内置了一个微型的HTTP/HTML服务器,生成dump的分析结果后,可以在浏览器中查看
jstack,用于生成java虚拟机当前时刻的线程快照。
jinfo,JVM Configuration info 这个命令作用是实时查看和调整虚拟机运行参数

25、调优工具

常用调优工具分为两类,jdk自带监控工具:jconsole和jvisualvm,第三方有:MAT(Memory AnalyzerTool)、GChisto。

jconsole,Java Monitoring and Management Console是从java5开始,在JDK中自带的java监控和管理控制台,用于对JVM中内存, 线程和类等的监控
jvisualvm,jdk自带全能工具,可以分析内存快照、线程快照;监控内存变化、GC变化等。
MAT,Memory Analyzer Tool,一个基于Eclipse的内存分析工具,是一个快速、功能丰富的Javaheap分析工具,它可以帮助我们查找内存泄漏和减少内存消耗
GChisto,一款专业分析gc日志的工具

26、你知道哪些JVM性能调优

设定堆内存大小
-Xmx:堆内存最大限制。
设定新生代大小。新生代不宜太小,否则会有大量对象涌入老年代
-XX:NewSize:新生代大小
-XX:NewRatio 新生代和老生代占比
-XX:SurvivorRatio:伊甸园空间和幸存者空间的占比
设定垃圾回收器 年轻代用 -XX:+UseParNewGC 年老代用-XX:+UseConcMarkSweepGC

27、什么是线程池?为什么使用线程池?

线程池是一组维护线程的池子,可以在需要时重复使用线程,而不是为每个任务创建新线程。它的目的是提高多线程应用程序的性能、可管理性和可扩展性。使用线程池可以减少线程的创建和销毁开销,避免资源浪费。

28、Java中有哪些线程池实现?

ThreadPoolExecutor //指定线程数的线程池。
newFixedThreadPool(); //启动固定线程数的线程池
newCachedThreadPool(); //按需分配的线程池
newScheduledThreadPool(); //定时,定期执行任务的线程池

29、ThreadPoolExecutor的核心参数是什么?

核心线程数(corePoolSize):池中保持的最小线程数。
最大线程数(maximumPoolSize):池中最大允许的线程数。
队列(BlockingQueue):等待执行的任务队列。
线程空闲时间(keepAliveTime):当线程数大于核心线程数时,多余的线程在空闲指定时间后被销毁。
拒绝策略(RejectedExecutionHandler):当队列满并且线程数达到最大线程数时,用于处理新任务的策略。

30、线程池的工作原理是什么?

如果线程池中的线程数少于核心线程数,创建新线程执行任务。
如果线程池中的线程数达到核心线程数,将任务放入队列。
如果队列已满,但线程数未达到最大线程数,创建新线程执行任务。
如果队列已满且线程数已达到最大线程数,根据拒绝策略处理任务。

31、线程池的拒绝策略有哪些?

AbortPolicy(默认):抛出RejectedExecutionException异常,表示拒绝执行任务。
CallerRunsPolicy:由调用线程执行被拒绝的任务。
DiscardPolicy:静默丢弃被拒绝的任务。
DiscardOldestPolicy:丢弃队列中等待时间最长的任务,然后重新尝试执行新任务。

32、线程池中的线程是如何复用的?

线程池中的线程可以复用,当一个线程执行完一个任务后,它会继续从队列中取下一个任务执行,直到达到线程的最大生存时间(keepAliveTime),之后线程可能会被销毁。这样,线程池中的线程可以反复执行多个任务,而不需要频繁创建和销毁线程。

33、如何选择线程池的核心线程数和最大线程数?

选择核心线程数和最大线程数取决于应用程序的性质和资源限制。通常情况下,可以考虑以下因素:

核心线程数应设置为应用程序中同时运行的基本线程数,以避免频繁创建线程。
最大线程数应根据系统资源和负载情况来设置,不应设置得过大以避免资源浪费。
可以根据实际性能测试来优化核心线程数和最大线程数的设置。

34、什么是线程池的预热机制?

线程池的预热机制是指在应用程序启动时预先创建一定数量的核心线程,以减少任务提交后的线程创建延迟。这可以通过设置核心线程数为一个较小的值,并使用任务队列来实现。随着应用程序的运行,线程池可以根据实际需求动态增加线程数。

35、线程池的优点是什么?

降低线程创建和销毁的开销,提高性能。

可以限制并发线程的数量,防止资源耗尽。

可以统一管理和监控线程的状态和执行。

提供线程重用、线程超时和任务排队等功能。

36、线程池的缺点是什么?

需要合理设置参数,否则可能导致性能问题。
可能出现任务排队等待执行的情况,导致响应时间延迟。
如果任务执行时间不均匀,可能会导致某些线程长时间忙碌,而其他线程处于空闲状态。

37、线程池中的线程是如何管理的?

线程池中的线程由线程池自动管理,包括创建、销毁、维护线程状态等。线程池负责确保核心线程数的线程一直存在,而多余的线程在空闲一定时间后被销毁。线程池还负责任务的提交、队列管理以及拒绝策略的处理。

38、什么是任务队列?线程池中的任务队列有什么作用?

任务队列是线程池中用于存储等待执行的任务的数据结构。任务队列的作用包括:

临时存储等待执行的任务,避免任务丢失。
控制任务的执行顺序,根据队列类型可以实现不同的调度策略。
在任务提交速度大于线程执行速度时,缓冲任务,避免线程被过度创建。

39、线程池中的线程是如何执行任务的?

从任务队列中获取待执行的任务。
执行任务的代码逻辑。
执行完成后,线程可以继续从任务队列中获取下一个任务,或者等待新任务的到来。
线程池会根据核心线程数、最大线程数和任务队列的状态来管理线程的创建和销毁。

40、有哪些线程池的最佳实践?

合理设置核心线程数和最大线程数,根据应用程序的特性和硬件资源来选择。
使用合适的任务队列类型,如LinkedBlockingQueue、ArrayBlockingQueue等。
考虑线程池的预热机制,提前创建一些核心线程以减少任务提交后的延迟。
监控线程池的状态,以及任务执行的性能和异常情况。

41、线程池中的任务可以返回结果吗?如何实现带返回值的任务执行?

是的,线程池中的任务可以返回结果。在Java中,可以使用Callable接口来定义带返回值的任务,而不仅仅是Runnable。ExecutorService接口的submit(Callable task)方法用于提交带返回值的任务,它返回一个Future对象,可以用来获取任务执行的结果。

42、如何处理线程池中的异常?

可以通过设置UncaughtExceptionHandler来处理线程池中线程的异常。当线程中抛出未捕获的异常时,UncaughtExceptionHandler会被调用,可以在该处理程序中记录日志或采取其他适当的措施。

43、什么是线程工厂(Thread Factory)?线程池中的线程工厂有什么作用?

线程工厂是用于创建线程的工厂对象。在线程池中,线程工厂用于创建新线程。通过自定义线程工厂,可以控制线程的命名、优先级、守护状态等属性。

44、线程池和单线程执行有什么区别?

主要区别在于线程池可以并发执行多个任务,而单线程执行只能按顺序执行一个任务。线程池能够更有效地利用多核处理器和提高任务执行的并行度。单线程执行适用于某些需要按顺序执行的场景,而线程池适用于多任务并发执行的场景。

45、线程池的资源泄漏问题如何避免?

要避免线程池的资源泄漏,应当在不需要线程池时及时关闭(shutdown())线程池,释放资源。如果不关闭线程池,可能会导致线程池的线程一直存在而不被垃圾回收。

46、在多线程环境下,如何确保线程池中的任务按照特定顺序执行?

可以使用Executor的newFixedThreadPool或newSingleThreadExecutor方法创建线程池,这些线程池保证任务按照提交的顺序执行。另外,可以使用ExecutorService的invokeAll方法来执行一组任务,并等待它们的完成。

47、MySQL存储引擎及比较?

mysql存储引擎
Innodb: 5.5之后默认的存储引擎 查询速度较myisam慢 但是更安全,支持事务,支持行锁,支持外键 行锁:同一时间只能一个用户操作这行数据 2两个文件 表结构和真实数据

myisam: mysql老版本用的存储引擎 5.5之前 3个文件 表结构,真实数据和索引
memory: 内存引擎(数据全部存在内存中),断电或者服务端重启之后所有数据都没有了 1个文件,表结构
blackhole: 无论存什么 都立马消失(黑洞) 1个文件 表结构

48、存储引擎索引结构

Innodb:B+树
myisam:B+树
memory:hash表
blackhole:不知道

49、简述事务及其特性,mysql 如何实现事务?

事务简介: 事务是应用程序中一系列严密的操作,所有操作必须成功完成,否则在每个操作中所有的操作都会被撤销
事务特性 (ACID):
原子性(Atomicity): 表示组成一个事务的多个数据库操作是一个不可分割的原子单位,只有所有的操作执行成功,
整个事务才提交,事务中任何一个数据库操作失败,已经执行的任何操作都必须撤销,让数据 库 返回到初始状态
一致性(Consistency):事务操作成功后,数据库所处的状态和它的业务规则是一致的,即数据不会被破坏。
隔离性(Isolation):在并发数据操作时,不同的事务拥有各自数据空间,它们的操作不会对对方产生干扰。数据 库规定了多种事务隔 离级别,不同隔离级别对应不同的干扰程度,隔离级别越高,数据一 致性 越好,但并发性越弱
持续性(Durability):一旦事务提交成功后,事务中所有的数据操作都必须被持久化到数据库中,即使提交事务 后,数据库马上崩溃,在数据库重启时,也必须能保证能够通过某种机制恢复数据

50、事务的隔离级别有哪些?

read uncommited (可读未提交,脏读):不做任何隔离,具有脏读,不可重复读,幻读的问题
read committed (读提交,不可重复读):可以防止脏读,不能放止不可重复读和幻读的问题
repeated read(可重复读,可重复读):可以防止脏读,不可重复读,不能放止幻读(mysql的默认隔离级别)
serializable(串行化,幻读):数据库运行为串行,以上问题都可以防止,但是性能低

51、什么是脏读,幻读,不可重复读,可重复读?

1.脏读:事务A读取了事务B更新的数据,然后B回滚操作,那么A读取到的数据是脏数据
2.不可重复读:事务 A 多次读取同一数据,事务 B 在事务A多次读取的过程中,对数据作了更新并提交,导致事务A多次读取同一数据时,结果 不一致。 因为只能读到提交后的数据,原数据不可重复的读取
3.可重复读:原来的数据就算被其他的事务修改了,还是能读取到原来没有修改的数据
4.幻读:系统管理员A将数据库中所有学生的成绩从具体分数改为ABCDE等级,但是系统管理员B就在这个时候插入了一条具体分数的记录,当系统管理员A改结束后发现还有一条记录没有改过来,就好像发生了幻觉一样,这就叫幻读
小结:不可重复读的和幻读很容易混淆,不可重复读侧重于修改,幻读侧重于新增或删除。解决不可重复读的问题只需锁住满足条件的行,解决幻读需要锁表

52、Mysql高可用方案有哪些?

1.基于主从复制;(常用)
2.基于Galera协议;
3.基于NDB引擎;
4.基于中间件/proxy;
5.基于共享存储;
6.基于主机高可用;

53、简述触发器,函数,视图,存储过程

触发器: 对某个表进行(增/删/改)操作的前后触发一些操作即为触发器,(触发器用于自定义用户对表的行进行(增/删/改)前后的行为) 触发器必须定义在特定的表上
函数: 内置函数、自定义函数
视图是查询命令结果构成的一个虚拟表(非真实存在),其本质是【根据SQL语句获取动态的数据集,并为其命 名】,用户使用时只需使用【名称】即可获取结果集合,并可以当作表来查询使用。
存储过程:存储过程(procedure),概念类似于函数,就是把一段代码封装起来,当要执行这一段代码的时候,可以 通过调用该存储过程来实现。在封装的语句体里面,可以同if/else ,case,while等控制结构,可以进行 sql编程,查看现有的存储过程。

54、mysql常见的函数

ABS() BIN() CEILING向上取整 FLOOR() EXP(x) e的x次方 0-1的随机数 圆周率 RAND() PI() LEAST(X1, X2 …) GREATEST(X1, X2) LN() 返回x的自然对数 LOG(x, y) 返回x的以y为底的对数 取模(余数) 四舍五入 返回集合中最小的值 返回集合中最大的值 MOD() round() SIGN(x) SQRT(X) TRUNCATE(X,Y) 返回数字x截短为y位小数的结果 聚合函数 AVG COUNT MIN MAX SUM GROUP_CONCATE 返回集合中最小的值 日期和时间函数 curdate() current_date() 当前日期 curtime() current_time() 当前时间

55、char 和varchar的区别?

char定长字段, 创建所有记录的值存储的长度一致, 读取速度快
varchar 变长 记录的值存储长度为本身的长度, 省空间\

char的存储方式是,对英文字符(ASCII)占用1个字节,对一个汉字占用两个字节;而varchar的存储方式是,对每个英 文字符占用2个字节,汉字也占用2个字节,两者的存储数据都非unicode的字符数据

56、mysql-explain执行计划

explain这个命令来查看一个这些SQL语句的执行计划,查看该SQL语句有没有使用上了索引,有没有做全表扫描,这都可以通过explain命令来查看。

57、1000w条数据, 使用limit分页, 为什么越往后越慢

当一个数据库表过于庞大,LIMIT offset, length中的offset值过大,则SQL查询语句会非常缓慢,你需增加order by,并且order by字段需要建立索引。
如果使用子查询去优化LIMIT的话,则子查询必须是连续的,某种意义来讲,子查询不应该有where条件,
where会过滤数据,使数据失去连续性。
如果你查询的记录比较大,并且数据传输量比较大,比如包含了text类型的field,则可以通过建立子查询。
SELECT id,title,content FROM items WHERE id IN (SELECT id FROM items ORDER BY id limit 900000, 10);
如果limit语句的offset较大,你可以通过传递pk键值来减小offset = 0,这个主键最好是int类型并
且 auto_increment
SELECT * FROM users WHERE uid > 456891 ORDER BY uid LIMIT 0, 10;
这条语句,大意如下:
SELECT * FROM users WHERE uid >= (SELECT uid FROM users ORDER BY uid limit 895682, 1) limit 0, 10; 如果limit的offset值过大,用户也会翻页疲劳,你可以设置一个offset
最大的,超过了可以另行处理,一般连续翻页过大,用户体验很差,则应该提供更优的用户体验给用户。

58、读写分离

读写分离就是主从架构,一个主(写),两个从(读).分担读写压力
压力分析:比如订单表,只增不减的数据。后面就越来越多。考虑分库分表,水平切分

59、什么是读写分离?

其实就是将数据库分为了主从库,一个主库用于写数据,多个从库完成读数据的操作,主从库之间通过某种机制进行数据的同步,是一种常见的数据库架构。
一个主从同步集群,通常被称为是一个“分组”。

60、数据库分组架构解决什么问题?

大多数互联网业务,往往读多写少,这时候,数据库的读会首先称为数据库的瓶颈,这时,如果我们希望能够线性的提升数据库的读性能,消除读写锁冲突从而提升数据库的写性能,那么就可以使用“分组架构”(读写分离架构)。
#读写分离是用来解决数据库的读性能瓶颈的

61、sql半同步复制原理

异步复制(Asynchronous replication)
MySQL默认的复制即是异步的,主库在执行完客户端提交的事务后会立即将结果返给给客户端,并不关心
从库是否已经接收 并处理,这样就会有一个问题,主如果crash掉了,此时主上已经提交的事务可能并没有
传到从上,如果此时,强行将从提 升为主,可能导致新主上的数据不完整。

全同步复制(Fully synchronous replication)
指当主库执行完一个事务,所有的从库都执行了该事务才返回给客户端。因为需要等待所有从库执行完该
事务才能返回,所以全同步复制的性能必然会收到严重的影响。

半同步复制(Semisynchronous replication)
介于异步复制和全同步复制之间,主库在执行完客户端提交的事务后不是立刻返回给客户端,而是等待至
少一个从库接收到 并写到relay log中才返回给客户端。相对于异步复制,半同步复制提高了数据的安全
性,同时它也造成了一定程度的延 迟,这个延迟最少是一个TCP/IP往返的时间。所以,半同步复制最好在
低延时的网络中使用。

mysql有4种同步方式:
1.异步复制
优点:搭建简单,使用非常广泛,从mysql诞生就有这种架构,性能非常好。
缺点:数据是异步的,有丢失数据库的风险
2.全同步复制
优点:保证数据安全
缺点:损失性能
3.传统半同步复制
性能、功能都介于异步和全同步中间。从mysql5.5开始诞生。目的是为了折中前两种架构的性能和优缺点
4.无损复制,增强版的半同步复制
数据零丢失,性能好,mysql5.7诞生

62、sql注入攻击原理,代码层防止sql注入

原理

通过前端的表单提交的数据中携带sql语句, 欺骗服务器, 在后端对数据进行存储时, 执行恶意的sql语句

出现在哪里

比如在使用pymysql操作数据库是使用字符串拼接生产sql语句, 就会出现sql注入漏洞

如何防止

  1. 使用pymysql时, 不要使用字符串拼接, 而是使用execute方法, pymysql模块已经对提交的数据做了处理, 不会出 现sql注入
  2. 不要相信前端提交的任何数据, 要严格校验
  3. 永远不要使用管理员权限的数据库连接,为每个应用使用单独的权限有限的数据库连接。
  4. 不要把机密信息直接存放,加密或者hash掉密码和敏感的信息
  5. 应用的异常信息应该给出尽可能少的提示,最好使用自定义的错误信息对原始错误信息进行包装
  6. 使用辅助软件对网站进行检测, 软件一般采用sql注入检测工具jsky, 网站平台就有亿思网站安全平台检测

63、慢日志

MySQL的慢查询日志是MySQL提供的一种日志记录,它用来记录在MySQL中响应时间超过阀值的语句,具
体指运行时间超过 long_query_time值的SQL,则会被记录到慢查询日志中。long_query_time的默认值为10,意思是运行10s以上的语句。
默认情况下,MySQL数据库并不启动慢查询日志,需要我们手动来设置这个参数,当然,如果不是调优需
要的话,一般不建 议启动该参数,因为开启慢查询日志或多或少会带来一定的性能影响。慢查询日志支持将日志记录写入文件,也支持将日志 记录写入数据库表。

64、乐观锁与悲观锁

悲观锁:在拿到这数据时就进行锁定。例如:golang的mutext是悲观锁
适用场景:适合查少改多,短事务,长事务一直被阻塞,影响性能。
加锁:for update
select * from user where id =1 for update

乐观锁:在每次操作数据之前,不锁定数据。而是在修改数据的时候,判断一下在此期间别人有没有去更新这个数据
适用场景:适合查多改少

65、表锁

表加锁的命令Lock Tables,给表解锁的命令Unlock Tables
不允许其他会话查询本表、修改本表、插入记录。
InnoDB默认采用行锁,在未使用索引字段查询时升级为表锁。

66、行锁

select * from table where ? for update;
不允许其他会话查询本行、修改本行

67、在普通索引中,什么情况下会引发表锁

常用的索引有三类:主键、唯一索引、普通索引。
主键:自带最高效的索引属性;
唯一索引:指的是该属性值重复率为0,一般可作为业务主键,例如学号;
普通索引:与前者不同的是,属性值的重复率大于0,不能作为唯一指定条件,例如学生姓名。
1.结论:
当 Where 查询条件中的字段没有索引时,更新操作会锁住全表! 可以看到,在有索引的情况下,更新不同的行,InnoDB 默认的行锁不会阻塞。
当“值重复率”低时,甚至接近主键或者唯一索引的效果,“普通索引”依然是行锁;当“值重复率”高时,MySQL 不会把这个“普通索引”当做索引,即造成了一个没有索引的 SQL,此时引发表锁。
所有explain查看sql执行计划

68、聚集索引和非聚集索引

聚集索引:一个表只有一个,比如主键
非聚集索引:普通索引,额外创建的索引
聚集索引查询:直接查到数据
非聚集索引查询:先查询主键,在查到数据。查到主键的过程叫做回表

69、sql断点调试怎么开启?

set profiling=1; # 打开断点调试
select * from table1;
shou profile for query 1; # 查看每个步骤消耗的时间,以此来优化

70、mysql为什么选择B+树?

B树在提⾼了IO性能的同时并没有解决元素遍历效率低下的问题,正是为了解决这个问题,B+树应⽤⽽⽣。
B+树只需要去遍历叶⼦节点就可以实现整棵树的遍历。⽽且在数据库中基于范围的查询是⾮常频繁的,⽽B树不⽀持这样的操作或者说效率太低

71、B树

B树特点:
1.所有健值分布在整棵树中
2.搜索有可能在非叶子结点结束,效率接近二分查找
3.每个节点最多拥有m(无穷)颗子树
4.根结点最少有两颗子树
5.分支节点至少有m/2颗子树(除根结点和叶子结点外都是分支节点)
缺点:
1.每个磁盘空间有4k,如果数据data太大,那么导致树的深度加深,查询变慢

72、B+树

特点:B+树是在B树基础之上的优化
1.B+树每个节点包含更多的节点,原因1:降低树的高度,原因2:将数据的范围变为多个区间,区间越多数据检索越快
2.非叶子结点存储key,叶子结点存储key和数据
3.叶子结点指针相互连接(符合磁盘的预读特性),顺讯查询时性能更高
Innodb每次预读16k,4k的整数倍

73、当mysql执行一条sql时,内部流程

1.语法分析:MySQL 接收到 SQL 语句后,首先进行语法分析。这个过程会检查语句的语法是否正确,并将其转换为内部数据结构,以便后续处理。
2.查询优化:在执行查询之前,MySQL 会进行查询优化。这个过程的目标是选择最优的执行计划,以提高查询性能。MySQL 使用统计信息和索引等信息来评估不同的执行计划,并选择成本最低的计划。
3.查询执行:一旦选择了最优的执行计划,MySQL 就开始执行查询。执行过程中可能涉及以下步骤:
a. 访问权限检查:MySQL 需要验证用户是否有权限执行该查询。
b. 查询解析:MySQL 解析查询,并根据查询计划进行数据访问。
c. 数据读取:如果查询需要读取数据,MySQL 会根据查询计划从磁盘或内存中读取数据。
d. 连接操作:如果查询涉及多个表之间的连接操作,MySQL 会执行连接操作来获取匹配的数据。
e. 筛选和排序:MySQL 根据查询条件对数据进行筛选,并按照排序规则进行排序。
f. 返回结果:MySQL 将查询结果返回给客户端。
4.事务处理:如果 SQL 语句在事务中执行,MySQL 会在适当的时候处理事务提交或回滚操作,以确保数据的一致性和持久性。
5.锁管理:在多用户并发访问下,MySQL 会使用锁来管理对数据的访问。这包括读锁和写锁的管理,以确保数据的一致性和并发性。
6.日志记录:MySQL 在执行 SQL 语句的同时,会将相关的操作和变更记录到日志文件中,以便在需要时进行故障恢复或回滚操作。

74、synchronized 的原理

synchronized 又被称为监视器锁,基于 Monitor 机制实现的,主要依赖底层操作系统的互斥原语 Mutex(互斥量)。Monitor 类比加了锁的房间,一次只能有一个线程进入,进入房间即持有 Monitor,退出后就释放 Monitor。
另一个关键点是 Java 对象头,在 JVM 虚拟机中,对象在内存中的存储结构有三部分:对象头;实例数据;对齐填充。
对象头主要包括标记字段 Mark World,元数据指针,如果是数组对象的话,对象头还必须存储数组长度。
synchronized 也是基于此,通过锁对象的 monitor 获取和 monitor 释放来实现,对象头标记为存储具体锁状态,ThreadId 记录持有偏向锁的线程 ID。

75、什么是 IoC?

IoC (Inversion of Control )即控制反转/反转控制。它是一种思想不是一个技术实现。描述的是:Java 开发领域对象的创建以及管理的问题。
例如:现有类 A 依赖于类 B

传统的开发方式 :往往是在类 A 中手动通过 new 关键字来 new 一个 B 的对象出来
使用 IoC 思想的开发方式 :不通过 new 关键字来创建对象,而是通过 IoC 容器(Spring 框架) 来帮助我们实例化对象。我们需要哪个对象,直接从 IoC 容器里面去取即可。

为什么叫控制反转?

控制 :指的是对象创建(实例化、管理)的权力
反转 :控制权交给外部环境(IoC 容器)

76、IoC 解决了什么问题?

IoC 的思想就是两方之间不互相依赖,由第三方容器来管理相关资源。这样有什么好处呢?

对象之间的耦合度或者说依赖程度降低;
资源变的容易管理;比如你用 Spring 容器提供的话很容易就可以实现一个单例。
75、IoC 和 DI 有区别吗?
IoC(Inverse of Control:控制反转)是一种设计思想或者说是某种模式。这个设计思想就是 将原本在程序中手动创建对象的控制权交给第三方比如 IoC 容器。 对于我们常用的 Spring 框架来说, IoC 容器实际上就是个 Map(key,value),Map 中存放的是各种对象。不过,IoC 在其他语言中也有应用,并非 Spring 特有。
IoC 最常见以及最合理的实现方式叫做依赖注入(Dependency Injection,简称 DI)。

77、什么是 AOP?

AOP(Aspect Oriented Programming)即面向切面编程,AOP 是 OOP(面向对象编程)的一种延续,二者互补,并不对立。

AOP 的目的是将横切关注点(如日志记录、事务管理、权限控制、接口限流、接口幂等等)从核心业务逻辑中分离出来,通过动态代理、字节码操作等技术,实现代码的复用和解耦,提高代码的可维护性和可扩展性。OOP 的目的是将业务逻辑按照对象的属性和行为进行封装,通过类、对象、继承、多态等概念,实现代码的模块化和层次化(也能实现代码的复用),提高代码的可读性和可维护性。

78、AOP 为什么叫面向切面编程?

AOP 之所以叫面向切面编程,是因为它的核心思想就是将横切关注点从核心业务逻辑中分离出来,形成一个个的切面(Aspect)。
AOP 关键术语
横切关注点(cross-cutting concerns) :多个类或对象中的公共行为(如日志记录、事务管理、权限控制、接口限流、接口幂等等)。
切面(Aspect):对横切关注点进行封装的类,一个切面是一个类。切面可以定义多个通知,用来实现具体的功能。
连接点(JoinPoint):连接点是方法调用或者方法执行时的某个特定时刻(如方法调用、异常抛出等)。
通知(Advice):通知就是切面在某个连接点要执行的操作。通知有五种类型,分别是前置通知(Before)、后置通知(After)、返回通知(AfterReturning)、异常通知(AfterThrowing)和环绕通知(Around)。前四种通知都是在目标方法的前后执行,而环绕通知可以控制目标方法的执行过程。
切点(Pointcut):一个切点是一个表达式,它用来匹配哪些连接点需要被切面所增强。切点可以通过注解、正则表达式、逻辑运算等方式来定义。比如 execution(* com.xyz.service…*(…))匹配 com.xyz.service 包及其子包下的类或接口。
织入(Weaving):织入是将切面和目标对象连接起来的过程,也就是将通知应用到切点匹配的连接点上。常见的织入时机有两种,分别是编译期织入(Compile-Time Weaving 如:AspectJ)和运行期织入(Runtime Weaving 如:AspectJ、Spring AOP)。

79、AOP 常见的通知类型有哪些?

Before(前置通知):目标对象的方法调用之前触发
After (后置通知):目标对象的方法调用之后触发
AfterReturning(返回通知):目标对象的方法调用完成,在返回结果值之后触发
AfterThrowing(异常通知):目标对象的方法运行中抛出 / 触发异常后触发。AfterReturning 和 AfterThrowing 两者互斥。如果方法调用成功无异常,则会有返回值;如果方法抛出了异常,则不会有返回值。
Around (环绕通知):编程式控制目标对象的方法调用。环绕通知是所有通知类型中可操作范围最大的一种,因为它可以直接拿到目标对象,以及要执行的方法,所以环绕通知可以任意的在目标对象的方法调用前后搞事,甚至不调用目标对象的方法。

80、AOP 解决了什么问题?

OOP 不能很好地处理一些分散在多个类或对象中的公共行为(如日志记录、事务管理、权限控制、接口限流、接口幂等等),这些行为通常被称为 横切关注点(cross-cutting concerns) 。如果我们在每个类或对象中都重复实现这些行为,那么会导致代码的冗余、复杂和难以维护。

AOP 可以将横切关注点(如日志记录、事务管理、权限控制、接口限流、接口幂等等)从 核心业务逻辑(core concerns,核心关注点) 中分离出来,实现关注点的分离。

81、AOP 的应用场景有哪些?

日志记录:自定义日志记录注解,利用 AOP,一行代码即可实现日志记录。
性能统计:利用 AOP 在目标方法的执行前后统计方法的执行时间,方便优化和分析。
事务管理:@Transactional 注解可以让 Spring 为我们进行事务管理比如回滚异常操作,免去了重复的事务管理逻辑。@Transactional注解就是基于 AOP 实现的。
权限控制:利用 AOP 在目标方法执行前判断用户是否具备所需要的权限,如果具备,就执行目标方法,否则就不执行。例如,SpringSecurity 利用@PreAuthorize 注解一行代码即可自定义权限校验。
接口限流:利用 AOP 在目标方法执行前通过具体的限流算法和实现对请求进行限流处理。
缓存管理:利用 AOP 在目标方法执行前后进行缓存的读取和更新。

82、AOP 实现方式有哪些?

AOP 的常见实现方式有动态代理、字节码操作等方式。

Spring AOP 就是基于动态代理的,如果要代理的对象,实现了某个接口,那么 Spring AOP 会使用 JDK Proxy,去创建代理对象,而对于没有实现接口的对象,就无法使用 JDK Proxy 去进行代理了,这时候 Spring AOP 会使用 Cglib 生成一个被代理对象的子类来作为代理。
当然你也可以使用 AspectJ !Spring AOP 已经集成了 AspectJ ,AspectJ 应该算的上是 Java 生态系统中最完整的 AOP 框架了。

Spring AOP 属于运行时增强,而 AspectJ 是编译时增强。 Spring AOP 基于代理(Proxying),而 AspectJ 基于字节码操作(Bytecode Manipulation)。

Spring AOP 已经集成了 AspectJ ,AspectJ 应该算的上是 Java 生态系统中最完整的 AOP 框架了。AspectJ 相比于 Spring AOP 功能更加强大,但是 Spring AOP 相对来说更简单,

如果我们的切面比较少,那么两者性能差异不大。但是,当切面太多的话,最好选择 AspectJ ,它比 Spring AOP 快很多。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com