22.dispatchServlet如何分发任务
23. mysq | 对离散度较低的字段建立索引时会出现什么问题?
关于HashMap基本实现原理的其他常见问题关于传统多线程的问题太多了,所以我不会写任何新的东西。
你不能仅仅为了应用而学习Java。需要深入理解每个知识点背后的实现原理以及为什么要这样设计。例如,如果一个不好的HashMap包含用于排名的哈希值,那么equals0的作用是什么?这个问题可能很多人都会问,所以你应该深入研究细节并了解所有知识。
以下是该解决方案的概述以及一些增强功能。
1.这个问题是一个意识形态问题。你有没有想过这个问题?让我们重点关注两个要点。
1、Java的private修饰符并不是为了绝对的安全而设计的,而是作为对用户正常使用Java的一种约束。 2.如果你经常从外部调用一个对象,你会看到一个清晰的类结构。
2.先说底线: 基类中的静态代码块,基类中的静态成员字段(并行性优先,按照代码中出现的顺序执行,第一次加载时执行) – 派生类中的静态代码块,静态派生类中的成员字段(固定优先级,按照在代码中出现的顺序执行,首次加载时执行) – 基类中的常规代码块,基类成员字段中的常规块(固定优先级,按照出现的顺序执行) 1 – 基类的构造函数1 – 派生类的普通代码块,派生类的普通成员字段(并行的好处,(按代码中出现的顺序执行) – 派生类的构造函数
代码验证:
控制台结果输出:
3、方法区是JVM规范所要求的,持久化区是热点虚拟机对方法区的具体实现。前者是规范和存储的实现方法。 jdk1.8中进行了更改。这是一个非常基本的问题,旨在了解对方在思想层面上对JVM 的理解程度。
4、如果一个文件中有多个类,那么编译后就会有多个类文件。
5. 成员变量不需要在类加载过程中进行初始化,但局部变量在使用前必须显式分配初始值。我不能推断不能这样做,但如果不这样做,成员变量赋值和值访问的顺序可能会在方法调用之前或方法调用之后分配。这发生在运行时。编译器无法弄清楚这一点,所以最好将其留给jvm。对于局部变量,它决定了赋值和值访问的顺序。这种设计是为了尽量减少用户犯错误的可能性。
(如果局部变量可以采用默认值,那么您总是可能会无意中忘记为其赋值,这可能会导致不可预测的情况)
6.ReadWriteRock读/写锁。使用场景可以分为读/读、读/写和写/写。除了阅读和阅读共享之外,其他一切都是互斥的。互斥锁使用同步锁,你想了解对方对AQS和CAS的熟练程度,以及他们技术学习的深度。
7、Semaphore有权限运行的线程是否互斥? Semaphore、CountDownLatch、CyclicBarrier、Exchanger是Java并发编程的四个辅助类。 CountDownLatchCyclicBarrier 和CountDownLatchCyclicBarrier 之间的区别在面试中经常被问到。问这个问题没有多大意义,因为信号量有多个锁,可以同时向多个线程授予执行权限。这些具有执行权限的线程同时访问同一对象会产生线程安全问题。
8. 创建一个您认为最好的单例模式。这是我在工作中经常遇到的设计模式之一。实现单例的方式有以下几种: Hungry Man、Lazy Man、静态内部类、枚举、双重检查锁定当编写简单的Lazy Man风格时,你需要知道如何在多线程情况下保证线程安全,你可能会问:面试官可能会说双重检查锁,所以告诉他们为什么需要两个检查锁,然后问仅双重检查锁有什么问题。消息灵通的采访者会说正在添加: 个对象。我们继续讨论原子性和可见性、Java 内存模型以及使用volatile 关键字的类加载过程。
事实上,枚举、静态内部类和双重检查锁都是可能的。我只是想知道我对不同的单例方法了解多少。呢?
9、B-trees和B+-trees 这题不仅问了mysq索引的实现原理,还问了数据结构的基础知识。由于它会导致退化,我们提出了平衡二叉树。以及如何使每一层放置更多的节点并降低遍历高度也会使m-fork搜索树降级,从而产生平衡的m-fork树。这时候每个节点都有key和value,如何在每个节点上放一个key值来降低遍历高度(磁盘访问次数)呢?每个节点中仅放置键值,叶节点中放置值。该值增加并指向相邻节点指针。这就是优化后的B+树。然后我们来谈谈数据库
如果索引失败,为什么对离散度低的字段(比如性别)建立连接索引会导致查询数据变慢?请注意?
10.生产者-消费者模式。同步锁定LinkedList。生产者在生产后插入它,除非队列已满,消费者检索它,除非队列为空。两者通过wait (和notification0 )进行协调。创建完成后,我们将讨论如何提高效率。最后,我们将讨论设计和使用消息队列的基本概念。
11.制造僵局。让我们记住经常提到的死锁的四个条件。想法是为: 定义两个ArrayList 并锁定它们。B,线程1、2、1持有锁A并请求锁B,2持有锁B并请求锁A,同时等待对方释放锁,没有人放弃自己已经获取的锁。
12.如何找到100% CPU?这个问题网上搜一下就可以了。说实话,我很遗憾提出这个问题。
13. Stringa=“ab”; Stringb=“a”+“b”;a、b相等(你要写代码来检查。然后你就可以看到有人写错了答案。)。传统的问题是将一个新的对象分配给一个变量,并询问公式的第: 行将创建多少个对象,但这样的问题太笼统了。
14. inta=1;是原子操作。
15. for 循环直接删除ArrayList 中的特定元素是不正确的。如果常规for 循环想要删除集合中的连续元素,则可能会发生不同的for 循环。请仅在第一次时将其删除。
错误原因: 打开JDK的ArrayList源码,看看ArrayList的Remove方法是如何实现的(ArrayList的Remove方法有两个方法名称相同,但输入参数不同),注意正常情况下,程序的执行路径会到else 路径,最后调用System.arraycopy 方法,该方法执行faseRemove 方法。结果,数组元素被移动。删除元素。这是编写普通for 循环的错误方法,但是当它循环第一个字符串b 时,满足删除条件,因此从数组中删除该元素,并移动下一个元素(即第二个字符串b)到数组中就完成了。这样一来,下一次循环遍历时就不会扫描到下一个字符串b,因此无法将其删除。通过逆序删除就可以避免这种情况。
解决方案: 使用迭代器。
延伸这个问题,下面的代码可能会出现什么问题?
16.第一步:线程池判断核心线程池中的所有线程是否都在执行任务。如果没有,则创建一个新的工作线程来执行该任务。如果核心线程池中的所有线程都在执行任务,则执行第二步。
第二步,线程池判断工作队列是否已满。如果工作队列未满,则新提交的任务会放入此工作队列中等待。如果工作队列已满,请继续步骤3。
第三步是:线程池,判断线程池中的所有线程是否都可以运行。否则,将创建一个新的工作线程来执行该任务。如果已满,则传递给饱和策略来处理此任务。
17.抽象队列同步器AQS(AbstractQueuedSychronizer)。如果说java.util.concurrent是基于CAS的话,那么AQS就是ReentrantLock、CountDownLatch、Semaphore等所有Java并发包的核心。 AQS实际上以双向队列的形式连接所有条目,例如ReentrantLock。所有等待线程都放置在一个条目中,如果前一个线程使用ReentrantLock,则实际的第二个线程会附加到双向队列中。双向队列条目开始执行。虽然AQS定义了双向队列上的所有操作,但它只暴露了tryLock和tryRelease方法,开发者可以根据自己的实现重写tryLock和tryRelease方法,以实现自己的并发能力。
给定三个操作数,比较和替换CAS(比较和交换): 内存值V、旧的期望值A 和要更改的值B。当且仅当期望值A 和内存值V 相同时,该值才更改为B 并返回true。否则,不执行任何操作并返回false。整个比较和替换操作是一个原子操作。 CAS – 必须与易失性变量一起使用,以确保每次检索的变量是主内存中最新的对应值。否则,只要CAS,旧的期望值A就永远是不可变的值A。如果一个操作失败,下一个操作将永远不会成功。虽然CAS相对高效地解决了原子操作的问题,但仍然存在三个主要问题。
周期长,费用大。只能保证对共享变量的原子操作。
ABA问题。
18.同步(this)原理:包含两条指令:monitorenter、monitorexit。从同步方法的反编译结果来看,该方法的同步并不是通过monitorenter和monitorexit指令实现的。普通方法在常量池中有一个额外的“ACC_SYNCHRONIZED”标识符。
JVM根据这个标识符来实现方法同步。 调用方法时,调用指令会检查该方法的ACC_SYNCHRONIZED 访问标志是否已设置,如果已设置,则执行线程首先获取监视器。成功检索方法体后执行。方法执行后,监视器被释放。当该方法运行时,其他线程无法再次获取相同的监视器对象。
本题询问:个Java对象的头信息、偏向锁、轻量级锁、重量级锁以及它们的转换。
19. 理解volatile 关键字作用的先决条件是理解Java 内存模型。 volatile 关键字的作用主要围绕两个属性:可见性和原子性。易失性关键字。这确保了跨多个线程的可见性。这意味着每次读取volatile 变量时,它都必须具有最新的数据。
代码的基本执行并不像我们看到的高级语言那么简单- Java程序执行是Java代码- 字节码- 根据字节码执行相应的C/C++代码- C/C++ 在实践中, JVM 可能会重新排序指令以获得更好的代码性能,这可能会在多线程时导致意外问题。使用volatile 改变了禁止语义的顺序,这当然也在一定程度上降低了代码执行效率。
从实践的角度来看,Volatile的重要作用是与CAS结合保证原子性。有关详细信息,请参阅java.util.concurrent.atomic 包中的类,例如AtomiclInteger。
20、AOP和I0C是Spring的本质,代码的水平扩展,代理模式有静态代理和动态代理。程序扩展后的代码在运行时被合并到原始代码中。 I0C是控制反转,它将对象的控制权转移给Spring框架,允许用户直接使用对象而无需创建对象。 AOP和IOC最有价值的是他们的想法。
21.什么是循环依赖?在Spring中有几种创建循环依赖的方法。接下来想问一下: bean的生命周期。
22. 从上一张照片和这张照片中了解
具体流程:
用户发出请求 DispatcherServlet。前端控制器收到请求后,不会自行处理,而是将处理委托给其他解析器。它充当全球过程控制的统一接入点。
.DispatcherServlet HandlerMapping,HandlerMapping将请求映射到HandlerExecutionChain对象,该对象包含一个Handler处理器和多个HandlerInterceptor拦截器。
.DispatcherServlet HandlerAdapter,HandlerAdapter将处理器包装为支持多种类型处理器的适配器。
.HandlerAdapter 调用处理器功能处理方法HandlerAdapter根据适配结果调用实际处理器功能处理方法,完成功能处理,并返回一个ModelAndView对象(包含模型数据、逻辑视图名称)。
.ModelAndView 中的逻辑视图名称 ViewResolver,ViewResoler 将逻辑视图名称解析为特定视图。
.View 渲染,View根据接收到的Model数据进行渲染。这里的Model实际上是一个Map数据结构。
知其然不知其所以然,大厂常问面试技术如何复习?
1. 面试常见问题及解答
面试前做好充足的工作,以增加成功的机会。互联网上350 个常见问题和解答的列表,可帮助您获得工作机会。
2.多线程、高并发、缓存实用项目入门PDF书
3.整理文章中提到的面试问题的答案
4.Java核心知识面试指南
JVM、JAVA 集合、JAVA 多线程并发、JAVA 基础知识、Spring 原理、微服务、Netty 和RPC、网络、日志记录、Zookeeper、Kafka、RabbitMQ、Hbase、MongoDB、Cassandra、设计模式、负载均衡、数据库、涵盖完整性A.线性算法、JAVA算法、数据结构、算法、分布式缓存、Hadoop、Spark、Storm等技术点很多,讲解的很深入。
服务、Netty 和RPC、网络、日志记录、Zookeeper、Kafka、RabbitMQ、Hbase、MongoDB、Cassandra、设计模式、负载均衡、数据库、一致性算法、JAVA 算法、数据结构、算法、分布式缓存、Hadoop、Spark、Storm技术点很多,讲解也很透彻**
[正在传输外部链接图像.(img-wlVPUXph-1720080018509)]
[正在传输外部链接图像.(img-OIH5nw6f-1720080018509)]
[正在传输外部链接图像.(img-XoqGcTmA-1720080018510)]
#2021一线互联网以上拼多多、饿了么、蚂蚁金服、百度等一些Java面试题相关内容来源,仅供参考。相关信息请参见官方公告。
原创文章,作者:CSDN,如若转载,请注明出处:https://www.sudun.com/ask/92888.html