后端Java开发人员访谈:问题和在哪里寻找答案。第1部分



我曾经为Backend Java开发人员进行了一系列采访,并为自己写下了未来的问题,因此我可以稍后再回顾一下自己的记忆。我认为该收藏集可能不仅对我有用,所以我吹掉了灰尘,记下了答案并与社区分享。我不假装是原创和专有的:类似的文章已经在哈布雷(Habré)上发表过,并且在许多其他地方-最后(在第二部分中),我将提供链接列表,以使备忘单尽可能完整。



— . - - middle, . . , .



, . Java Spring, — .



TL;DR

GitHub- , .





Java



1. Equals, hashcode HashMap.

. HashMap. ? ? , , . — ? , , ? . . . .



equals hashcode:



  1. .
  2. equals, .
  3. , equals ().
  4. , .


, - .



HashMap ( , Java 8, - ). , IDE. :)



2. : , , , , .

ArrayList vs LinkedList. , , — - , ArrayList , LinkedList , « » LinkedList. . , , ArrayList System.arraycopy, , .



3. `Object`.

HashMap, Java.



- ( :D), JavaDoc:



  • clone
  • equals
  • finalize (Deprecated)
  • getClass
  • hashCode
  • toString
  • notify
  • notifyAll
  • wait


, Object .



4. `wait`, `notify`, `notifyAll` `synchronized`.

, Baeldung . , , wait, notify, notifyAll synchronized . Oracle Concurrency Java.

, — . Java Language Specification, 17.1 17.2.



5. JMM. volatile. .

, JMM — , , . , , — , .



, JMM.



, JMM. , . ". Java- ": 1 2.



Java Language Specification, 17.4.



itsobes.ru.

JVM- How ‘volatile’ works on JVM level? Medium.



6. . ? ? JVM? , , - ?

Java Stack Heap.



Stack — , LIFO. frame — . , , , Heap. , Escape Analysis Java 6, , , . Escape Analysis ( ) , .



Frame Stack . Frame , , , . Stack . JVM Specification.



Heap . , telegram- Senior's Blog. :



Heap :



  1. Young Generation

    1. Eden
    2. Survivor 0 Survivor 1


  2. Old Generation

    1. Tenured






Young : Eden, Survivor 0 Survivor 1. Eden . Survivor . Eden , Eden Survivor Survivor, Eden Survivor . . , Survivor, Tenured.



, Tenured, , . , . Tenured ( ), , , . Mark-Sweep-Compact ( , , ).



-, , Eden, Survivor’ . Tenured.



, , , . Survivor , Eden .

GC:



  • Serial Garbage Collector
  • Parallel Garbage Collector. Java 8.
  • Concurrent Mark Sweep (CMS). Deprecated Java 9.
  • Garbage-First (G1). Java 9. . G1 Oracle.
  • Z Garbage Collector (ZGC)
  • Shenandoah Garbage Collector. Java 12. , , — ,


, .

Java ", !" alygin, , .

74 Podlodka . .



:



  • Method Area — , . JVM.
  • Program Counter (PC) Register — .
  • Run-time Constant Pool — Method Area . , . .
  • Native Method Stack — Stack .


gc JVM (, ):



  • medium
  • — OpenJDK
  • Java Garbage Collection Handbook reachability algorithm
  • Tracing garbage collection
  • Simone Bordet ZGC Shenandoah
  • JVM Anatomy Quarks — JVM. , , , -- .


7. Executor ExecutorService, Thread pool ?

— . N (Thread pool) . . .



Executor (void execute​(Runnable command) — ) ExecutorService ( , Callable ) — , . . Executors. - - , , .



:



  • C
  • Baeldung:
  • Oracle


8. Java ? ? heap-dump?

. . heap-dump, jmap, memory profiler ( VisualVM)



:



  • Baeldung , .
  • Java
  • Java
  • Eclipse MAT
  • Java ?
  • OutOfMemoryError
  • Java VisualVM — Browsing a Heap Dump
  • VisualVM: , Java-
  • , - -
  • Different Ways to Capture Java Heap Dumps
  • Analyze memory snapshots IntelliJ IDEA
  • Analyze objects in the JVM heap IntelliJ IDEA


9. ? ?

parallel stream ForkJoinPool.commonPool Runtime.getRuntime().availableProcessors() — 1. Common pool ForkJoinPool System::exit ( shutdown() shutdownNow()). common pool, pool . Common pool . stream ForkJoinPool — stream Callable submit ForkJoinPool. fork() ForkJoinPool ( ).



ForkJoinPool ExecutorService, ForkJoinTask (RecursiveAction RecursiveTask). pool . ForkJoinPool work stealing — , , . .



:



  • Stream API & ForkJoinPool Fork/Join Framework Java 7
  • ForkJoinPool Java 8
  • Guide to the Fork/Join Framework in Java Guide to Work Stealing in Java Baeldung
  • JavaDoc ForkJoinPool
  • Think Twice Before Using Java 8 Parallel Streams DZone
  • Java Parallel Streams Are Bad for Your Health! JRebel
  • Java Parallel Stream
  • How does the Fork/Join framework act under different configurations?
  • ?


10. ? ?

2 Java Stream:



  • (Intermediate) — filter, map, sorted, peek .. Stream.
  • (Terminal) — collect, forEach, count, reduce, findFirst, anyMatch .. .


, java.util.stream Collectors.



- , . , , - :



  • Java8 Code Kata
  • Experience-Java-8
  • Java. Functional programming


Java Doc, :



  • Java 8 Stream API
  • The Java 8 Stream API Tutorial
  • Java 8 Stream API . , !
  • Java 4. Java Stream API
  • Java Stream API: ,
  • Spliterator


:



  • letsCode — Java Stream API: , , !
  • CSCenter — 8. Stream API
  • Joker 2016 — Stream API


11. List<? extends Number>, List<? super Number>? , , ?

PECS — Producer extends, Consumer super (Joshua Bloch, Effective Java). — (, , ).



(covariance) — .

List<? extends T> , T , . List<? extends T> ( null) — , , . , T T, T.

, List<? extends Number> ArrayList<Number> ArrayList<Integer>, ArrayList<Object>. get Number, Integer Number.

.

, Java 5, .



List<?> List<? extends Object> .



(contravariance) — .

List<? super T> , T , . List<? super T> T , T . Object, .

, List<? super Number> ArrayList<Number>, ArrayList<Object>, Number(.. ArrayList<Integer>). Integer Double ( Number, ), — Object. get Object — .



— .

List<T> , T. T . T, .

, List<Number> ArrayList<Number>, ArrayList<Integer> ArrayList<Object>. Integer Double ( Number, ), — Object. get Number, Integer Number.



:



  • : Generics, API,
  • Generics FAQ
  • generic ?
  • ?
  • StackOverflow: , ,
  • ,
  • Wikipedia
  • Wildcards Oracle


12. ConcurrentHashMap?

ConcurrentHashMap — (, , , ""), .

:



  • (Node<K,V>) val () next( ), (Node<K,V>[] table) volatile
  • CAS — , (insert, delete, replace)
  • volatile/atomic , CAS, intrinsics- (jdk.internal.misc.Unsafe)
  • Concurrent resizing
  • LongAdder


:



  • . , non-null , get(key) happens-before
  • ConcurrentHashMapConcurrentModificationException,
  • (size, isEmpty, containsValue),
  • null,
  • , ( ) , — forEach, search, reduce (bulk operations). , - ( forEach). parallelismThreshold — , parallelismThreshold. Long.MAX_VALUE . 1 ForkJoinPool.commonPool(),


— java 8 . Segment<K,V> , . concurrencyLevel initialCapacity - :



if (initialCapacity < concurrencyLevel)   // Use at least as many bins
    initialCapacity = concurrencyLevel;   // as estimated threads


ConcurrentMap. ConcurrentMap Baeldung.



13. Xmx Xms, Xss?

JVM Xms heap Xmx.

Xss .

:



java -Xmx<>< >


, (k), (m) (g).

:



java -jar my.jar -Xms256m -Xmx2048m


:



  • Mkyong
  • Tuning JVM Orcale
  • Factors Affecting Garbage Collection Performance Oracle
  • X CLI


14. ?

— , , .

— , , .. lock-free thread-safe . compare-and-swap (CAS) , . CAS.



. volatile value, compareAndSet(current, new), — current. CAS value , (.. current), compareAndSet(current, new). value , . , compareAndSet false. compareAndSet(current, new) current value.



:



  • compare-and-setcurrent CAS
  • set-and-getcurrent CAS ,


value VarHandle, Unsafe, . VarHandle — , , , . , /, volotile / compare-and-swap.



java.util.concurrent.atomic :



  • AtomicBoolean, AtomicInteger, AtomicLong, AtomicIntegerArray, AtomicLongArray — , , .
  • AtomicReference — .
  • AtomicMarkableReference[reference, boolean].
  • AtomicStampedReference[reference, int].
  • AtomicReferenceArray
  • AtomicIntegerFieldUpdater, AtomicLongFieldUpdater, AtomicReferenceFieldUpdater — reflection.
  • DoubleAccumulator, LongAccumulator — , , - (BinaryOperator) . , , -. - . , , .
  • DoubleAdder, LongAdder — , . , - , 0.


, :



public class NonReentrantSpinLock {

    private AtomicReference<Thread> owner = new AtomicReference<>();

    public void lock() {
      Thread currentThread = Thread.currentThread();

      while (!owner.compareAndSet(null, currentThread)) {}
    }

    public void unlock() {
      Thread currentThread = Thread.currentThread();
      owner.compareAndSet(currentThread, null);
    }
}


:



  • ?
  • Compare and Swap
  • java.util.concurrent.*
  • "Java Concurrency "
  • JDK concurrent package
  • Atomic operations
  • Concurrency: 6 shared state
  • The Art of Multiprocessor Programming
  • The JSR-133 Cookbook for Compiler Writers
  • AtomicReference: A (Sometimes Easier) Alternative to Synchronized Blocks
  • An Introduction to Atomic Variables in Java Bealdung
  • Use AtomicReference to implement Reentrant Lock
  • A comprehensive understanding of Java atomic variable classes
  • Faster Atomic*FieldUpdaters for Everyone
  • — Unsafe, : VarHandles
  • Introduction to nonblocking algorithms


15. TreeSet/TreeMap? - ?

TreeMapNavigableMap, - . Comparator, , . containsKey, get, put remove.

TreeSetNavigableSet, TreeMap. Comparator, , . add, contains remove.



synchronized ConcurrentModificationException.



null, NullPointerException. null . 7- Java null TreeMap TreeSet .



- , , , . - :



  • ,


:



  • Java .
  • Java TreeMap vs HashMap
  • 10 TreeMap Java Interview Questions TreeSet Interview Questions
  • Internal Working of TreeMap in Java
  • A Guide to TreeMap in Java A Guide to TreeSet in Java Bealdung
  • - :
  • - —
  • -
  • - . .


16. Java 8 Java <CURRENT_VERSION>?

Java . :



  • legacy- Java 8
  • Java 8,
  • Java 9+ ( 11 LTS, )


8 9 , , Java- . , , , , , , Java 8 , Java.



, :



  • 9: Project Jigsaw aka , HTTP/2 Client (Incubator), jshell, G1 GC , Compact Strings .
  • 10: Local-Variable Type Inference (var), Parallel Full GC G1, Graal JIT- .
  • 11 LTS: var , single-file java, String, Epsilon GC (Experimental), ZGC (Experimental) .
  • 12: Switch Expressions (Preview), Shenandoah (Experimental), G1, JMH
  • 13: Text Blocks (Preview)
  • 14: Pattern Matching instanceof (Preview), Packaging Tool (Incubator), NullPointerExceptions, Records (Preview) .
  • 15: Sealed Classes (Preview), Hidden Classes, Nashorn JavaScript Engine JDK .


API, , release notes API Java-.



, , Java:



  • Amber — , Java. JEP: var (JDK 10), Switch Expressions, Sealed Types, Records, Text Blocks, Pattern Matching instanceof .
  • Panama — JVM . .
  • Loom — Java . : .
  • Valhalla — VM. : Inline types, Generics over Primitive Types, Enhanced volatiles .
  • Lanai — Java- MacOS Metal Apple platform API. C 14 2020 Early-Access .


GraalVM — JDK Java, , :



  • Java
  • Java
  • , , -
  • JIT AOT-
  • ..


:



  • Javaswag:
  • 172 Java ,


:



  • Java 8-14
  • API, - Java 8. 1
  • JAVA 9. ?
  • Java 9
  • Java 9
  • Java 9
  • Java 10 General Availability
  • Java 10
  • Java 10
  • Java 10
  • " Java 10": Java 11
  • 90 ( API) JDK 11
  • Java 11: String
  • Java 11 / JDK 11: General Availability
  • 39 , Java 12
  • Java 12! JEP-
  • Java 12: The Teeing Collector
  • Java 13
  • Java 13 " "
  • Introducing Java 13: Let's dive Into JDK's New Features
  • Java 14
  • Java 14 is coming
  • Java 14: Record, instanceof, jpackage, switch-
  • Java 14
  • instanceof Java 14
  • sealed Java 15
  • Sealed classes. Semantics vs performance
  • Sealed Java
  • Java 15?
  • Java 15
  • Project Panama: Java " "?
  • : Java. Project Loom
  • Project Loom: Java
  • , GraalVM
  • Graal — JIT- JVM Java
  • Graal: JIT- JVM
  • GraalVM
  • : OpenJDK-11 + GraalVM
  • JavaScript, Java, ?
  • GraalVM?

    :
  • Java-
  • State of Loom: 1 2
  • GraalVM


:



  • Cay Horstmann — Feature evolution in Java 13 and beyond
  • — Java 9-14:
  • — Java 9 . OSGi?
  • Cay Horstmann — Java 9: the good parts (not modules)
  • — Project Panama: Java “ ”?
  • — GraalVM
  • — Graal, Value Types, Loom
  • — Java ahead of time GraalVM
  • — , partial evaluation, GraalVM
  • Project Loom JDK 14 letsCode
  • GOTO 2019 • Life After Java 8 • Trisha Gee
  • Dalia Abo Sheasha — Migrating beyond Java 8
  • Project Loom: Helping Write Concurrent Applications on the Java Platform by Ron Pressler


17. Java? String? String?

Java 9 UTF-16 (2 ) char.

Java 9 Compact String. Latin-1 ( ), 1 , char . char byte, Latin-1 . byte coder, Latin-1 UTF-16.



String hashcode.



, (final class). , . StringBuilder append. ! Java 9 JEP 280: Indify String Concatenation, . StringBuilder bytecode StringConcatFactory invokedynamic, +.



String poolheap , . .



, [String.intern()](https://docs.oracle.com/en/java/javase/14/docs/api/java.base/java/lang/String.html#intern()) , . . — JVM Anatomy Quark #10: String.intern().



, equals ( indexOf) JIT .



: java.lang.String The Lord of the Strings: Two Scours.



:



  • String javadoc
  • ?
  • String?
  • JDK 9/JEP 280:
  • Java 9
  • Guide to Java String Pool Baeldung
  • Compact Strings in Java 9
  • — invokedynamic
  • Charles Nutter — Let's Talk About Invokedynamic
  • JEP-303 invokedynamic


18. ThreadLocal ?

ThreadLocal — , .



ThreadLocal- , Thread. Thread ThreadLocal.ThreadLocalMap threadLocals, ThreadLocal. ThreadLocal.ThreadLocalMap HashMap, WeakReference<ThreadLocal<?>>, ref field . ThreadLocal, — Object. null, (stale) .

, ThreadLocal , . , .

ThreadLocal- ( get), , threadLocals, , . ThreadLocal.

, ThreadLocal- , .



:



  • thread local ?
  • ThreadLocal
  • ThreadLocal
  • An Introduction to ThreadLocal in Java
  • ThreadLocal
  • 5 ,


19. ? ?

:



  • byte — 1
  • short — 2
  • int — 4
  • long — 8
  • char — 2
  • float — 4
  • double — 8


boolean . — , . JVM. .



— JVM - . Java Objects Inside Out.



:



  • The Java Virtual Machine Specification
  • ?
  • ?
  • ?
  • Java
  • Java Objects Inside Out
  • jol
  • JVM ?
  • Java
  • Measuring Object Sizes in the JVM Bealdung


jvm ( - C++), openjdk. , , :



  • instanceOop.hpp
  • klass.hpp
  • instanceKlass.hpp
  • objArrayKlass.hpp
  • objArrayOop.hpp
  • oopFactory.hpp


20. Java?

Java:



  • Strong reference — Java. GC , ( ).
  • — , . :

    • Soft reference — , SoftReference. GC OutOfMemoryError. , OutOfMemoryError .
    • Weak reference — , WeakReference. GC . . WeakHashMap.
    • Phantom reference — , PhantomReference. GC , . , ( , finalize(), , deprecated).


, get(). , null. null.



, PhantomReference , ReferenceQueue — , . SoftReference WeakReference , PhantomReference . .



:



  • PhantomReferences Java


Spring



21. scope Spring? ? singleton prototype? scope ? ' prototype singleton?'

Spring scope:



  • singleton ( )
  • prototype
  • request
  • session
  • application
  • websocket


scope , Bealdung. , , Spring- . 2.



prototype singleton :



  • @Lookup
  • prototype-
  • ProxyMod = ScopedProxyMode.TARGET_CLASS

    Bealdung Spring- . 2.


22. Spring. ? , ?

, — BeanCurrentlyInCreationException ( ).



:



  • , —
  • @Lazy
  • setter-,


Bealdung



23. , , , DI

Spring- 1 2. — .



.



24. @Transactional. ? ? @Transactional ? @Transactional @Transactional - ?

, Proxy , .



, MyServiceImpl 2 , @Transactionalmethod1 method2( Propagation.REQUIRES_NEW). method1 method2.



, Spring AOP, method1() . method1() MyServiceImpl. method1() method2(), , , , .

, .



? Spring- — 1 2. Proxy .



25. ( Boot) Spring- main-?

Spring- ( ), main-. war-. war- , , . Spring Boot war .



:



  • WAR
  • jar war?
  • Spring Boot JAR WAR RUS ENG


26. Spring Boot ?

-, spring-boot-starter-parent, spring-boot-dependencies, — , dependencyManagement pom. BOM.



Spring Boot — , properties-.



Spring Boot main- @SpringBootApplication run SpringApplication, ApplicationContext.



@SpringBootApplication
public class MyApplication {

    public static void main(String[] args) {
        SpringApplication.run(MyApplication.class, args);
    }
}


@SpringBootApplication @EnableAutoConfiguration, @ComponentScan @Configuration.



SpringBootApplication WebApplicationContext ( classpath Servlet ConfigurableWebApplicationContext), GenericApplicationContext.



META-INF/spring.factoriesorg.springframework.boot.autoconfigure.EnableAutoConfiguration - ( , @ComponentScan, @Import ..) .



@EnableAutoConfiguration AutoConfigurationImportSelector, . getCandidateConfigurations SpringFactoriesLoader loadFactoryNames, classpath META-INF/spring.factories - , .



Spring boot spring-boot-autoconfigure META-INF/spring.factories. - , @Conditional ( ) - .



Spring boot jar spring-boot-maven-plugin. jar META-INF/MANIFEST.MF Main-Classorg.springframework.boot.loader.JarLauncher, Start-Class main- . JarLauncher class path ( org.springframework.boot), BOOT-INF( lib class ), Start-Class.



:



  • Boot yourself, Spring is coming: 1, 2. : 1, 2.
  • Spring Boot Starter — ?
  • Spring Boot Starter


:



  • : Spring Boot Auto-Configuration, spring-boot-starter Conditional Spring
  • H Baeldung: A Comparison Between Spring and Spring Boot, Create a Custom Auto-Configuration with Spring Boot, Intro to Spring Boot Starters, Spring Boot: Configuring a Main Class
  • What is Spring Boot? Autoconfigurations In-Depth
  • Spring Boot for beginners
  • Spring Boot Documentation


27. http- Spring?

Spring -:



  • Spring MVC
  • Spring WebFlux


Spring MVC DispatcherServlet, Servlet' Front Controller: Http- . DispatcherServlet WebApplicationContext. DispatcherServlet " " :



  1. HTTP- DispatcherServlet ( ) HandlerMapping, , Controller . HandlerMapping, : BeanNameUrlHandlerMapping RequestMappingHandlerMapping ( RequestMappingInfo @RequestMapping @Controller). HandlerMapping HttpServletRequest — handler- (, HandlerMethod). HandlerMapping HandlerInterceptor- . HandlerInterceptor' handler- HandlerExecutionChain, DispatcherServlet.
  2. HandlerAdapter . HttpRequestHandlerAdapter ( , HttpRequestHandler), SimpleControllerHandlerAdapter ( , Controller) RequestMappingHandlerAdapter ( @RequestMapping).
  3. applyPreHandle HandlerExecutionChain. true, HandlerInterceptor . false , HandlerInterceptor .
  4. HandlerAdapter HandlerExecutionChain handle , - .
  5. - Controller ( handle) DispatcherServlet ModelAndView. ViewResolver DispatcherServlet , View .

    REST-Controller RESTful- , ModelAndView DispatcherServlet Controller null , , ViewResolverHttpServletResponse handle. RESTful-, @ResponseBody @Controller @RestController, RESTful.
  6. HandlerExecutionChain applyPostHandle HandlerInterceptor.
  7. , HandlerExceptionResolver. ExceptionHandlerExceptionResolver ( , @ExceptionHandler), ResponseStatusExceptionResolver ( @ResponseStatus HTTP-) DefaultHandlerExceptionResolver ( Spring MVC HTTP-).
  8. Controller , View , DispatcherServlet View, HttpServletResponse. REST-Controller , HttpServletResponse.


HTTP Accept, Spring MVC HttpMessageConverter , , POJO Accept. HttpMessageConverter : Java , Java HTTP .

, Spring Boot HttpMessageConverter, , HttpMessageConverter .



, , Spring MVC javax.servlet.Filter , . Sring MVC .



Spring Security, . .



:



  • Spring MVC —
  • Spring Security
  • An Intro to the Spring DispatcherServlet Bealdung
  • HandlerAdapters in Spring MVC Bealdung
  • Quick Guide to Spring Controllers Bealdung
  • Spring RequestMapping Bealdung
  • Http Message Converters with the Spring Framework Bealdung
  • How to Define a Spring Boot Filter? Bealdung
  • Spring Professional Study Notes
  • Spring Security Architecture


:



  • Spring Web MVC
  • Spring MVC Auto-configuration Spring Boot


Spring WebFlux — -, Spring Framework 5.0. Servlet API ( Servlet 3.1+containers, Netty ( Spring Boot) Undertow), , Reactive Streams Reactor.

Spring WebFlux Spring MVC (RestController, RequestMapping ) . , HandlerFunction.



Spring WebFlux :



  • HttpHandler — HTTP- I/O, Reactive Streams back pressure Reactor Netty, Undertow ..
  • WebHandler — , API HTTP- .


HttpHandler HTTP-, WebExceptionHandler, WebFilter WebHandler. WebHttpHandlerBuilder ApplicationContext.



Spring WebFlux DispatcherHandler, WebHandler Front Controller: Http- . DispatcherHandler — Spring bean, ApplicationContextAware , . DispatcherHandler - webHandler WebHttpHandlerBuilder WebHandler.



DispatcherHandler http- " ", , . :



    @Override
    public Mono<Void> handle(ServerWebExchange exchange) {
        if (this.handlerMappings == null) {
            return createNotFoundError();
        }
        return Flux.fromIterable(this.handlerMappings)
                .concatMap(mapping -> mapping.getHandler(exchange))
                .next()
                .switchIfEmpty(createNotFoundError())
                .flatMap(handler -> invokeHandler(exchange, handler))
                .flatMap(result -> handleResult(exchange, result));
    }


  1. HandlerMapping (- , - ). (handler). HandlerMapping :

    • RequestMappingHandlerMapping -, @RequestMapping
    • RouterFunctionMapping
    • SimpleUrlHandlerMapping URL- -
  2. , ( invokeHandler) HandlerAdapter, handle . HandlerResult, DispatcherHandler. HandlerAdapter — - DispatcherHandler. HandlerAdapter :

    • RequestMappingHandlerAdapter — , @RequestMapping
    • HandlerFunctionAdapterHandlerFunctions
  3. HandlerResult ( handleResult) HandlerResultHandler. . HandlerResultHandler:

    • ResponseEntityResultHandlerResponseEntity, @Controller
    • ServerResponseResultHandlerServerResponse,
    • ResponseBodyResultHandler — , @ResponseBody, @RestController
    • ViewResolutionResultHandlerView Resolution


:



  • Spring WebFlux
  • Spring WebFlux Auto-configuration Spring Boot




在第二部分中,我们将讨论Hibernate,数据库,开发模式和实践,一个流行的库,对我们应用程序的支持和维护,还将介绍替代备忘单并进行总结。




All Articles