高频java研发工程师面试题及答案_第1页
高频java研发工程师面试题及答案_第2页
高频java研发工程师面试题及答案_第3页
高频java研发工程师面试题及答案_第4页
高频java研发工程师面试题及答案_第5页
已阅读5页,还剩23页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

高频java研发工程师面试题及答案Java中面向对象的四大特性是封装、继承、多态和抽象。封装通过访问控制修饰符(如private、protected)限制外部对内部状态的直接访问,仅暴露必要接口;继承允许子类复用父类代码并扩展新功能;多态表现为父类引用指向子类对象,运行时动态调用子类方法;抽象通过抽象类或接口定义规范,隐藏具体实现细节。抽象类和接口的核心区别在于:抽象类可包含具体方法、构造方法和成员变量,接口JDK8前仅能有抽象方法(默认方法和静态方法后支持);抽象类单继承,接口多实现;抽象类强调"是不是"的关系(如动物抽象类与猫子类),接口强调"能不能"的能力(如飞行接口)。重载(Overload)和重写(Override)的区别:重载发生在同一类中,方法名相同但参数列表(类型、顺序、数量)不同,与返回值无关;重写发生在父子类或接口实现类中,方法名、参数、返回值完全相同(子类返回值可为父类返回值的子类),访问权限不能严于父类,不能重写父类的final或静态方法。例如,计算两个数之和的add(inta,intb)和add(doublea,doubleb)是重载;子类重写父类的toString()方法是重写。String、StringBuilder、StringBuffer的区别:String是不可变类,底层使用finalchar[]存储,每次修改会提供新对象;StringBuilder线程不安全,效率高,适用于单线程字符串拼接;StringBuffer线程安全(方法用synchronized修饰),效率较低,适用于多线程场景。例如循环中拼接字符串时,使用String会导致大量中间对象,应优先选择StringBuilder。Java异常分为Error和Exception,前者(如OutOfMemoryError)表示JVM无法处理的严重问题,程序不应捕获;后者分为受检异常(CheckedException,如IOException)需显式处理(throws或try-catch)和非受检异常(UncheckedException,如RuntimeException及其子类NullPointerException、ArrayIndexOutOfBoundsException)。finally块中的代码无论是否发生异常都会执行(除非JVM退出),若try和finally都有return,最终返回finally的值(不建议这样写)。泛型的作用是编译期类型检查和消除强制类型转换,类型擦除发生在编译阶段,运行时无法获取泛型具体类型(如List<String>和List<Integer>运行时类型相同)。通配符?表示任意类型,<?extendsT>上限通配符(允许T及其子类),<?superT>下限通配符(允许T及其父类)。反射允许程序在运行时获取类的信息(如方法、字段)并调用,常见应用场景包括框架(Spring的依赖注入)、动态代理、ORM映射(MyBatis的结果集映射)。获取Class对象的三种方式:类名.class、对象.getClass()、Class.forName("全类名")。注解本质是接口(继承自java.lang.annotation.Annotation),通过@Target指定作用位置(如METHOD、FIELD),@Retention指定保留阶段(SOURCE编译期、CLASS类加载、RUNTIME运行时),@Inherited允许子类继承,@Documented提供到文档。自定义注解需结合反射使用,例如Spring的@Autowired通过反射注入依赖。HashMap的底层实现:JDK7为数组+链表,JDK8为数组+链表+红黑树(当链表长度≥8且数组长度≥64时,链表转红黑树;当红黑树节点数≤6时退化为链表)。核心属性包括table(存储节点的数组)、size(元素数量)、threshold(扩容阈值=容量×负载因子)、loadFactor(默认0.75)。put流程:计算key的hash值((h=key.hashCode())^(h>>>16)),通过(n-1)&hash确定数组索引;若该位置为空则直接插入;若存在节点,判断key是否相等(equals),相等则覆盖;否则遍历链表/红黑树,链表中若长度≥8且数组长度≥64则转红黑树,插入新节点;最后检查size是否超过threshold,超过则扩容(旧容量×2,重新计算索引)。JDK8的优化:hash计算减少高位碰撞,链表插入改为尾插(避免JDK7头插导致的扩容死链问题),引入红黑树降低查找时间复杂度(O(n)→O(logn))。ConcurrentHashMap的线程安全机制:JDK7使用分段锁(Segment数组,每个Segment继承ReentrantLock,默认16段,支持16个线程并发写);JDK8取消分段锁,采用synchronized+CAS+Node节点的方式,锁粒度细化到数组的单个节点(table[i]),当插入节点时,若该位置为空则CAS插入;若存在节点则synchronized锁定该节点,遍历链表/红黑树插入。size()方法通过统计baseCount和CounterCell数组(并发时各线程累加值)的和得到。ArrayList和LinkedList的区别:ArrayList基于动态数组,随机访问(get(i))时间复杂度O(1),插入/删除(中间位置)需移动元素,时间复杂度O(n);LinkedList基于双向链表,随机访问需遍历链表,时间复杂度O(n),插入/删除(首尾)时间复杂度O(1)。ArrayList默认初始容量10,扩容时新容量为旧容量的1.5倍;LinkedList无容量限制。迭代器的fail-fast机制:当遍历集合时,若集合结构被修改(如add/remove,除迭代器自身的remove方法),会抛出ConcurrentModificationException。原理是集合内部维护modCount变量(修改次数),迭代器初始化时记录expectedModCount,每次遍历前检查两者是否相等,不等则抛出异常。fail-safe机制(如CopyOnWriteArrayList)通过复制原数组进行修改,遍历的是原数组,不会抛出异常,但牺牲了实时性。线程的创建方式:继承Thread类(重写run())、实现Runnable接口(传入Thread构造)、实现Callable接口(结合FutureTask获取返回值)。线程的六种状态(Thread.State):NEW(新建)、RUNNABLE(可运行,包括运行中)、BLOCKED(阻塞,等待监视器锁)、WAITING(无限等待,如wait())、TIMED_WAITING(超时等待,如sleep(long))、TERMINATED(终止)。synchronized和Lock的区别:synchronized是关键字,JVM实现,隐式加锁/释放(作用域结束自动释放);Lock是接口(如ReentrantLock),需手动lock()和unlock()(通常放finally块)。synchronized是非公平锁(默认),Lock支持公平锁和非公平锁(构造时指定)。synchronized无法中断等待锁的线程,Lock的lockInterruptibly()方法可响应中断;synchronized只能有一个等待队列,Lock的Condition支持多个等待队列(如生产者-消费者模型中不同条件的等待)。volatile的作用:保证可见性(变量修改后立即刷新到主内存,其他线程读取时从主内存获取),禁止指令重排序(通过内存屏障实现)。但不保证原子性(如i++操作包含读取、修改、写入三步,volatile无法保证这三步的原子性)。适用场景:状态标志(如线程终止标志位)、单例模式的双重检查锁定(防止指令重排导致其他线程获取未初始化的实例)。ThreadLocal的原理:每个线程有独立的ThreadLocalMap,键为ThreadLocal的弱引用(防止内存泄漏),值为线程本地变量。set()时获取当前线程的ThreadLocalMap,插入键值对;get()时从当前线程的Map中获取值。内存泄漏原因:若ThreadLocal无外部强引用,键会被GC回收,但值(强引用)仍存在,导致无法回收。解决方法:使用后调用remove()清除数据。应用场景:数据库连接(每个线程独立连接)、用户会话信息(HTTP请求中传递用户ID)。AQS(AbstractQueuedSynchronizer)的核心是维护一个volatileintstate(同步状态)和CLH双向队列(等待线程队列)。通过getState()、setState()、compareAndSetState()操作state,子类需实现tryAcquire(int)、tryRelease(int)等方法定义同步逻辑。ReentrantLock基于AQS,公平锁会检查队列中是否有前驱节点(保证先到先得),非公平锁直接尝试CAS修改state(提高吞吐量)。CountDownLatch(倒计时门闩)允许一个或多个线程等待其他线程完成操作,构造时指定计数器(如count=3),线程完成任务后调用countDown()(计数器减1),等待线程调用await()阻塞直到计数器为0。CyclicBarrier(循环屏障)允许一组线程相互等待到达屏障点,构造时指定线程数(如parties=5),每个线程调用await()阻塞,当所有线程到达后屏障打开,可执行一个Runnable(屏障动作),支持重复使用(reset()重置计数器)。Semaphore(信号量)控制同时访问资源的线程数,构造时指定许可数(如permits=3),线程调用acquire()获取许可(许可数减1),release()释放许可(许可数加1)。JVM内存区域分为:程序计数器(记录当前线程执行的字节码行号,唯一无OOM的区域)、Java虚拟机栈(每个方法对应一个栈帧,存储局部变量表、操作数栈等,异常:StackOverflowError(栈深度超限制)、OutOfMemoryError(栈扩展失败))、本地方法栈(为本地方法服务,与虚拟机栈类似)、堆(存储对象实例和数组,最大的内存区域,异常:OutOfMemoryError)、方法区(存储类信息、常量、静态变量等,JDK7前为永久代(PermGen),JDK8后为元空间(MetaSpace,使用本地内存),异常:OutOfMemoryError)。堆的分代收集理论:对象朝生夕灭(年轻代)、少数对象存活(老年代)。年轻代分为Eden区和两个Survivor区(S0、S1,默认比例8:1:1),新对象优先分配在Eden区,MinorGC(YoungGC)时回收Eden和Survivor中存活的对象(复制到另一个Survivor区,年龄+1,年龄≥阈值(默认15)则进入老年代)。老年代存储长期存活的对象或大对象(超过-XX:PretenureSizeThreshold的对象直接进入老年代),触发FullGC(MajorGC)的场景:老年代空间不足、永久代/元空间不足、显式调用System.gc()(可能触发)。类加载机制分为加载、链接(验证、准备、解析)、初始化三个阶段。加载:通过类加载器将class文件加载到内存,提供Class对象;验证:检查字节码格式、语义等是否合法;准备:为静态变量分配内存并设置初始值(如int初始为0,引用初始为null);解析:将符号引用替换为直接引用(如类、方法的引用);初始化:执行类构造器<clinit>()方法(静态变量赋值和静态代码块的合并),触发时机:new对象、调用静态方法/变量(非final)、反射获取类、主类(包含main方法的类)。双亲委派模型:类加载器收到加载请求时,先委托给父类加载器(引导类加载器→扩展类加载器→应用类加载器),父类无法加载时再自己加载。好处:避免重复加载(同一类由同一加载器加载)、保证核心类的安全性(如java.lang.String不会被自定义加载器篡改)。破坏双亲委派的场景:Tomcat的WebappClassLoader(每个Web应用有独立的类加载器,优先加载自己的类)、OSGi的模块化加载(动态加载/卸载类)。垃圾回收算法:标记-清除(Mark-Sweep):标记存活对象,清除未标记对象,缺点是内存碎片;标记-复制(Mark-Copy):将内存分为两块,标记存活对象复制到另一块,清空原块,适用于年轻代(存活少);标记-整理(Mark-Compact):标记存活对象,将其向一端移动,整理内存,适用于老年代(存活多)。垃圾收集器:Serial(年轻代,单线程,STW)、ParNew(年轻代,多线程,配合CMS使用)、ParallelScavenge(年轻代,多线程,目标是吞吐量(运行用户代码时间/(用户代码+GC时间)));CMS(老年代,多线程,目标是低停顿,流程:初始标记(STW)→并发标记→重新标记(STW)→并发清除,缺点:内存碎片、浮动垃圾(并发标记时新产生的垃圾需下次收集));G1(全堆收集,分Region(大小相等的区域),跟踪每个Region的回收价值(存活对象少),优先回收价值大的Region,流程:初始标记→并发标记→最终标记→筛选回收);ZGC(低延迟,使用颜色指针和读屏障,停顿时间不超过10ms,支持TB级内存)。内存泄漏的场景:长生命周期对象持有短生命周期对象的引用(如静态集合保存临时对象)、ThreadLocal未remove()、未关闭的资源(如IO流、数据库连接)、监听器/回调未注销(如注册事件监听器后未移除)。排查方法:使用JProfiler、Arthas等工具提供堆转储文件(heapdump),分析对象引用链,定位未被回收的对象。SpringIOC(控制反转)的核心是将对象的创建、依赖注入交给容器管理,减少代码耦合。实现方式:通过BeanFactory(基础容器)或ApplicationContext(扩展容器,支持国际化、事件发布等)。依赖注入的方式:构造器注入(强制依赖)、setter注入(可选依赖)、字段注入(@Autowired)。AOP(面向切面编程)通过动态代理(JDK动态代理或CGLIB)将横切关注点(如日志、事务)与业务逻辑分离,核心概念:切面(Aspect)、连接点(JoinPoint)、切点(Pointcut)、通知(Advice:前置、后置、返回、异常、环绕)、引入(Introduction)、目标对象(Target)、代理(Proxy)、织入(Weaving)。Bean的生命周期:实例化(调用构造方法)→属性注入(依赖注入)→初始化前(@PostConstruct或BeanPostProcessor的postProcessBeforeInitialization)→初始化(实现InitializingBean的afterPropertiesSet或自定义init-method)→初始化后(BeanPostProcessor的postProcessAfterInitialization)→销毁前(@PreDestroy或DisposableBean的destroy或自定义destroy-method)→销毁。Bean的作用域:singleton(单例,默认,容器中仅一个实例)、prototype(原型,每次获取新实例)、request(HTTP请求作用域,仅Web环境)、session(HTTP会话作用域)、application(ServletContext作用域)。循环依赖的解决:Spring通过三级缓存(singletonObjects:单例池,存储已初始化完成的Bean;earlySingletonObjects:存储提前暴露的Bean(未完成初始化);singletonFactories:存储Bean工厂,提供提前暴露的Bean)解决单例Bean的循环依赖。例如A依赖B,B依赖A:创建A时将A的工厂(()->getEarlyBeanReference)放入singletonFactories;A注入B时触发B的创建,B注入A时从A的工厂获取早期引用(放入earlySingletonObjects),B初始化完成后放入singletonObjects;A获取B后完成初始化,放入singletonObjects。注意:构造器注入和prototype作用域的循环依赖无法解决(构造器注入时无法提前暴露Bean,prototype不缓存)。Spring事务的传播行为:REQUIRED(默认,当前有事务则加入,无则新建)、REQUIRES_NEW(新建事务,挂起当前事务)、SUPPORTS(当前有事务则加入,无则非事务执行)、NOT_SUPPORTED(非事务执行,挂起当前事务)、MANDATORY(当前必须有事务,无则抛异常)、NEVER(当前必须无事务,有则抛异常)、NESTED(嵌套事务,基于保存点,回滚仅回滚嵌套部分)。隔离级别:DEFAULT(使用数据库默认,如MySQL的可重复读)、READ_UNCOMMITTED(读未提交,可能脏读)、READ_COMMITTED(读已提交,避免脏读)、REPEATABLE_READ(可重复读,避免不可重复读,MySQL默认)、SERIALIZABLE(串行化,最高隔离,避免幻读,性能低)。SpringMVC的执行流程:客户端发送请求→DispatcherServlet(前端控制器)接收→HandlerMapping(处理器映射)根据URL找到Handler(控制器方法)→HandlerAdapter(处理器适配器)调用Handler→Handler处理请求并返回ModelAndView→ViewResolver(视图解析器)解析视图名→View(视图)渲染数据→响应客户端。核心组件:DispatcherServlet、HandlerMapping、HandlerAdapter、ViewResolver、ModelAndView、View。@Autowired和@Resource的区别:@Autowired是Spring注解,默认按类型注入,可通过@Qualifier指定名称;@Resource是JSR-250注解(Java标准),默认按名称注入(name属性),无名称则按类型。@Autowired可用于构造器、方法、字段,@Resource用于字段和setter方法。SpringBoot自动配置的原理:@SpringBootApplication包含@EnableAutoConfiguration,该注解通过SpringFactoriesLoader加载META-INF/spring.factories中的自动配置类(如DataSourceAutoConfiguration)。每个自动配置类使用@Conditional系列注解(如@ConditionalOnClass(类存在时生效)、@ConditionalOnMissingBean(无该Bean时生效))判断是否生效,从而实现按需加载。开发者可通过perties配置参数覆盖默认值(如spring.datasource.url)。MyBatis动态SQL的常用标签:<iftest="条件">(条件判断)、<where>(自动处理AND/OR前缀)、<set>(自动处理逗号后缀)、<foreachcollection="集合"item="元素"open="("separator=","close=")">(遍历集合)、<choose><when><otherwise>(类似switch-case)。例如查询用户列表,可选参数姓名和年龄:<selectid="selectUsers"resultType="User">SELECTFROMuser<where><iftest="name!=null">name={name}</if><iftest="age!=null">ANDage={age}</if></where></select>{}和${}的区别:{}是预编译处理(PreparedStatement),防止SQL注入,将参数替换为占位符?;${}是字符串替换(Statement),直接拼接参数,用于表名、列名等动态字段(需手动过滤)。例如排序时使用${order}指定排序列:ORDERBY${order}。MyBatis一级缓存(SqlSession级):同一SqlSession中查询相同语句(相同参数、相同Mapper方法)会缓存结果,SqlSession关闭或执行增删改(或手动clearCache())时清空。二级缓存(Mapper级):多个SqlSession共享,需在Mapper.xml中配置<cache/>,并开启全局缓存(mybatis.configuration.cache-enabled=true),缓存键为(namespace+sqlId+参数),适用于查询多、修改少的场景(如字典表)。MyBatis插件机制通过动态代理实现,可拦截Executor(执行器)、ParameterHandler(参数处理器)、ResultSetHandler(结果集处理器)、StatementHandler(语句处理器)的方法。自定义插件需实现Interceptor接口,使用@Intercepts和@Signature注解指定拦截的方法,通过代理对象增强功能(如分页插件PageHelper)。MyBatis与Hibernate的区别:MyBatis是半ORM(对象关系映射),需手动编写SQL,灵活性高,适合复杂查询;Hibernate是全ORM,自动提供SQL,封装性好,适合简单CRUD。MyBatis学习成本低(熟悉SQL即可),Hibernate需学习HQL和缓存机制。MyBatis性能可控(手动优化SQL),Hibernate可能因自动提供SQL性能低下(如N+1查询问题)。MySQL索引类型:主键索引(唯一标识,自动创建,InnoDB主键索引是聚簇索引,数据按主键顺序存储)、唯一索引(字段值唯一,允许多个null)、普通索引(无唯一性约束)、全文索引(用于文本搜索,MyISAM和InnoDB(5.6+)支持)、组合索引(多字段联合索引,遵循最左匹配原则)。索引优化原则:选择区分度高的字段(如用户ID比性别好)、避免在小基数字段(如状态字段)建索引、组合索引将高频查询字段放前面、覆盖索引(查询字段包含在索引中,避免回表)。事务的ACID特性:原子性(Atomicity,操作要么全成功要么全失败)、一致性(Consistency,从一个一致状态到另一个一致状态)、隔离性(Isolation,事务间互不干扰)、持久性(Durability,提交后数据永久保存)。隔离级别:读未提交(READUNCOMMITTED,允许脏读)、读已提交(READCOMMITTED,避免脏读,可能不可重复读,Oracle默认)、可重复读(REPEATABLEREAD,避免不可重复读,可能幻读,MySQL默认)、串行化(SERIALIZABLE,避免幻读,性能最差)。脏读(读取未提交的修改)、不可重复读(同一事务两次读取结果不同)、幻读(同一事务两次查询返回行数不同)。索引失效的场景:使用!=或<>(可能全表扫描)、字段参与计算(如WHEREage+1=20)、类型不匹配(如字符串字段用数字查询未加引号,导致全表扫描)、左模糊查询(LIKE'%abc')、OR条件中有未索引的字段(如id=1ORname='a',若name无索引则全表扫描)、组合索引不满足最左匹配(如索引(a,b,c),查询b=1或c=1失效)、数据分布不均(如性别字段只有两个值,索引效果差)。慢查询优化步骤:开启慢查询日志(slow_query_log=ON,long_query_time=1),记录执行时间超过阈值的SQL;使用EXPLAIN分析慢SQL的执行计划(关注type(最好为const,最差为ALL)、key(使用的索引)、rows(扫描行数)、Extra(如Usingfilesort(文件排序)、Usingtemporary(临时表)));优化索引(添加组合索引、覆盖索引)、重写SQL(避免子查询改用JOIN、减少OR条件)、分页优化(如记录上次查询的最大ID,使用WHEREid>last_idLIMIT10)。InnoDB和MyISAM的区别:InnoDB支持事务(默认可重复读)、行级锁(并发高)、外键约束;MyISAM不支持事务,表级锁(并发低),无外键。InnoDB的聚簇索引(主键索引)存储数据,辅助索引(非主键)存储主键值(需回表查询);MyISAM的索引和数据分开存储(非聚簇索引)。InnoDB有MVCC(多版本并发控制),MyISAM无。InnoDB适合高并发、事务场景(如订单系统),MyISAM适合读多写少、无事务场景(如日志表)。分库分表的策略:垂直分库(按业务拆分,如用户库、订单库)、垂直分表(按字段拆分,如用户表拆分为用户基本信息表和用户详细信息表)、水平分库(按规则(如ID取模、范围)将数据分散到不同库)、水平分表(将大表拆分为多个小表,如order_1、order_2)。路由算法:哈希取模(简单,扩容需数据迁移)、范围划分(如ID1-1000到表1,1001-2000到表2,扩容方便,数据分布不均)、雪花算法(提供全局唯一ID,包含时间戳、机器ID等,可按时间范围分库)。单例模式的实现:饿汉式(类加载时创建,线程安全):publicclassSingleton{privatestaticfinalSingletonINSTANCE=newSingleton();privateSingleton(){}publicstaticSingletongetInstance(){returnINSTANCE;}}懒汉式(线程不安全,多线程下可能创建多个实例):publicclassSingleton{privatestaticSingletonINSTANCE;privateSingleton(){}publicstaticSingletongetInstance(){if(INSTANCE==null){INSTANCE=newSingleton();}returnINSTANCE;}}线程安全的懒汉式(synchronized,效率低):publicstaticsynchronizedSingletongetInstance(){if(INSTANCE==null){INSTANCE=newSingleton();}returnINSTANCE;}双重检查锁定(DCL,线程安全,效率高,需volatile防止指令重排):publicclassSingleton{privatestaticvolatileSingletonINSTANCE;//volatile禁止指令重排privateSingleton(){}publicstaticSingletongetInstance(){if(INSTANCE==null){//第一次检查,减少锁竞争synchronized(Singleton.class){if(INSTANCE==null){//第二次检查,防止多线程同时通过第一次检查INSTANCE=newSingleton();}}}returnINSTANCE;}}枚举式(最安全,线程安全,防止反射和反序列化攻击):publicenumSingleton{INSTANCE;publicvoidmethod(){}}工厂模式:简单工厂(静态工厂,根据参数创建不同对象,违反开闭原则):publicclassSimpleFactory{publicstaticProductcreateProduct(Stringtype){if("A".equals(type)){returnnewProductA();}elseif("B".equals(type)){returnnewProductB();}thrownewIllegalArgumentException("无效类型");}}工厂方法(每个产品对应一个工厂,符合开闭原则):publicinterfaceFactory{ProductcreateProduct();}publicclassProductAFactoryimplementsFactory{publicProductcreateProduct(){returnnewProductA();}}抽象工厂(创建产品族,如不同操作系统的按钮和文本框):publicinterfaceAbstractFactory{ButtoncreateButton();TextBoxcreateTextBox();}publicclassWindowsFactoryimplementsAbstractFactory{publicButtoncreateButton(){returnnewWindowsButton();}publicTextBoxcreateTextBox(){returnnewWindowsTextBox();}}代理模式:静态代理(编译期提供,代理类和目标类实现同一接口):publicinterfaceSubject{voidrequest();}publicclassRealSubjectimplementsSubject{publicvoidrequest(){System.out.println("真实对象处理请求");}}publicclassStaticProxyimplementsSubject{privateSubjectrealSubject;publicStaticProxy(SubjectrealSubject){this.realSubject=realSubject;}publicvoidrequest(){System.out.println("代理前处理");realSubject.request();System.out.println("代理后处理");}}动态代理(JDK动态代理,基于接口,通过InvocationHandler实现):publicclassJdkProxyimplementsInvocationHandler{privateObjecttarget;publicJdkProxy(Objecttarget){this.target=target;}publicObjectinvoke(O

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论