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

下载本文档

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

文档简介

java工程师面试笔试题及答案Java基础知识与面向对象编程(20分)1.下列哪个关键字不能用于修饰Java类?A.publicB.privateC.protectedD.static2.关于Java中的final关键字,以下说法错误的是?A.final类不能被继承B.final方法不能被重写C.final变量只能被赋值一次D.final修饰的引用变量指向的对象内容不能被修改3.下列哪个不是Java的基本数据类型?A.intB.BooleanC.charD.float4.关于Java中的接口,以下说法正确的是?A.接口可以实例化B.接口中可以有静态方法C.接口中可以有构造方法D.接口中可以包含实例变量5.关于Java中的异常处理,以下说法正确的是?A.Error是Exception的子类B.RuntimeException是非检查异常C.try-with-resources语句只能用于实现AutoCloseable接口的对象D.catch块可以捕获多个异常,但异常类型不能有包含关系6.简述Java中==与equals方法的区别,并举例说明。7.简述Java中抽象类与接口的区别,并说明各自的使用场景。集合框架与数据结构(20分)1.关于Java中的ArrayList和LinkedList,以下说法错误的是?A.ArrayList基于动态数组实现,LinkedList基于双向链表实现B.ArrayList随机访问时间复杂度为O(1),LinkedList为O(n)C.ArrayList插入和删除操作时间复杂度为O(1),LinkedList为O(n)D.ArrayList内存占用通常比LinkedList小2.下列哪个集合类不是线程安全的?A.VectorB.HashtableC.ArrayListD.ConcurrentHashMap3.关于Java中的HashMap,以下说法错误的是?A.HashMap允许null键和null值B.HashMap的默认初始容量是16C.HashMap的负载因子默认是0.75D.HashMap在多线程环境下使用不会导致数据不一致4.关于Java中的TreeMap,以下说法正确的是?A.TreeMap基于红黑树实现,可以保证元素有序B.TreeMap不允许null键,但允许null值C.TreeMap的put操作时间复杂度为O(1)D.TreeMap的迭代顺序是插入顺序5.下列哪个数据结构最适合实现LRU缓存?A.HashMap+双向链表B.TreeMapC.HashSetD.WeakHashMap6.请实现一个LRU缓存类,要求支持以下操作:-get(key):获取指定key的值,如果不存在返回-1-put(key,value):如果key存在,更新value;如果不存在,添加key-value对。当缓存容量达到上限时,移除最久未使用的元素。多线程与并发编程(20分)1.关于Java中的线程,以下说法错误的是?A.实现Runnable接口比继承Thread类更灵活B.start()方法会创建新的线程并执行run()方法C.run()方法直接调用不会创建新线程D.线程启动后立即进入运行状态2.下列哪个方法可以确保线程安全?A.synchronized关键字B.volatile关键字C.ThreadLocal类D.ReentrantLock类3.关于Java中的线程池,以下说法错误的是?A.Executors.newFixedThreadPool创建的线程池核心线程数固定B.Executors.newCachedThreadPool创建的线程池没有核心线程数限制C.ThreadPoolExecutor可以自定义线程池参数D.使用无界队列的线程池可能导致内存溢出4.关于Java中的volatile关键字,以下说法正确的是?A.volatile修饰的变量具有原子性B.volatile修饰的变量具有可见性C.volatile可以保证复合操作的原子性D.volatile可以替代synchronized关键字5.关于Java中的CAS(Compare-And-Swap),以下说法错误的是?A.CAS是CPU提供的原语指令B.CAS是无锁算法的基础C.CAS在并发量高时性能更好D.CAS可能导致ABA问题6.请编写一个生产者-消费者模型,要求:-使用BlockingQueue作为共享缓冲区-生产者线程生产随机整数并存入队列-消费者线程从队列中取出整数并计算平方-控制生产者和消费者的数量,确保程序正常运行JVM与性能优化(20分)1.关于Java内存模型,以下说法错误的是?A.堆是所有线程共享的一块内存区域B.虚拟机栈是线程私有的C.方法区存储类的结构信息D.程序计数器是线程私有的2.关于Java垃圾回收,以下说法错误的是?A.标记-清除算法会产生内存碎片B.复制算法实现简单,内存利用率高C.标记-整理算法适合老年代D.分代收集算法将堆分为新生代和老年代3.下列哪个不是JVM的运行时数据区域?A.虚拟机栈B.本地方法栈C.程序计数器D.缓冲区4.关于Java类加载机制,以下说法错误的是?A.类加载过程包括加载、验证、准备、解析和初始化B.双亲委派模型可以防止核心API被篡改C.类加载器之间有继承关系D.自定义类加载器必须继承ClassLoader类5.关于JVM调优,以下说法正确的是?A.增大堆内存可以减少GC次数B.使用-XX:+UseParallelGC可以启用并发标记清除C.年轻代大小设置过大会导致对象提前晋升D.老年代大小设置过大会导致FullGC频率增加6.简述Java内存泄漏的常见原因及排查方法。框架与实际应用(20分)1.关于Spring框架,以下说法错误的是?A.Spring是一个轻量级控制反转(IoC)和面向切面(AOP)的容器框架B.SpringBean的作用域包括singleton、prototype、request、session等C.Spring的事务传播行为包括REQUIRED、SUPPORTS、MANDATORY等D.SpringMVC中,Controller处理请求后返回ModelAndView对象2.关于MyBatis框架,以下说法正确的是?A.MyBatis支持动态SQLB.MyBatis的映射文件中resultType用于指定返回结果集的类型C.MyBatis的{}和${}都可以防止SQL注入D.MyBatis的缓存只有一级缓存3.关于SpringBoot,以下说法错误的是?A.SpringBoot采用约定优于配置的原则B.SpringBoot内置了Tomcat、Jetty等Web服务器C.SpringBoot的自动配置是通过@EnableAutoConfiguration注解实现的D.SpringBoot的Starter都是自动配置的4.关于微服务架构,以下说法错误的是?A.微服务架构将单体应用拆分为多个小型服务B.微服务之间可以通过RESTAPI或消息队列通信C.微服务架构中,每个服务都可以使用不同的技术栈D.微服务架构不需要服务发现机制5.关于分布式事务,以下说法正确的是?A.2PC(两阶段提交)是强一致性的事务解决方案B.TCC(Try-Confirm-Cancel)是最终一致性的事务解决方案C.本地消息表是CAP理论中的CP实现D.Saga是强一致性的事务解决方案6.请使用SpringBoot框架实现一个简单的RESTfulAPI,要求:-实现一个UserController,包含获取用户列表、根据ID获取用户、添加用户、更新用户和删除用户的功能-使用SpringDataJPA进行数据库操作-实现基本的异常处理-添加Swagger文档支持---标准答案及解析Java基础知识与面向对象编程1.答案:B解析:private关键字不能用于修饰Java类。Java类可以使用的访问修饰符有public和默认包级访问,但不能使用private或protected。private和protected通常用于修饰类中的成员变量和方法。2.答案:D解析:final修饰的引用变量指向的对象内容是可以被修改的。final关键字确保引用变量不能指向其他对象,但对象本身的内容是可以修改的。例如:```javafinalStringBuildersb=newStringBuilder("Hello");sb.append("World");//这是允许的//sb=newStringBuilder();//这是不允许的```3.答案:B解析:Java的基本数据类型包括byte、short、int、long、float、double、char和boolean。Boolean不是基本数据类型,它是基本数据类型boolean的包装类。4.答案:B解析:从Java8开始,接口中可以有静态方法。接口不能被实例化,接口中不能有构造方法,接口中的变量默认是publicstaticfinal的,也就是常量。5.答案:B解析:RuntimeException是非检查异常,不需要在方法声明中使用throws关键字声明,也不需要在代码中使用try-catch块捕获。Error是Throwable的子类,不是Exception的子类。try-with-resources语句可以用于任何实现了AutoCloseable接口的对象,而不仅仅是实现了AutoCloseable接口的对象。catch块可以捕获多个异常,但异常类型不能有包含关系,否则会导致编译错误。6.答案:==与equals的区别:-==是比较两个对象的内存地址是否相同,而equals是比较两个对象的内容是否相同。-==对于基本数据类型,比较的是值是否相等;对于对象,比较的是内存地址是否相等。-equals是Object类的方法,默认实现也是比较内存地址,但很多类(如String、Integer等)重写了equals方法,用于比较内容。示例:```java//基本数据类型inta=10;intb=10;System.out.println(a==b);//输出true,比较的是值//对象Strings1=newString("hello");Strings2=newString("hello");Strings3=s1;System.out.println(s1==s2);//输出false,比较的是内存地址System.out.println(s1==s3);//输出true,比较的是内存地址System.out.println(s1.equals(s2));//输出true,比较的是内容```7.答案:抽象类与接口的区别:-抽象类可以包含抽象方法和具体方法,而接口只能包含抽象方法(Java8之前)和默认方法、静态方法(Java8及以后)。-一个类只能继承一个抽象类,但可以实现多个接口。-抽象类可以有构造方法,接口不能有构造方法。-抽象类可以有成员变量,接口中的变量默认是publicstaticfinal的。-抽象类表示"is-a"关系,接口表示"can-do"关系。使用场景:-当多个类具有共同的属性和行为时,使用抽象类。-当需要定义多个类的共同行为,但不关心这些类的具体实现时,使用接口。-当需要实现多重继承的效果时,使用接口。-当需要为类添加一些可选行为时,使用接口的默认方法。集合框架与数据结构1.答案:C解析:ArrayList基于动态数组实现,LinkedList基于双向链表实现。ArrayList随机访问时间复杂度为O(1),LinkedList为O(n)。ArrayList插入和删除操作的时间复杂度为O(n)(在非末尾位置),LinkedList在头尾插入和删除的时间复杂度为O(1),在中间位置为O(n)。ArrayList内存占用通常比LinkedList小,因为LinkedList需要额外的空间存储节点指针。2.答案:C解析:Vector、Hashtable和ConcurrentHashMap都是线程安全的,ArrayList不是线程安全的。Vector和Hashtable是Java早期的线程安全集合,ConcurrentHashMap是Java并发包中的线程安全集合,而ArrayList不是线程安全的。3.答案:D解析:HashMap允许null键和null值,HashMap的默认初始容量是16,HashMap的负载因子默认是0.75。HashMap在多线程环境下使用可能导致数据不一致,比如死循环、数据丢失等问题。在多线程环境下,应该使用ConcurrentHashMap。4.答案:A解析:TreeMap基于红黑树实现,可以保证元素有序(按照自然排序或自定义比较器排序)。TreeMap不允许null键(会抛出NullPointerException),但允许null值。TreeMap的put操作时间复杂度为O(logn),不是O(1)。TreeMap的迭代顺序是排序顺序,不是插入顺序。5.答案:A解析:HashMap+双向链表是最适合实现LRU缓存的数据结构。HashMap可以提供O(1)的查找时间,双向链表可以维护元素的访问顺序。Java中的LinkedHashMap已经实现了这种结构,它内部使用HashMap和双向链表,可以方便地实现LRU缓存。TreeMap虽然有序,但不适合实现LRU缓存。HashSet和WeakHashMap都不能很好地维护元素的访问顺序。6.答案:```javaimportjava.util.HashMap;importjava.util.Map;publicclassLRUCache{privateintcapacity;privateMap<Integer,Node>cache;privateNodehead;privateNodetail;privateclassNode{intkey;intvalue;Nodeprev;Nodenext;publicNode(intkey,intvalue){this.key=key;this.value=value;}}publicLRUCache(intcapacity){this.capacity=capacity;this.cache=newHashMap<>();this.head=newNode(0,0);this.tail=newNode(0,0);head.next=tail;tail.prev=head;}publicintget(intkey){if(!cache.containsKey(key)){return-1;}Nodenode=cache.get(key);moveToHead(node);returnnode.value;}publicvoidput(intkey,intvalue){if(cache.containsKey(key)){Nodenode=cache.get(key);node.value=value;moveToHead(node);}else{Nodenode=newNode(key,value);cache.put(key,node);addToHead(node);if(cache.size()>capacity){Nodetail=removeTail();cache.remove(tail.key);}}}privatevoidmoveToHead(Nodenode){removeNode(node);addToHead(node);}privatevoidremoveNode(Nodenode){node.prev.next=node.next;node.next.prev=node.prev;}privatevoidaddToHead(Nodenode){node.prev=head;node.next=head.next;head.next.prev=node;head.next=node;}privateNoderemoveTail(){Nodenode=tail.prev;removeNode(node);returnnode;}}```解析:这个LRU缓存实现使用了HashMap和双向链表。HashMap用于存储键值对,提供O(1)的查找时间。双向链表用于维护元素的访问顺序,最近访问的元素放在链表头部,最久未访问的元素放在链表尾部。LRUCache类的主要方法:-get(key):获取指定key的值,如果不存在返回-1。如果存在,将对应的节点移动到链表头部,表示最近访问。-put(key,value):如果key存在,更新value并将节点移动到链表头部。如果不存在,创建新节点并添加到链表头部。如果缓存容量达到上限,移除链表尾部的节点。辅助方法:-moveToHead(node):将节点移动到链表头部。-removeNode(node):从链表中移除指定节点。-addToHead(node):将节点添加到链表头部。-removeTail():移除链表尾部的节点并返回。这种实现的时间复杂度为O(1),满足LRU缓存的要求。多线程与并发编程1.答案:D解析:实现Runnable接口比继承Thread类更灵活,因为Java不支持多重继承,但可以实现多个接口。start()方法会创建新的线程并执行run()方法。run()方法直接调用不会创建新线程,而是在当前线程中执行。线程启动后,会进入就绪状态,而不是立即进入运行状态。是否进入运行状态取决于线程调度器的调度。2.答案:A解析:synchronized关键字可以确保线程安全,它可以在方法或代码块上使用,保证同一时间只有一个线程可以执行被synchronized修饰的代码。volatile关键字可以保证变量的可见性,但不能保证复合操作的原子性。ThreadLocal类可以为每个线程提供独立的变量副本,但并不能保证共享变量的线程安全。ReentrantLock类是Java并发包提供的锁,可以确保线程安全,但需要手动获取和释放锁。3.答案:B解析:Executors.newFixedThreadPool创建的线程池核心线程数固定,最大线程数等于核心线程数。Executors.newCachedThreadPool创建的线程池没有核心线程数限制,但会回收空闲线程。ThreadPoolExecutor可以自定义线程池参数,如核心线程数、最大线程数、工作队列等。使用无界队列的线程池可能导致内存溢出,因为任务会不断被添加到队列中,直到耗尽内存。4.答案:B解析:volatile关键字可以保证变量的可见性,当一个线程修改了volatile变量,其他线程可以立即看到修改后的值。volatile修饰的变量不具有原子性,不能保证复合操作的原子性。volatile不能替代synchronized关键字,因为它不能保证原子性和锁的排他性。5.答案:C解析:CAS是CPU提供的原语指令,可以保证操作的原子性。CAS是无锁算法的基础,如Java中的Atomic类。CAS在并发量高时可能导致自旋次数增加,性能下降。CAS可能导致ABA问题,即一个变量从A变为B再变为A,CAS操作会认为值没有变化。6.答案:```javaimportjava.util.Random;importjava.util.concurrent.BlockingQueue;importjava.util.concurrent.LinkedBlockingQueue;importjava.util.concurrent.ExecutorService;importjava.util.concurrent.Executors;publicclassProducerConsumer{privatestaticfinalintCAPACITY=10;privatestaticfinalintPRODUCER_COUNT=3;privatestaticfinalintCONSUMER_COUNT=2;publicstaticvoidmain(String[]args){BlockingQueue<Integer>queue=newLinkedBlockingQueue<>(CAPACITY);ExecutorServiceexecutor=Executors.newFixedThreadPool(PRODUCER_COUNT+CONSUMER_COUNT);//创建生产者for(inti=0;i<PRODUCER_COUNT;i++){executor.execute(newProducer(queue,i+1));}//创建消费者for(inti=0;i<CONSUMER_COUNT;i++){executor.execute(newConsumer(queue,i+1));}executor.shutdown();}staticclassProducerimplementsRunnable{privatefinalBlockingQueue<Integer>queue;privatefinalintid;privatefinalRandomrandom=newRandom();publicProducer(BlockingQueue<Integer>queue,intid){this.queue=queue;this.id=id;}@Overridepublicvoidrun(){try{while(true){intnumber=random.nextInt(100);queue.put(number);System.out.printf("Producer%dproduced:%d%n",id,number);Thread.sleep(random.nextInt(1000));}}catch(InterruptedExceptione){Thread.currentThread().interrupt();}}}staticclassConsumerimplementsRunnable{privatefinalBlockingQueue<Integer>queue;privatefinalintid;publicConsumer(BlockingQueue<Integer>queue,intid){this.queue=queue;this.id=id;}@Overridepublicvoidrun(){try{while(true){intnumber=queue.take();intsquare=numbernumber;System.out.printf("Consumer%dconsumed:%d,square:%d%n",id,number,square);Thread.sleep(1000);}}catch(InterruptedExceptione){Thread.currentThread().interrupt();}}}}```解析:这个生产者-消费者模型使用了BlockingQueue作为共享缓冲区,BlockingQueue是一个线程安全的队列,提供了阻塞操作,当队列为空时,take()方法会阻塞,直到有元素可用;当队列满时,put()方法会阻塞,直到有空间可用。Producer类实现了Runnable接口,用于生产随机整数并存入队列。每次生产一个随机数后,会打印生产信息,然后随机休眠一段时间。Consumer类也实现了Runnable接口,用于从队列中取出整数并计算平方。每次消费一个数后,会打印消费信息和平方结果,然后休眠1秒。在main方法中,创建了一个固定大小的线程池,用于执行生产者和消费者任务。创建了3个生产者和2个消费者,它们共享一个容量为10的LinkedBlockingQueue。这种实现方式利用了BlockingQueue的阻塞特性,避免了手动同步和通知的复杂性,代码简洁且线程安全。JVM与性能优化1.答案:D解析:堆是所有线程共享的一块内存区域,用于存储对象实例和数组。虚拟机栈是线程私有的,每个线程都有自己的虚拟机栈,用于存储栈帧。方法区也是线程共享的,用于存储类的结构信息、常量、静态变量等。程序计数器是线程私有的,用于存储当前线程所执行的字节码行号。缓冲区不是JVM的运行时数据区域,它是应用程序中用于存储临时数据的区域,如I/O缓冲区等。2.答案:B解析:标记-清除算法会产生内存碎片,导致后续分配大对象时可能无法找到连续的内存空间。复制算法实现简单,但内存利用率低,因为需要将存活对象复制到新的空间。标记-整理算法适合老年代,它会先标记存活对象,然后移动这些对象到内存的一端,直接清理端边界以外的内存。分代收集算法将堆分为新生代和老年代,根据不同代的特点使用不同的垃圾回收算法。3.答案:D解析:JVM的运行时数据区域包括程序计数器、虚拟机栈、本地方法栈、堆和方法区。缓冲区不是JVM的运行时数据区域,它是应用程序中用于存储临时数据的区域,如I/O缓冲区等。4.答案:D解析:类加载过程包括加载、验证、准备、解析和初始化。双亲委派模型可以防止核心API被篡改,它要求类加载器先尝试委托父类加载器加载类,只有当父类加载器无法加载时,才尝试自己加载。类加载器之间有层次关系,不是继承关系。自定义类加载器不一定必须继承ClassLoader类,但通常需要继承ClassLoader类以重写findClass方法来实现自定义的类加载逻辑。5.答案:C解析:增大堆内存可以减少GC次数,但会增加GC的停顿时间。使用-XX:+UseParallelGC可以启用并行垃圾收集,而不是并发标记清除。年轻代大小设置过大会导致对象在年轻代停留时间更长,可能会增加对象晋升到老年代的概率。老年代大小设置过大会导致FullGC频率增加,因为老年代空间大,对象不容易填满,但一旦发生FullGC,停顿时间会更长。6.答案:Java内存泄漏的常见原因及排查方法:常见原因:1.静态集合类:如静态Map、List等,如果添加了对象而没有及时清理,会导致对象无法被GC回收。2.各种连接:数据库连接、网络连接、IO流等,如果没有正确关闭,会导致资源无法被释放。3.监听器、回调:如果没有取消注册或移除,会导致对象无法被GC回收。4.ThreadLocal:如果没有及时清理,可能导致内存泄漏。5.缓存:如果缓存没有设置合理的过期策略,可能导致内存泄漏。排查方法:1.使用内存分析工具:如VisualVM、MAT、JProfiler等,可以分析堆转储文件,找出内存泄漏的对象。2.使用JVM参数:添加-XX:+HeapDumpOnOutOfMemoryError参数,可以在发生OOM时自动生成堆转储文件。3.使用GC日志:添加-verbose:gc-Xloggc:gc.log参数,可以记录GC日志,分析内存使用情况。4.代码审查:检查代码中是否有静态集合、未关闭的资源、未取消的监听器等。5.使用内存监控工具:如JConsole、MissionControl等,可以实时监控内存使用情况。解析:内存泄漏是指程序中不再使用的对象仍然被引用,导致无法被垃圾回收器回收,从而占用内存空间。Java内存泄漏通常是由于代码中的逻辑错误导致的,如忘记释放资源、引用了不应该被引用的对象等。排查内存泄漏需要结合工具和代码分析。内存分析工具可以帮助我们找到内存泄漏的对象,GC日志可以帮助我们分析内存使用情况,代码审查可以帮助我们发现潜在的内存泄漏问题。解决内存泄漏的方法包括:及时释放资源、使用弱引用、设置合理的缓存策略、避免静态集合持有对象引用等。框架与实际应用1.答案:C解析:Spring是一个轻量级控制反转(IoC)和面向切面(AOP)的容器框架。SpringBean的作用域包括singleton(单例)、prototype(原型)、request(请求)、session(会话)等。Spring的事务传播行为包括REQUIRED(支持当前事务,不存在则创建新事务)、SUPPORTS(支持当前事务,不存在则以非事务方式执行)、MANDATORY(必须在一个事务中运行,否则抛出异常)等。SpringMVC中,Controller处理请求后可以返回ModelAndView对象,也可以直接返回String(视图名)、对象(会自动转换为JSON)等。2.答案:B解析:MyBatis支持动态SQL,可以使用<if>、<where>、<foreach>等标签实现动态SQL。MyBatis的映射文件中,resultType用于指定返回结果集的类型,resultMap用于指定结果集的映射关系。MyBatis的{}可以防止SQL注入,因为{}会进行预编译;而${}不会进行预编译,不能防止SQL注入。MyBatis有一级缓存(SqlSession级别)和二级缓存(Mapper级别)。3.答案:D解析:SpringBoot采用约定优于配置的原则,简化了Spring应用的初始搭建和开发过程。SpringBoot内置了Tomcat、Jetty等Web服务器,可以轻松创建独立的Spring应用。SpringBoot的自动配置是通过@EnableAutoConfiguration注解实现的,它会根据类路径下的依赖自动配置Spring应用。SpringBoot的Starter不是都是自动配置的,有些Starter需要额外的配置才能生效。4.答案:D解析:微服务架构将单体应用拆分为多个小型服务,每个服务都可以独立部署和扩展。微服务之间可以通过RESTAPI、RPC、消息队列等方式通信。微服务架构中,每个服务都可以使用不同的技术栈,以满足不同的业务需求。微服务架构需要服务发现机制,用于服务之间的通信和负载均衡。5.答案:A解析:2PC(两阶段提交)是强一致性的事务解决方案,它分为准备阶段和提交阶段,所有参与者要么全部提交,要么全部回滚。TCC(Try-Confirm-Cancel)是一种补偿事务方案,属于最终一致性的事务解决方案。本地消息表是BASE理论中的最终一致性实现,不是CAP理论中的CP实现。Saga是一种分布式事务解决方案,它通过一系列本地事务来实现分布式事务,属于最终一致性的事务解决方案。6.答案:```javaimportorg.springframework.boot.SpringApplication;importorg.springframework.boot.autoconfigure.SpringBootApplication;importorg.springframework.web.bind.annotation.;importspringfox.documentation.builders.RequestHandlerSelectors;importspringfox.documentation.spi.DocumentationType;importspringfox.documentation.spring.web.plugins.Docket;importspringfox.documentation.swagger2.annotations.EnableSwagger2;@SpringBootApplication@EnableSwagger2publicclassApplication{publicstaticvoidmain(String[]args){SpringApplication.run(Application.class,args);}@BeanpublicDocketapi(){returnnewDocket(DocumentationType.SWAGGER_2).select().apis(RequestHandlerSelectors.basePackage("com.example.controller")).build();}}@RestController@RequestMapping("/api/users")classUserController{privatefinalUserRepositoryuserRepository;publicUserController(UserRepositoryuserRepository){this.userRepository=userRepository;}@GetMappingpublicResponseEntity<List<User>>getAllUsers(){List<User>users=userRepository.findAll();returnResponseEntity.ok(users);}@GetMapping("/{id}")publicResponseEntity<User>getUserById(@PathVariableLongid){returnuserRepository.findById(id).map(ResponseEntity::ok).orElse(ResponseEntity.notFound().build());}@PostMappingpublicResponseEntity<User>createUser(@RequestBodyUseruser){UsersavedUser=userRepository.save(user);returnResponseEntity.status(HttpStatus.CREATED).body(savedUser);}@PutMapping("/{id}")

温馨提示

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

最新文档

评论

0/150

提交评论