首页 文章 精选 留言 我的

精选列表

搜索[面试],共4913篇文章
优秀的个人博客,低调大师

Spring 面试问题 TOP 50

Spring Framework 现在几乎已成为 Java Web 开发的标配框架。那么,作为 Java 程序员,你对 Spring 的主要技术点又掌握了多少呢?不妨用本文的问题来检测一下。 本文内容主要翻译自Top 50 Spring Interview Questions You Must Prepare In 2018 1. 一般问题 1.1. 不同版本的 Spring Framework 有哪些主要功能? 1.2. 什么是 Spring Framework? Spring 是一个开源应用框架,旨在降低应用程序开发的复杂度。 它是轻量级、松散耦合的。 它具有分层体系结构,允许用户选择组件,同时还为 J2EE 应用程序开发提供了一个有凝聚力的框架。 它可以集成其他框架,如 Structs、Hibernate、EJB 等,所以又称为框架的框架。 1.3. 列举 Spring Framework 的优点。 由于 Spring Frameworks 的分层架构,用户可以自由选择自己需要的组件。 Spring Framework 支持 POJO(Plain Old Java Object) 编程,从而具备持续集成和可测试性。 由于依赖注入和控制反转,JDBC 得以简化。 它是开源免费的。 1.4. Spring Framework 有哪些不同的功能? 轻量级- Spring 在代码量和透明度方面都很轻便。 IOC- 控制反转 AOP- 面向切面编程可以将应用业务逻辑和系统服务分离,以实现高内聚。 容器- Spring 负责创建和管理对象(Bean)的生命周期和配置。 MVC- 对 web 应用提供了高度可配置性,其他框架的集成也十分方便。 事务管理- 提供了用于事务管理的通用抽象层。Spring 的事务支持也可用于容器较少的环境。 JDBC 异常- Spring 的 JDBC 抽象层提供了一个异常层次结构,简化了错误处理策略。 1.5. Spring Framework 中有多少个模块,它们分别是什么? Spring 核心容器– 该层基本上是 Spring Framework 的核心。它包含以下模块: Spring Core Spring Bean SpEL (Spring Expression Language) Spring Context 数据访问/集成– 该层提供与数据库交互的支持。它包含以下模块: JDBC (Java DataBase Connectivity) ORM (Object Relational Mapping) OXM (Object XML Mappers) JMS (Java Messaging Service) Transaction Web– 该层提供了创建 Web 应用程序的支持。它包含以下模块: Web Web – Servlet Web – Socket Web – Portlet AOP– 该层支持面向切面编程 Instrumentation– 该层为类检测和类加载器实现提供支持。 Test– 该层为使用 JUnit 和 TestNG 进行测试提供支持。 几个杂项模块: Messaging – 该模块为 STOMP 提供支持。它还支持注解编程模型,该模型用于从 WebSocket 客户端路由和处理 STOMP 消息。 Aspects – 该模块为与 AspectJ 的集成提供支持。 1.6. 什么是 Spring 配置文件? Spring 配置文件是 XML 文件。该文件主要包含类信息。它描述了这些类是如何配置以及相互引入的。但是,XML 配置文件冗长且更加干净。如果没有正确规划和编写,那么在大项目中管理变得非常困难。 1.7. Spring 应用程序有哪些不同组件? Spring 应用一般有以下组件: 接口- 定义功能。 Bean 类- 它包含属性,setter 和 getter 方法,函数等。 Spring 面向切面编程(AOP)- 提供面向切面编程的功能。 Bean 配置文件- 包含类的信息以及如何配置它们。 用户程序- 它使用接口。 1.8. 使用 Spring 有哪些方式? 使用 Spring 有以下方式: 作为一个成熟的 Spring Web 应用程序。 作为第三方 Web 框架,使用 Spring Frameworks 中间层。 用于远程使用。 作为企业级 Java Bean,它可以包装现有的 POJO(Plain Old Java Objects)。 2. 依赖注入(Ioc) 2.1. 什么是 Spring IOC 容器? Spring 框架的核心是 Spring 容器。容器创建对象,将它们装配在一起,配置它们并管理它们的完整生命周期。Spring 容器使用依赖注入来管理组成应用程序的组件。容器通过读取提供的配置元数据来接收对象进行实例化,配置和组装的指令。该元数据可以通过 XML,Java 注解或 Java 代码提供。 2.2. 什么是依赖注入? 在依赖注入中,您不必创建对象,但必须描述如何创建它们。您不是直接在代码中将组件和服务连接在一起,而是描述配置文件中哪些组件需要哪些服务。由 IoC 容器将它们装配在一起。 2.3. 可以通过多少种方式完成依赖注入? 通常,依赖注入可以通过三种方式完成,即: 构造函数注入 setter 注入 接口注入 在 Spring Framework 中,仅使用构造函数和 setter 注入。 2.4. 区分构造函数注入和 setter 注入。 2.5. spring 中有多少种 IOC 容器? BeanFactory - BeanFactory 就像一个包含 bean 集合的工厂类。它会在客户端要求时实例化 bean。 ApplicationContext - ApplicationContext 接口扩展了 BeanFactory 接口。它在 BeanFactory 基础上提供了一些额外的功能。 2.6. 区分 BeanFactory 和 ApplicationContext。 2.7. 列举 IoC 的一些好处。 IoC 的一些好处是: 它将最小化应用程序中的代码量。 它将使您的应用程序易于测试,因为它不需要单元测试用例中的任何单例或 JNDI 查找机制。 它以最小的影响和最少的侵入机制促进松耦合。 它支持即时的实例化和延迟加载服务。 2.8. Spring IoC 的实现机制。 Spring 中的 IoC 的实现原理就是工厂模式加反射机制。 示例: 3. Beans 3.1. 什么是 spring bean? 它们是构成用户应用程序主干的对象。 Bean 由 Spring IoC 容器管理。 它们由 Spring IoC 容器实例化,配置,装配和管理。 Bean 是基于用户提供给容器的配置元数据创建。 3.2. spring 提供了哪些配置方式? 基于 xml 配置 bean 所需的依赖项和服务在 XML 格式的配置文件中指定。这些配置文件通常包含许多 bean 定义和特定于应用程序的配置选项。它们通常以 bean 标签开头。例如: 基于注解配置 您可以通过在相关的类,方法或字段声明上使用注解,将 bean 配置为组件类本身,而不是使用 XML 来描述 bean 装配。默认情况下,Spring 容器中未打开注解装配。因此,您需要在使用它之前在 Spring 配置文件中启用它。例如: 基于 Java API 配置 Spring 的 Java 配置是通过使用 @Bean 和 @Configuration 来实现。 1.@Bean 注解扮演与<bean />元素相同的角色。 2.@Configuration 类允许通过简单地调用同一个类中的其他 @Bean 方法来定义 bean 间依赖关系。 例如: 3.3. spring 支持集中 bean scope? Spring bean 支持 5 种 scope: Singleton- 每个 Spring IoC 容器仅有一个单实例。 Prototype- 每次请求都会产生一个新的实例。 Request- 每一次 HTTP 请求都会产生一个新的实例,并且该 bean 仅在当前 HTTP 请求内有效。 Session- 每一次 HTTP 请求都会产生一个新的 bean,同时该 bean 仅在当前 HTTP session 内有效。 Global-session- 类似于标准的 HTTP Session 作用域,不过它仅仅在基于 portlet 的 web 应用中才有意义。Portlet 规范定义了全局 Session 的概念,它被所有构成某个 portlet web 应用的各种不同的 portlet 所共享。在 global session 作用域中定义的 bean 被限定于全局 portlet Session 的生命周期范围内。如果你在 web 中使用 global session 作用域来标识 bean,那么 web 会自动当成 session 类型来使用。 仅当用户使用支持 Web 的 ApplicationContext 时,最后三个才可用。 3.4. spring bean 容器的生命周期是什么样的? spring bean 容器的生命周期流程如下: Spring 容器根据配置中的 bean 定义中实例化 bean。 Spring 使用依赖注入填充所有属性,如 bean 中所定义的配置。 如果 bean 实现 BeanNameAware 接口,则工厂通过传递 bean 的 ID 来调用 setBeanName()。 如果 bean 实现 BeanFactoryAware 接口,工厂通过传递自身的实例来调用 setBeanFactory()。 如果存在与 bean 关联的任何 BeanPostProcessors,则调用 preProcessBeforeInitialization() 方法。 如果为 bean 指定了 init 方法(<bean>的 init-method 属性),那么将调用它。 最后,如果存在与 bean 关联的任何 BeanPostProcessors,则将调用 postProcessAfterInitialization() 方法。 如果 bean 实现 DisposableBean 接口,当 spring 容器关闭时,会调用 destory()。 如果为 bean 指定了 destroy 方法(<bean>的 destroy-method 属性),那么将调用它。 3.5. 什么是 spring 的内部 bean? 只有将 bean 用作另一个 bean 的属性时,才能将 bean 声明为内部 bean。为了定义 bean,Spring 的基于 XML 的配置元数据在<property>或<constructor-arg>中提供了<bean>元素的使用。内部 bean 总是匿名的,它们总是作为原型。 例如,假设我们有一个 Student 类,其中引用了 Person 类。这里我们将只创建一个 Person 类实例并在 Student 中使用它。 Student.java bean.xml 3.6. 什么是 spring 装配 当 bean 在 Spring 容器中组合在一起时,它被称为装配或 bean 装配。 Spring 容器需要知道需要什么 bean 以及容器应该如何使用依赖注入来将 bean 绑定在一起,同时装配 bean。 3.7. 自动装配有哪些方式? Spring 容器能够自动装配 bean。也就是说,可以通过检查 BeanFactory 的内容让 Spring 自动解析 bean 的协作者。 自动装配的不同模式: no- 这是默认设置,表示没有自动装配。应使用显式 bean 引用进行装配。 byName- 它根据 bean 的名称注入对象依赖项。它匹配并装配其属性与 XML 文件中由相同名称定义的 bean。 byType- 它根据类型注入对象依赖项。如果属性的类型与 XML 文件中的一个 bean 名称匹配,则匹配并装配属性。 构造函数- 它通过调用类的构造函数来注入依赖项。它有大量的参数。 autodetect- 首先容器尝试通过构造函数使用 autowire 装配,如果不能,则尝试通过 byType 自动装配。 3.8. 自动装配有什么局限? 覆盖的可能性 - 您始终可以使用<constructor-arg>和<property>设置指定依赖项,这将覆盖自动装配。 基本元数据类型 - 简单属性(如原数据类型,字符串和类)无法自动装配。 令人困惑的性质 - 总是喜欢使用明确的装配,因为自动装配不太精确。 4. 注解 4.1. 什么是基于注解的容器配置 不使用 XML 来描述 bean 装配,开发人员通过在相关的类,方法或字段声明上使用注解将配置移动到组件类本身。它可以作为 XML 设置的替代方案。例如: Spring 的 Java 配置是通过使用 @Bean 和 @Configuration 来实现。 @Bean 注解扮演与元素相同的角色。 @Configuration 类允许通过简单地调用同一个类中的其他 @Bean 方法来定义 bean 间依赖关系。 例如: 4.2. 如何在 spring 中启动注解装配? 默认情况下,Spring 容器中未打开注解装配。因此,要使用基于注解装配,我们必须通过配置<context:annotation-config />元素在 Spring 配置文件中启用它。 4.3. @Component, @Controller, @Repository, @Service 有何区别? @Component:这将 java 类标记为 bean。它是任何 Spring 管理组件的通用构造型。spring 的组件扫描机制现在可以将其拾取并将其拉入应用程序环境中。 @Controller:这将一个类标记为 Spring Web MVC 控制器。标有它的 Bean 会自动导入到 IoC 容器中。 @Service:此注解是组件注解的特化。它不会对 @Component 注解提供任何其他行为。您可以在服务层类中使用 @Service 而不是 @Component,因为它以更好的方式指定了意图。 @Repository:这个注解是具有类似用途和功能的 @Component 注解的特化。它为 DAO 提供了额外的好处。它将 DAO 导入 IoC 容器,并使未经检查的异常有资格转换为 Spring DataAccessException。 4.4. @Required 注解有什么用? @Required 应用于 bean 属性 setter 方法。此注解仅指示必须在配置时使用 bean 定义中的显式属性值或使用自动装配填充受影响的 bean 属性。如果尚未填充受影响的 bean 属性,则容器将抛出 BeanInitializationException。 示例: 4.5. @Autowired 注解有什么用? @Autowired 可以更准确地控制应该在何处以及如何进行自动装配。此注解用于在 setter 方法,构造函数,具有任意名称或多个参数的属性或方法上自动装配 bean。默认情况下,它是类型驱动的注入。 4.6. @Qualifier 注解有什么用? 当您创建多个相同类型的 bean 并希望仅使用属性装配其中一个 bean 时,您可以使用@Qualifier 注解和 @Autowired 通过指定应该装配哪个确切的 bean 来消除歧义。 例如,这里我们分别有两个类,Employee 和 EmpAccount。在 EmpAccount 中,使用@Qualifier 指定了必须装配 id 为 emp1 的 bean。 Employee.java EmpAccount.java 4.7. @RequestMapping 注解有什么用? @RequestMapping 注解用于将特定 HTTP 请求方法映射到将处理相应请求的控制器中的特定类/方法。此注释可应用于两个级别: 类级别:映射请求的 URL 方法级别:映射 URL 以及 HTTP 请求方法 5. 数据访问 5.1. spring DAO 有什么用? Spring DAO 使得 JDBC,Hibernate 或 JDO 这样的数据访问技术更容易以一种统一的方式工作。这使得用户容易在持久性技术之间切换。它还允许您在编写代码时,无需考虑捕获每种技术不同的异常。 5.2. 列举 Spring DAO 抛出的异常。 5.3. spring JDBC API 中存在哪些类? JdbcTemplate SimpleJdbcTemplate NamedParameterJdbcTemplate SimpleJdbcInsert SimpleJdbcCall 5.4. 使用 Spring 访问 Hibernate 的方法有哪些? 我们可以通过两种方式使用 Spring 访问 Hibernate: 使用 Hibernate 模板和回调进行控制反转 扩展 HibernateDAOSupport 并应用 AOP 拦截器节点 5.5. 列举 spring 支持的事务管理类型 Spring 支持两种类型的事务管理: 程序化事务管理:在此过程中,在编程的帮助下管理事务。它为您提供极大的灵活性,但维护起来非常困难。 声明式事务管理:在此,事务管理与业务代码分离。仅使用注解或基于 XML 的配置来管理事务。 5.6. spring 支持哪些 ORM 框架 Hibernate iBatis JPA JDO OJB 6. AOP 6.1. 什么是 AOP? AOP(Aspect-Oriented Programming), 即面向切面编程, 它与 OOP( Object-Oriented Programming, 面向对象编程) 相辅相成, 提供了与 OOP 不同的抽象软件结构的视角. 在 OOP 中, 我们以类(class)作为我们的基本单元, 而 AOP 中的基本单元是Aspect(切面) 6.2. 什么是 Aspect? aspect由pointcount和advice组成, 它既包含了横切逻辑的定义, 也包括了连接点的定义. Spring AOP 就是负责实施切面的框架, 它将切面所定义的横切逻辑编织到切面所指定的连接点中. AOP 的工作重心在于如何将增强编织目标对象的连接点上, 这里包含两个工作: 如何通过 pointcut 和 advice 定位到特定的 joinpoint 上 如何在 advice 中编写切面代码. 可以简单地认为, 使用 @Aspect 注解的类就是切面. 6.3. 什么是切点(JoinPoint) 程序运行中的一些时间点, 例如一个方法的执行, 或者是一个异常的处理. 在 Spring AOP 中, join point 总是方法的执行点。 6.4. 什么是通知(Advice)? 特定 JoinPoint 处的 Aspect 所采取的动作称为 Advice。Spring AOP 使用一个 Advice 作为拦截器,在 JoinPoint “周围”维护一系列的拦截器。 6.5. 有哪些类型的通知(Advice)? Before- 这些类型的 Advice 在 joinpoint 方法之前执行,并使用 @Before 注解标记进行配置。 After Returning- 这些类型的 Advice 在连接点方法正常执行后执行,并使用@AfterReturning 注解标记进行配置。 After Throwing- 这些类型的 Advice 仅在 joinpoint 方法通过抛出异常退出并使用 @AfterThrowing 注解标记配置时执行。 After (finally)- 这些类型的 Advice 在连接点方法之后执行,无论方法退出是正常还是异常返回,并使用 @After 注解标记进行配置。 Around- 这些类型的 Advice 在连接点之前和之后执行,并使用 @Around 注解标记进行配置。 6.6. 指出在 spring aop 中 concern 和 cross-cutting concern 的不同之处。 concern 是我们想要在应用程序的特定模块中定义的行为。它可以定义为我们想要实现的功能。 cross-cutting concern 是一个适用于整个应用的行为,这会影响整个应用程序。例如,日志记录,安全性和数据传输是应用程序几乎每个模块都需要关注的问题,因此它们是跨领域的问题。 6.7. AOP 有哪些实现方式? 实现 AOP 的技术,主要分为两大类: 静态代理 - 指使用 AOP 框架提供的命令进行编译,从而在编译阶段就可生成 AOP 代理类,因此也称为编译时增强; 编译时编织(特殊编译器实现) 类加载时编织(特殊的类加载器实现)。 动态代理 - 在运行时在内存中“临时”生成 AOP 动态代理类,因此也被称为运行时增强。 JDK 动态代理 CGLIB 6.8. Spring AOP and AspectJ AOP 有什么区别? Spring AOP 基于动态代理方式实现;AspectJ 基于静态代理方式实现。 Spring AOP 仅支持方法级别的 PointCut;提供了完全的 AOP 支持,它还支持属性级别的 PointCut。 6.9. 如何理解 Spring 中的代理? 将 Advice 应用于目标对象后创建的对象称为代理。在客户端对象的情况下,目标对象和代理对象是相同的。 Advice + TargetObject=Proxy 6.10. 什么是编织(Weaving)? 为了创建一个 advice 对象而链接一个 aspect 和其它应用类型或对象,称为编织(Weaving)。在 Spring AOP 中,编织在运行时执行。请参考下图: 7. MVC 7.1. Spring MVC 框架有什么用? Spring Web MVC 框架提供模型-视图-控制器架构和随时可用的组件,用于开发灵活且松散耦合的 Web 应用程序。 MVC 模式有助于分离应用程序的不同方面,如输入逻辑,业务逻辑和 UI 逻辑,同时在所有这些元素之间提供松散耦合。 7.2. 描述一下 DispatcherServlet 的工作流程 DispatcherServlet 的工作流程可以用一幅图来说明: 向服务器发送 HTTP 请求,请求被前端控制器DispatcherServlet捕获。 DispatcherServlet根据-servlet.xml中的配置对请求的 URL 进行解析,得到请求资源标识符(URI)。然后根据该 URI,调用HandlerMapping获得该 Handler 配置的所有相关的对象(包括 Handler 对象以及 Handler 对象对应的拦截器),最后以HandlerExecutionChain对象的形式返回。 DispatcherServlet根据获得的Handler,选择一个合适的HandlerAdapter。(附注:如果成功获得HandlerAdapter后,此时将开始执行拦截器的 preHandler(...)方法)。 提取Request中的模型数据,填充Handler入参,开始执行Handler(Controller)。 在填充Handler的入参过程中,根据你的配置,Spring 将帮你做一些额外的工作: HttpMessageConveter: 将请求消息(如 Json、xml 等数据)转换成一个对象,将对象转换为指定的响应信息。 数据转换:对请求消息进行数据转换。如String转换成Integer、Double等。 数据根式化:对请求消息进行数据格式化。 如将字符串转换成格式化数字或格式化日期等。 数据验证: 验证数据的有效性(长度、格式等),验证结果存储到BindingResult或Error中。 Handler(Controller)执行完成后,向DispatcherServlet返回一个ModelAndView对象; 根据返回的ModelAndView,选择一个适合的ViewResolver(必须是已经注册到 Spring 容器中的ViewResolver)返回给DispatcherServlet。 ViewResolver结合Model和View,来渲染视图。 视图负责将渲染结果返回给客户端。 7.3. 介绍一下 WebApplicationContext WebApplicationContext 是 ApplicationContext 的扩展。它具有 Web 应用程序所需的一些额外功能。它与普通的 ApplicationContext 在解析主题和决定与哪个 servlet 关联的能力方面有所不同。 欢迎工作一到五年的Java工程师朋友们加入Java填坑之路:860113481 群内提供免费的Java架构学习资料(里面有高可用、高并发、高性能及分布式、Jvm性能调优、Spring源码,MyBatis,Netty,Redis,Kafka,Mysql,Zookeeper,Tomcat,Docker,Dubbo,Nginx等多个知识点的架构资料)合理利用自己每一分每一秒的时间来学习提升自己,不要再用"没有时间“来掩饰自己思想上的懒惰!趁年轻,使劲拼,给未来的自己一个交代!

优秀的个人博客,低调大师

面试必问之JVM原理

1:什么是JVM JVM是Java Virtual Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。Java虚拟机包括一套字节码指令集、一组寄存器、一个栈、一个垃圾回收堆和一个存储方法域。 JVM屏蔽了与具体操作系统平台相关的信息,使Java程序只需生成在Java虚拟机上运行的目标代码(字节码),就可以在多种平台上不加修改地运行。JVM在执行字节码时,实际上最终还是把字节码解释成具体平台上的机器指令执行。 2:JRE/JDK/JVM是什么关系 JRE(JavaRuntimeEnvironment,Java运行环境),也就是Java平台。所有的Java 程序都要在JRE下才能运行。普通用户只需要运行已开发好的java程序,安装JRE即可。 JDK(Java Development Kit)是程序开发者用来来编译、调试java程序用的开发工具包。JDK的工具也是Java程序,也需要JRE才能运行。为了保持JDK的独立性和完整性,在JDK的安装过程中,JRE也是 安装的一部分。所以,在JDK的安装目录下有一个名为jre的目录,用于存放JRE文件。 JVM(JavaVirtualMachine,Java虚拟机)是JRE的一部分。它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。JVM有自己完善的硬件架构,如处理器、堆栈、寄存器等,还具有相应的指令系统。Java语言最重要的特点就是跨平台运行。使用JVM就是为了支持与操作系统无关,实现跨平台。 3:JVM原理 JVM是java的核心和基础,在java编译器和os平台之间的虚拟处理器。它是一种利用软件方法实现的抽象的计算机基于下层的操作系统和硬件平台,可以在上面执行java的字节码程序。 java编译器只要面向JVM,生成JVM能理解的代码或字节码文件。Java源文件经编译成字节码程序,通过JVM将每一条指令翻译成不同平台机器码,通过特定平台运行。 4:JVM的体系结构 类装载器(ClassLoader)(用来装载.class文件) 执行引擎(执行字节码,或者执行本地方法) 运行时数据区(方法区、堆、java栈、PC寄存器、本地方法栈) 5:JVM运行时数据区 第一块:PC寄存器 PC寄存器是用于存储每个线程下一步将执行的JVM指令,如该方法为native的,则PC寄存器中不存储任何信息。 第二块:JVM栈 JVM栈是线程私有的,每个线程创建的同时都会创建JVM栈,JVM栈中存放的为当前线程中局部基本类型的变量(java中定义的八种基本类型:boolean、char、byte、short、int、long、float、double)、部分的返回结果以及Stack Frame,非基本类型的对象在JVM栈上仅存放一个指向堆上的地址。 第三块:堆(Heap) 它是JVM用来存储对象实例以及数组值的区域,可以认为Java中所有通过new创建的对象的内存都在此分配,Heap中的对象的内存需要等待GC进行回收。 (1) 堆是JVM中所有线程共享的,因此在其上进行对象内存的分配均需要进行加锁,这也导致了new对象的开销是比较大的 (2) Sun Hotspot JVM为了提升对象内存分配的效率,对于所创建的线程都会分配一块独立的空间TLAB(Thread Local Allocation Buffer),其大小由JVM根据运行的情况计算而得,在TLAB上分配对象时不需要加锁,因此JVM在给线程的对象分配内存时会尽量的在TLAB上分配,在这种情况下JVM中分配对象内存的性能和C基本是一样高效的,但如果对象过大的话则仍然是直接使用堆空间分配 (3) TLAB仅作用于新生代的Eden Space,因此在编写Java程序时,通常多个小的对象比大的对象分配起来更加高效。 (4) 所有新创建的Object 都将会存储在新生代Yong Generation中。如果Young Generation的数据在一次或多次GC后存活下来,那么将被转移到OldGeneration。新的Object总是创建在Eden Space。 第四块:方法区域(Method Area) (1)在Sun JDK中这块区域对应的为PermanetGeneration,又称为持久代。 (2)方法区域存放了所加载的类的信息(名称、修饰符等)、类中的静态变量、类中定义为final类型的常量、类中的Field信息、类中的方法信息,当开发人员在程序中通过Class对象中的getName、isInterface等方法来获取信息时,这些数据都来源于方法区域,同时方法区域也是全局共享的,在一定的条件下它也会被GC,当方法区域需要使用的内存超过其允许的大小时,会抛出OutOfMemory的错误信息。 第五块:运行时常量池(Runtime Constant Pool) 存放的为类中的固定的常量信息、方法和Field的引用信息等,其空间从方法区域中分配。 第六块:本地方法堆栈(Native Method Stacks) JVM采用本地方法堆栈来支持native方法的执行,此区域用于存储每个native方法调用的状态。 6:对象“已死”的判定算法 由于程序计数器、Java虚拟机栈、本地方法栈都是线程独享,其占用的内存也是随线程生而生、随线程结束而回收。而Java堆和方法区则不同,线程共享,是GC的所关注的部分。 在堆中几乎存在着所有对象,GC之前需要考虑哪些对象还活着不能回收,哪些对象已经死去可以回收。 有两种算法可以判定对象是否存活: 1.)引用计数算法:给对象中添加一个引用计数器,每当一个地方应用了对象,计数器加1;当引用失效,计数器减1;当计数器为0表示该对象已死、可回收。但是它很难解决两个对象之间相互循环引用的情况。 2.)可达性分析算法:通过一系列称为“GC Roots”的对象作为起点,从这些节点开始向下搜索,搜索所走过的路径称为引用链,当一个对象到GC Roots没有任何引用链相连(即对象到GC Roots不可达),则证明此对象已死、可回收。Java中可以作为GC Roots的对象包括:虚拟机栈中引用的对象、本地方法栈中Native方法引用的对象、方法区静态属性引用的对象、方法区常量引用的对象。 在主流的商用程序语言(如我们的Java)的主流实现中,都是通过可达性分析算法来判定对象是否存活的。 7:JVM垃圾回收 GC (Garbage Collection)的基本原理:将内存中不再被使用的对象进行回收,GC中用于回收的方法称为收集器,由于GC需要消耗一些资源和时间,Java在对对象的生命周期特征进行分析后,按照新生代、旧生代的方式来对对象进行收集,以尽可能的缩短GC对应用造成的暂停 (1)对新生代的对象的收集称为minor GC; (2)对旧生代的对象的收集称为Full GC; (3)程序中主动调用System.gc()强制执行的GC为Full GC。 不同的对象引用类型, GC会采用不同的方法进行回收,JVM对象的引用分为了四种类型: (1)强引用:默认情况下,对象采用的均为强引用(这个对象的实例没有其他对象引用,GC时才会被回收) (2)软引用:软引用是Java中提供的一种比较适合于缓存场景的应用(只有在内存不够用的情况下才会被GC) (3)弱引用:在GC时一定会被GC回收 (4)虚引用:由于虚引用只是用来得知对象是否被GC 8:垃圾收集算法 1、标记-清除算法 最基础的算法,分标记和清除两个阶段:首先标记处所需要回收的对象,在标记完成后统一回收所有被标记的对象。 它有两点不足:一个效率问题,标记和清除过程都效率不高;一个是空间问题,标记清除之后会产生大量不连续的内存碎片(类似于我们电脑的磁盘碎片),空间碎片太多导致需要分配大对象时无法找到足够的连续内存而不得不提前触发另一次垃圾回收动作。 2、复制算法 为了解决效率问题,出现了“复制”算法,他将可用内存按容量划分为大小相等的两块,每次只需要使用其中一块。当一块内存用完了,将还存活的对象复制到另一块上面,然后再把刚刚用完的内存空间一次清理掉。这样就解决了内存碎片问题,但是代价就是可以用内容就缩小为原来的一半。 3、标记-整理算法 复制算法在对象存活率较高时就会进行频繁的复制操作,效率将降低。因此又有了标记-整理算法,标记过程同标记-清除算法,但是在后续步骤不是直接对对象进行清理,而是让所有存活的对象都向一侧移动,然后直接清理掉端边界以外的内存。 4、分代收集算法 当前商业虚拟机的GC都是采用分代收集算法,这种算法并没有什么新的思想,而是根据对象存活周期的不同将堆分为:新生代和老年代,方法区称为永久代(在新的版本中已经将永久代废弃,引入了元空间的概念,永久代使用的是JVM内存而元空间直接使用物理内存)。 这样就可以根据各个年代的特点采用不同的收集算法。 新生代中的对象“朝生夕死”,每次GC时都会有大量对象死去,少量存活,使用复制算法。新生代又分为Eden区和Survivor区(Survivor from、Survivor to),大小比例默认为8:1:1。 老年代中的对象因为对象存活率高、没有额外空间进行分配担保,就使用标记-清除或标记-整理算法。 新产生的对象优先进去Eden区,当Eden区满了之后再使用Survivor from,当Survivor from 也满了之后就进行Minor GC(新生代GC),将Eden和Survivor from中存活的对象copy进入Survivor to,然后清空Eden和Survivor from,这个时候原来的Survivor from成了新的Survivor to,原来的Survivor to成了新的Survivor from。复制的时候,如果Survivor to 无法容纳全部存活的对象,则根据老年代的分配担保(类似于银行的贷款担保)将对象copy进去老年代,如果老年代也无法容纳,则进行Full GC(老年代GC)。 大对象直接进入老年代:JVM中有个参数配置-XX:PretenureSizeThreshold,令大于这个设置值的对象直接进入老年代,目的是为了避免在Eden和Survivor区之间发生大量的内存复制。 长期存活的对象进入老年代:JVM给每个对象定义一个对象年龄计数器,如果对象在Eden出生并经过第一次Minor GC后仍然存活,并且能被Survivor容纳,将被移入Survivor并且年龄设定为1。没熬过一次Minor GC,年龄就加1,当他的年龄到一定程度(默认为15岁,可以通过XX:MaxTenuringThreshold来设定),就会移入老年代。但是JVM并不是永远要求年龄必须达到最大年龄才会晋升老年代,如果Survivor 空间中相同年龄(如年龄为x)所有对象大小的总和大于Survivor的一半,年龄大于等于x的所有对象直接进入老年代,无需等到最大年龄要求。 9:垃圾收集器 垃圾收集算法是方法论,垃圾收集器是具体实现。JVM规范对于垃圾收集器的应该如何实现没有任何规定,因此不同的厂商、不同版本的虚拟机所提供的垃圾收集器差别较大,这里只看HotSpot虚拟机。 JDK7/8后,HotSpot虚拟机所有收集器及组合(连线)如下: 1.Serial收集器 Serial收集器是最基本、历史最久的收集器,曾是新生代手机的唯一选择。他是单线程的,只会使用一个CPU或一条收集线程去完成垃圾收集工作,并且它在收集的时候,必须暂停其他所有的工作线程,直到它结束,即“Stop the World”。停掉所有的用户线程,对很多应用来说难以接受。比如你在做一件事情,被别人强制停掉,你心里奔腾而过的“羊驼”还数的过来吗? 尽管如此,它仍然是虚拟机运行在client模式下的默认新生代收集器:简单而高效(与其他收集器的单个线程相比,因为没有线程切换的开销等)。 工作示意图: 2.ParNew收集器 ParNew收集器是Serial收集器的多线程版本,除了使用了多线程之外,其他的行为(收集算法、stop the world、对象分配规则、回收策略等)同Serial收集器一样。 是许多运行在Server模式下的JVM中首选的新生代收集器,其中一个很重还要的原因就是除了Serial之外,只有他能和老年代的CMS收集器配合工作。 工作示意图: 3.Parallel Scavenge收集器 新生代收集器,并行的多线程收集器。它的目标是达到一个可控的吞吐量(就是CPU运行用户代码的时间与CPU总消耗时间的比值,即 吞吐量=行用户代码的时间/[行用户代码的时间+垃圾收集时间]),这样可以高效率的利用CPU时间,尽快完成程序的运算任务,适合在后台运算而不需要太多交互的任务。 4.Serial Old收集器 Serial 收集器的老年代版本,单线程,“标记整理”算法,主要是给Client模式下的虚拟机使用。 另外还可以在Server模式下: JDK 1.5之前的版本中雨Parallel Scavenge 收集器搭配使用 可以作为CMS的后背方案,在CMS发生Concurrent Mode Failure是使用 工作示意图: 5.Parallel Old收集器 Parallel Scavenge的老年代版本,多线程,“标记整理”算法,JDK 1.6才出现。在此之前Parallel Scavenge只能同Serial Old搭配使用,由于Serial Old的性能较差导致Parallel Scavenge的优势发挥不出来,尴了个尬~~ Parallel Old收集器的出现,使“吞吐量优先”收集器终于有了名副其实的组合。在吞吐量和CPU敏感的场合,都可以使用Parallel Scavenge/Parallel Old组合。组合的工作示意图如下: 6.CMS收集器 CMS(Concurrent Mark Sweep)收集器是一种以获取最短回收停顿时间为目标的收集器,停顿时间短,用户体验就好。 基于“标记清除”算法,并发收集、低停顿,运作过程复杂,分4步: 1)初始标记:仅仅标记GC Roots能直接关联到的对象,速度快,但是需要“Stop The World” 2)并发标记:就是进行追踪引用链的过程,可以和用户线程并发执行。 3)重新标记:修正并发标记阶段因用户线程继续运行而导致标记发生变化的那部分对象的标记记录,比初始标记时间长但远比并发标记时间短,需要“Stop The World” 4)并发清除:清除标记为可以回收对象,可以和用户线程并发执行 由于整个过程耗时最长的并发标记和并发清除都可以和用户线程一起工作,所以总体上来看,CMS收集器的内存回收过程和用户线程是并发执行的。 工作示意图: CSM收集器有3个缺点: 1)对CPU资源非常敏感 并发收集虽然不会暂停用户线程,但因为占用一部分CPU资源,还是会导致应用程序变慢,总吞吐量降低。 CMS的默认收集线程数量是=(CPU数量+3)/4;当CPU数量多于4个,收集线程占用的CPU资源多于25%,对用户程序影响可能较大;不足4个时,影响更大,可能无法接受。 2)无法处理浮动垃圾(在并发清除时,用户线程新产生的垃圾叫浮动垃圾),可能出现"Concurrent Mode Failure"失败。 并发清除时需要预留一定的内存空间,不能像其他收集器在老年代几乎填满再进行收集;如果CMS预留内存空间无法满足程序需要,就会出现一次"Concurrent Mode Failure"失败;这时JVM启用后备预案:临时启用Serail Old收集器,而导致另一次Full GC的产生; 3)产生大量内存碎片:CMS基于"标记-清除"算法,清除后不进行压缩操作产生大量不连续的内存碎片,这样会导致分配大内存对象时,无法找到足够的连续内存,从而需要提前触发另一次Full GC动作。 7.G1收集器 G1(Garbage-First)是JDK7-u4才正式推出商用的收集器。G1是面向服务端应用的垃圾收集器。它的使命是未来可以替换掉CMS收集器。 G1收集器特性: 并行与并发:能充分利用多CPU、多核环境的硬件优势,缩短停顿时间;能和用户线程并发执行。 分代收集:G1可以不需要其他GC收集器的配合就能独立管理整个堆,采用不同的方式处理新生对象和已经存活一段时间的对象。 空间整合:整体上看采用标记整理算法,局部看采用复制算法(两个Region之间),不会有内存碎片,不会因为大对象找不到足够的连续空间而提前触发GC,这点优于CMS收集器。 可预测的停顿:除了追求低停顿还能建立可以预测的停顿时间模型,能让使用者明确指定在一个长度为M毫秒的时间片段内,消耗在垃圾收集上的时间不超N毫秒,这点优于CMS收集器。 为什么能做到可预测的停顿? 是因为可以有计划的避免在整个Java堆中进行全区域的垃圾收集。 G1收集器将内存分大小相等的独立区域(Region),新生代和老年代概念保留,但是已经不再物理隔离。 G1跟踪各个Region获得其收集价值大小,在后台维护一个优先列表; 每次根据允许的收集时间,优先回收价值最大的Region(名称Garbage-First的由来); 这就保证了在有限的时间内可以获取尽可能高的收集效率。 对象被其他Region的对象引用了怎么办? 判断对象存活时,是否需要扫描整个Java堆才能保证准确?在其他的分代收集器,也存在这样的问题(而G1更突出):新生代回收的时候不得不扫描老年代? 无论G1还是其他分代收集器,JVM都是使用Remembered Set来避免全局扫描: 每个Region都有一个对应的Remembered Set; 每次Reference类型数据写操作时,都会产生一个Write Barrier 暂时中断操作; 然后检查将要写入的引用指向的对象是否和该Reference类型数据在不同的 Region(其他收集器:检查老年代对象是否引用了新生代对象); 如果不同,通过CardTable把相关引用信息记录到引用指向对象的所在Region对应的Remembered Set中; 进行垃圾收集时,在GC根节点的枚举范围加入 Remembered Set ,就可以保证不进行全局扫描,也不会有遗漏。 不计算维护Remembered Set的操作,回收过程可以分为4个步骤(与CMS较为相似): 1)初始标记:仅仅标记GC Roots能直接关联到的对象,并修改TAMS(Next Top at Mark Start)的值,让下一阶段用户程序并发运行时能在正确可用的Region中创建新对象,需要“Stop The World” 2)并发标记:从GC Roots开始进行可达性分析,找出存活对象,耗时长,可与用户线程并发执行 3)最终标记:修正并发标记阶段因用户线程继续运行而导致标记发生变化的那部分对象的标记记录。并发标记时虚拟机将对象变化记录在线程Remember Set Logs里面,最终标记阶段将Remember Set Logs整合到Remember Set中,比初始标记时间长但远比并发标记时间短,需要“Stop The World” 4)筛选回收:首先对各个Region的回收价值和成本进行排序,然后根据用户期望的GC停顿时间来定制回收计划,最后按计划回收一些价值高的Region中垃圾对象。回收时采用复制算法,从一个或多个Region复制存活对象到堆上的另一个空的Region,并且在此过程中压缩和释放内存;可以并发进行,降低停顿时间,并增加吞吐量。 工作示意图: 10:基本结构 从Java平台的逻辑结构上来看,我们可以从下图来了解JVM: 从上图能清晰看到Java平台包含的各个逻辑模块,也能了解到JDK与JRE的区别。 欢迎工作一到五年的Java工程师朋友们加入Java架构开发:860113481 群内提供免费的Java架构学习资料(里面有高可用、高并发、高性能及分布式、Jvm性能调优、Spring源码,MyBatis,Netty,Redis,Kafka,Mysql,Zookeeper,Tomcat,Docker,Dubbo,Nginx等多个知识点的架构资料)合理利用自己每一分每一秒的时间来学习提升自己,不要再用"没有时间“来掩饰自己思想上的懒惰!趁年轻,使劲拼,给未来的自己一个交代!

优秀的个人博客,低调大师

Java面试题整理《中》

一、数据库部分 简单介绍下关系数据库三范式 范式指的是数据库设计时要遵循的三个规范,但并不是强制式的,这三个规范呈阶梯式的关系,现有第一层然后在第一层的基础上有第二层... 第一范式规定列数据不可分割,即实体中的某个属性不能有多个值或者重复的属性;第二范式要求每个行必须可以被唯一的区分,就是表中必须有主键存在的意思;第三范式规定表中不包含已在其他表中已包含的非主关键字信息,意思是除了外键之外不能存储其他表的数据信息。 反三范式:出于对效率和便利性的追求,可以违反三范式设置重复或可以推导出的字段,比如为了在查询订单的总价时可以不用去计算每个订单项中的单价和在订单表中设置订单总价字段。 可以简单介绍下什么是事务? 事务是并发控制的最小单位(需要满足ACID),用户定义的一个操作序列要么都执行成功,要么都执行失败,比如转账,A扣钱,B加钱,这两个操作必须是不可分割的,在commit之后也不能被干扰,将执行的代码try/catch并调用回滚rollback撤销当前事务操作。 mysql数据库的默认的最大连接数? mysql数据的默认连接数大小是100,数据库在安装时都会设置一个最大连接数,这是因为一般服务器都只能支持一定数目同时连接。 说一下msyql的分页?oracle的分页? oracle的分页是采用了三层嵌套查询,没有用过不赘言。 mysql是使用关键字limit来进行分页查询的 String sql ="select * from students order by id limit " + pageSize*(pageNumber-1) + "," + pageSize; 存储过程是什么?它有什么优缺点? 存储过程本质上是sql语句的集合,这些集合像一个方法一样实现某一特定的功能,通过设置名称的方式提供调用。 由于是预编译的代码块,所以执行效率会比较高;由于很多SQL一起执行,所以节省网络带宽;存储过程提供安全机制,可以对于没有权限执行存储过程的用户进行控制; 缺点则是调试和更改时比较麻烦,而且也没办法做缓存和做数据库集群。因此对于存储过程的使用要慎重,对于提高SQL查询的性能而言,ORM框架做的会比存储过程好。 SQL语言本质是一种结构化查询语言,复杂的业务逻辑还是应该通过代码去实现。 有没有做过数据库优化方面的事情? 主要是使用索引、分表和缓存来做数据库优化,当有多个数据库服务器时,还可以采用读写分离的方式做数据库集群。 数据库优化之创建合适的索引 普通索引:允许重复的值出现 唯一索引:除了不能重复记录之外,其它的和普通索引一样,例如用户名,身份证,email,tel 主键索引:将表中某列设置为主键的时候数据库引擎会自动将该列设置为主键索引,这个主键索引唯一并且没有不能为null 全文索引:主要针对表中的文本域进行索引,比如char,varchar,text等字段 索引的弊端一是占用磁盘空间,二是对DML(增删改)操作会降低效率。 索引配合where条件,一般在字段内容不是频繁变化的时候使用,并且该字段的内容不是唯一的几个值,例如性别这个字段只有男女或未知 索引使用的技巧:对于like查询,如果模糊信息为'%aaa'的话就不会使用索引,因此在like查询中,关键字的最前面最好不要使用'%'或者'_'这样的字符,如果前面的值一定要有变化,则考虑使用全文索引(sphinx);如果条件查询中带有'or'关键字就不会使用索引,所以要避免使用'or'关键字;如果列是字符串类型,无论是不是字符串数字都要使用''包括起来,否则当值是数值类型的话会自动转换,如果不是数值类型则会报错;当表中只有一条数据时,全表扫描要比索引快,所以为了"效率"的查询数据,应该使用全表扫描的方式,233... 数据库优化之分表 当数据库单个表中数据越来越大(百万级别)的时候会导致数据查询缓慢,又因为数据库是多用户共享资源,并发存取同一数据的时候时需要添加锁机制来控制用户操作,所以会出现数据库性能瓶颈。这个时候就需要对数据库进行分表,就是把数据量大的表分成多个数据表,比如商品SPU和SKU表的商品描述信息进行表抽取和对单个数据比如价格,0-100和100-200在不同表中或通过自增长ID切割,这是水平分表。比如在电商项目中类似商品的分类、创建时间、品牌和规格等信息具有变化频率慢,查询次数多,而且有很好的实时性的数据,把这样的数据称之为冷数据;类似商品评论,广告,销量和价格排序这些变化频率慢的数据称之为热数据。将这些数据通过更改存储引擎,使用memcache、redis和从库配置等进行不同的处理。 数据库优化之读写分离 一台数据库服务器所支持的最大并发连接数是有限的,如果用户并发访问太多就需要考虑搭建集群,读写分离就是mysql处理集群的相关技术。使用负载均衡来实现写操作往主数据库库中去,读操作往从数据库中去。数据库最终都会把数据库持久化到磁盘,因此集群必须保证每个数据库服务器中数据是一致的,这就是主从同步技术。 数据库优化之缓存 每次读取数据都需要操作数据库,这对数据库很不友好,所以需要在持久层DAO和数据库DB中添加一个缓存层,这个缓存层一般都使用内存实现,如果访问的数据能够从缓存服务器中读取,那么就不会访问数据库。在Java中的缓存有ORM框架的二级缓存,需要注意的是Hibernate的二级缓存不能完成分布式缓存,还有可以使用memcache或者redis来对缓存的数据进行集中处理。 二、前端部分 简单说一下html,css,javascript在网页开发中的定位? HTML 超文本标记语言 定义网页的结构 CSS 层叠样式表,用来美化页面 JavaScript主要用来验证表单,做动态交互(其中ajax) 简单介绍一下Ajax? 如果不使用ajax,拿直播页面来说,你点击直播间的刷新按钮,那么包括弹幕在内的整个网页都会刷新。所以ajax不只是一门技术,只要是通过js调用异步通讯组件并使用格式化数据来更新页面上的内容就可以说是ajax,它实现了页面中局部位置的定点刷新。 ajax全称AsynchronousJavascript+XML(异步传输+js+xml),所谓异步就是在向服务器发送请求的时候不需要等待结果就可以做其他事,这就代表你可以在一个页面上同时看直播视频界面和弹幕。现在一般使用json来代替xml,好处是json更加简洁,解析速度也更快。 ajax原理是通过创建XmlHttpRequest对象,XmlHttpRequest是js提供的一个为客户端提供客户端与服务器之间传输数据的API对象。通过这个API对象调用onreadystatechange事件,该事件用于获取客户端浏览器向服务器发送数据的状态(200,404等),得到状态之后就会调用编写的回调函数。在这个过程中,其他代码还是在不断接收数据解析数据的,只是不会阻塞js代码。 var xhr = new XMLHttpRequest(); xhr.onreadystatechange = function () { //存储函数 当readyState属性发生改变时就会调用 Fuck(xhr.readyState);//readyState属性 0=请求未初始化,1=服务器连接已建立,2=请求已连接,3=请求处理中,4=请求已完成,且响应就绪 Fuck(xhr.status);//status属性 200=ok,404=访问资源未找到,401=没有访问权限,402=预留的状态码,403=禁止访问,500=服务器内部错误等等 } 缺点:ajax破坏了浏览器的back和history机制;违反了URL资源定位设计的初衷;对搜索引擎(SEO)有影响;不能很好的支持移动设备;破坏了程序的异常处理机制;由于现在的程序将大量原先在后端的代码放到了js文件中会导致客户端程序复杂并存在安全隐患。 使用场景:登录失败时不跳转页面,注册时提示用户名是否存在,二级联动。 js和jQuery的关系? JQ是一个封装了js属性和方法的框架,可以让开发者使用便利的同时也增强了js的功能,如果是使用原生js的话就需要处理很多兼容性问题和事件绑定,dom操作,ajax,注册事件等。JQ常用的选择器有ID选择器,class选择器,标签选择器等。 jQuery的页面加载完毕事件? 在js中想要获取元素必须要先加载元素,可以将获取元素的js代码放到元素标签后,但是这样会造成管理上的不便,所以一般等页面全部加载之后在获取元素。一般使用$(funcation(){});//当页面加载完毕之后会执行花括号中的函数,这是相对简单的方式,因此使用也是最多的。 需要注意的是JQ中的页面加载是指页面结构被加载完毕,而window.onload表示的是页面被加载完毕。 <img src=”htttp://baidu.com/1.jpg”/> onload必须等页面中的图片、声音、图像等远程资源被加载完毕后才调用,而jQuery中只需要页面结构被加载完毕。 简单说一下html5和css3?你对现在的那些新技术有了解? html5是最新版本的html,在html4的基础上增强了一些标签,比如画板,声音,视频,web存储这些功能。但是html5过于强调语义,比如使用header标签表示头部,footer表示底部。以前在开发都是采用div标签定义模块。 css3在css2的基础上做了增强,实现了一些原来在css2中实现起来比较困难,或者不能实现的功能,比如盒子和文字阴影,渐变,动画等。css3的缺点在于需要根据不同的浏览器处理兼容性,其实html5也有兼容性问题,比如html5播放器panda.tv就出于兼容性的考虑没有使用html5播放器。 三、框架部分 什么是框架? it语境中的框架是指为了解决某一开放性问题而设计的具有一定约束性的支撑结构,在这种结构上可以根据具体问题进行扩展,从而便捷的构建完整的解决问题的方案。 框架不能完全解决实际上遇到的问题,但可以快速的解决普遍问题。 框架是为了扩展而设计的 一般框架会提供很多辅助性的实用工具,比如java的一系列jar包就是对jdk功能的扩展。 简单讲一下SpringMVC的执行流程? SpringMVC本质上是一个前端控制器(DispatcherServlet),通过对处理器映射器,处理器适配器和视图解析器的调度来实现接收请求和响应数据。 说一下struts2和springMVC有什么不同? MVC的核心是Servlet,Strtus2的核心是Filter;MVC一般使用注解开发,Strtus2一般使用xml配置;MVC处理ajax请求,直接返回数据,在方法中通过注解@RequestBody,MVC就会自动将对象转换成json数据;而strtus2是通过插件转换的。 说一下Spring中的两大核心? IoC(Inversion of Control)或者称之为DI(Dependency Injection)是指程序将DAO的创建权交付Spring管理,通过配置文件和反射再加上Map来实现自动创建Bean。 AOP(Aspect Oriented Programming)被称之为面向切面编程,使用动态代理的方式在执行方法前后或应用程序出现异常时加入相关逻辑。比如对于事务和日志的处理。 什么是ORM? 对象关系映射简称ORM(Object Relational Mapping),通过对数据和对象之间映射元数据的方式,将程序中的对象自动持久化到关系数据库。 iBatis(mybatis)与Hibernate有什么不同? mybatis的好处在于将sql语句与java代码分离并提供将结果集自动封装为实体对象和对象集合的功能,还提供了自动将实体对象的属性传递给sql语句的参数这样的功能。 hibernate的好处在于可以自动生成sql语句并执行同时返回java结果。 两者最大的不同在于mybatis是面向sql的所以需要在xml配置文件中写sql,而hibernate是自动生成sql,需要考虑对象之间复杂的映射关系。因为这个特性所以hibernate无法完成特别复杂的查询。 四、其他部分 有没有用过linux?你都用它来做什么?linux的特点是长时间运行比较稳定,所以一般会用做服务器。linux提供C语言编译环境,所以需要C语言支持的redis和nginx等可以通过在C语言编译环境中获取软件包并运行。 说一下linux下面的一下常用命令? 查看文件 tail -f 删除文件 rm -rf 编辑文件 vi 创建文件夹 mkdir 删除文件夹 rm -f 获取当前路径 pwd 跳转目录 cd 切换用户 su -root 列举目录 ls 你是使用什么来连接远程的Linux服务器的? 需要依赖于Linux服务器安装ssh服务端,一般这个ssh服务的端口22. 需要依赖于Linux服务器安装sftp服务端,一般这个sftp服务的端口25. 使用xshell、putty等ssh客户端来连接服务器,使用xftp、winscp等sftp客户端来上传和现在文件。连接和上传、下载必须依赖于服务器的ssh、sftp服务,也就是linux服务器需要启动这两个服务。 没有使用过云主机?客户有租用过阿里的云主机,云主机就是一些云服务运营商比如阿里,腾讯,华为等提供远程的服务器功能,开发者只需要按需付费即可租用。使用ssh和sftp操作 有没有使用过redis? redis是什么redis是一个key-value的nosql的数据库,redis会先将数据存储到内存中,然后根据一定的策略持久化到磁盘,已达到断电也不会丢失数据。主要用来做缓存数据库的数据和做web集群的时候当做中央缓存存放session。 redis的数据淘汰机制在 redis 中,允许用户设置最大使用内存大小 server.maxmemory,在内存限定的情况下是很有用的。譬如,在一台 8G 机子上部署了 4 个 redis 服务点,每一个服务点分配 1.5G 的内存大小,减少内存紧张的情况,由此获取更为稳健的服务。 内存大小有限,需要保存有效的数据?redis 内存数据集大小上升到一定大小的时候,就会施行数据淘汰策略。 redis 提供 6种数据淘汰策略: volatile-lru:从已设置过期时间的数据集(server.db[i].expires)中挑选最近最少使用的数据淘汰 volatile-ttl:从已设置过期时间的数据集(server.db[i].expires)中挑选将要过期的数据淘汰 volatile-random:从已设置过期时间的数据集(server.db[i].expires)中任意选择数据淘汰 allkeys-lru:从数据集(server.db[i].dict)中挑选最近最少使用的数据淘汰 allkeys-random:从数据集(server.db[i].dict)中任意选择数据淘汰 no-enviction(驱逐):禁止驱逐数据 微信开发原理微信公众平台开发者,通过接入认证的方式,让我们的服务器能处理来自微信服务器转发的微信用户的请求,处理完成后返回给微信服务器,有微信服务器对用户响应。 怎么把微信和业务平台绑定?用户注册实体中包含一个微信号的字段,进行绑定操作的时候就是修改这个微信号的字段,我们需要通过微信网页授权的方式获取微信号。 当用户同意授权的时候我们可以得到一个code,通过这个code换取网页授权的微信号,就是openid,最后将openid存入到微信号字段中即可

优秀的个人博客,低调大师

django面试题(21道)

1、什么是wsgi? WSGI是Python在处理HTTP请求时,规定的一种处理方式。如一个HTTP Request过来了,那么就有一个相应的处理函数来进行处理和返回结果。WSGI就是规定这个处理函数的参数长啥样的,它的返回结果是长啥样的?至于该处理函数的名子和处理逻辑是啥样的,那无所谓。简单而言,WSGI就是规定了处理函数的输入和输出格式。 2、django请求的生命周期? . 当用户在浏览器中输入url时,浏览器会生成请求头和请求体发给服务端 请求头和请求体中会包含浏览器的动作(action),这个动作通常为get或者post,体现在url之中. . url经过Django中的wsgi,再经过Django的中间件,最后url到过路由映射表,在路由中一条一条进行匹配, 一旦其中一条匹配成功就执行对应的视图函数,后面的路由就不再继续匹配了. . 视图函数根据客户端的请求查询相应的数据.返回给Django,然后Django把客户端想要的数据做为一个字符串返回给客户端. . 客户端浏览器接收到返回的数据,经过渲染后显示给用户. 3、列举django的内置组件? .Admin是对model中对应的数据表进行增删改查提供的组件 .model组件:负责操作数据库 .form组件:1.生成HTML代码2.数据有效性校验3校验信息返回并展示 .ModelForm组件即用于数据库操作,也可用于用户请求的验证 4、列举django中间件的5个方法?以及django中间件的应用场景? .process_request : 请求进来时,权限认证 .process_view : 路由匹配之后,能够得到视图函数 .process_exception : 异常时执行 .process_template_responseprocess : 模板渲染时执行 .process_response : 请求有响应时执行 5、简述什么是FBV和CBV? FBV和CBV本质是一样的,基于函数的视图叫做FBV,基于类的视图叫做CBV 在python中使用CBV的优点: - .提高了代码的复用性,可以使用面向对象的技术,比如Mixin(多继承) - .可以用不同的函数针对不同的HTTP方法处理,而不是通过很多if判断,提高代码可读性 6、django的request对象是在什么时候创建的? class WSGIHandler(base.BaseHandler):-------request = self.request_class(environ) 请求走到WSGIHandler类的时候,执行cell方法,将environ封装成了request 7、如何给CBV的程序添加装饰器? from django.utils.decorators import method_decorator 1、给方法加: @method_decorator(check_login) def post(self, request): ... 2、给dispatch加: @method_decorator(check_login) def dispatch(self, request, *args, **kwargs): ... 3、给类加: @method_decorator(check_login, name="get") @method_decorator(check_login, name="post") class HomeView(View): ... 8、列举django orm 中所有的方法(QuerySet对象的所有方法) <1> all(): 查询所有结果 <2> filter(**kwargs): 它包含了与所给筛选条件相匹配的对象。获取不到返回None <3> get(**kwargs): 返回与所给筛选条件相匹配的对象,返回结果有且只有一个。 如果符合筛选条件的对象超过一个或者没有都会抛出错误。 <4> exclude(**kwargs): 它包含了与所给筛选条件不匹配的对象 <5> order_by(*field): 对查询结果排序 <6> reverse(): 对查询结果反向排序 <8> count(): 返回数据库中匹配查询(QuerySet)的对象数量。 <9> first(): 返回第一条记录 <10> last(): 返回最后一条记录 <11> exists(): 如果QuerySet包含数据,就返回True,否则返回False <12> values(*field): 返回一个ValueQuerySet——一个特殊的QuerySet,运行后得到的 并不是一系 model的实例化对象,而是一个可迭代的字典序列 <13> values_list(*field): 它与values()非常相似,它返回的是一个元组序列,values返回的是一个字典序列 <14> distinct(): 从返回结果中剔除重复纪录 9、select_related和prefetch_related的区别? 前提:有外键存在时,可以很好的减少数据库请求的次数,提高性能 select_related通过多表join关联查询,一次性获得所有数据,只执行一次SQL查询 prefetch_related分别查询每个表,然后根据它们之间的关系进行处理,执行两次查询 10、filter和exclude的区别? 两者取到的值都是QuerySet对象,filter选择满足条件的,exclude:排除满足条件的. 11、列举django orm中三种能写sql语句的方法 1.使用execute执行自定义的SQL 直接执行SQL语句(类似于pymysql的用法) # 更高灵活度的方式执行原生SQL语句 from django.db import connection cursor = connection.cursor() cursor.execute("SELECT DATE_FORMAT(create_time, '%Y-%m') FROM blog_article;") ret = cursor.fetchall() print(ret) 2.使用extra方法 :queryset.extra(select={"key": "原生的SQL语句"}) 3.使用raw方法 1.执行原始sql并返回模型 2.依赖model多用于查询 12、values和values_list的区别? values : queryset类型的列表中是字典 values_list : queryset类型的列表中是元组 13、cookie和session的区别: .cookie: cookie是保存在浏览器端的键值对,可以用来做用户认证 .session: 将用户的会话信息保存在服务端,key值是随机产生的字符串,value值是session的内容 依赖于cookie将每个用户的随机字符串保存到用户浏览器上 Django中session默认保存在数据库中:django_session表 flask,session默认将加密的数据写在用户的cookie中 14、如何使用django orm批量创建数据? objs=[models.Book(title="图书{}".format(i+15)) for i in range(100)] models.Book.objects.bulk_create(objs) 15、django的Form组件中,如果字段中包含choices参数,请使用两种方式实现数据源实时更新 1.重写构造函数 def__init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.fields["city"].widget.choices = models.City.objects.all().values_list("id", "name") 2.利用ModelChoiceField字段,参数为queryset对象authors = form_model.ModelMultipleChoiceField(queryset=models.NNewType.objects.all())//多选 16、django的Model中的ForeignKey字段中的on_delete参数有什么作用? 删除关联表中的数据时,当前表与其关联的field的操作 django2.0之后,表与表之间关联的时候,必须要写on_delete参数,否则会报异常 17、django的模板中自定义filter和simple_tag的区别? 自定义filter:{{ 参数1|filter函数名:参数2 }} 1.可以与if标签来连用 2.自定义时需要写两个形参 例子:自定义filter 1. 在app01下创建一个叫templatetags的Python包 2. 在templatetags的文件夹下创建py文件 myfilters 3. 在py文件中写代码 from django import template register = template.Library() @register.filter def add_sb(value,arg='aaa'): return "{}_sb_{}".formart(value,arg) @register.filter(name='sb') def add_sb(value,arg='aaa'): return "{}_sb_{}".formart(value,arg) 4. 使用自定义filter {% load myfilters %} {{ name|add_sb:'xxx'}} {{ name|sb:'xxx'}} simple_tag:{% simple_tag函数名 参数1 参数2 %} 1.可以传多个参数,没有限制 2.不能与if标签来连用 例子:自定义simpletag 创建 1 、在app01中创建一个名字是templatetags的包, 2、在包中创建一个py文件 3、在py文件中导入 from django import template register = template.Library() 4、写函数 @register.simple_tag(name="plus") def plus(a,b,c): return '{}+{}+{}'.format(a,b,c) 5、加装饰器@register.simple_tag(name="plus") 使用 1、导入 {% load mytag %} 2、使用 {% plus 1 2 3 %} 18、django中csrf的实现机制 第一步:django第一次响应来自某个客户端的请求时,后端随机产生一个token值,把这个token保存在SESSION状态中;同时,后端把这个token放到cookie中交给前端页面; 第二步:下次前端需要发起请求(比如发帖)的时候把这个token值加入到请求数据或者头信息中,一起传给后端;Cookies:{csrftoken:xxxxx} 第三步:后端校验前端请求带过来的token和SESSION里的token是否一致。 19、基于django使用ajax发送post请求时,都可以使用哪种方法携带csrf token? 1.后端将csrftoken传到前端,发送post请求时携带这个值发送 data: { csrfmiddlewaretoken: '{{ csrf_token }}' }, 2.获取form中隐藏标签的csrftoken值,加入到请求数据中传给后端 data: { csrfmiddlewaretoken:$('[name="csrfmiddlewaretoken"]').val() }, 3.cookie中存在csrftoken,将csrftoken值放到请求头中 headers:{ "X-CSRFtoken":$.cookie("csrftoken")} 20、Django本身提供了runserver,为什么不能用来部署?(runserver与uWSGI的区别) 1.runserver方法是调试 Django 时经常用到的运行方式,它使用Django自带的 WSGI Server 运行,主要在测试和开发中使用,并且 runserver 开启的方式也是单进程 。 2.uWSGI是一个Web服务器,它实现了WSGI协议、uwsgi、http 等协议。注意uwsgi是一种通信协议,而uWSGI是实现uwsgi协议和WSGI协议的 Web 服务器。uWSGI具有超快的性能、低内存占用和多app管理等优点,并且搭配着Nginx就是一个生产环境了,能够将用户访问请求与应用 app 隔离开,实现真正的部署 。相比来讲,支持的并发量更高,方便管理多进程,发挥多核的优势,提升性能。 21、Django如何实现websocket? django实现websocket官方推荐大家使用channels。channels通过升级http协议 升级到websocket协议。保证实时通讯。也就是说,我们完全可以用channels实现我们的即时通讯。而不是使用长轮询和计时器方式来保证伪实时通讯。他通过改造django框架,使django既支持http协议又支持websocket协议。 官方文档地址:https://channels.readthedocs.io/en/stable/

优秀的个人博客,低调大师

关于React面试题汇总

1、redux中间件 中间件提供第三方插件的模式,自定义拦截 action -> reducer 的过程。变为 action -> middlewares -> reducer 。这种机制可以让我们改变数据流,实现如异步 action ,action 过滤,日志输出,异常报告等功能。 常见的中间件: redux-logger:提供日志输出 redux-thunk:处理异步操作 redux-promise:处理异步操作,actionCreator的返回值是promise 2、redux有什么缺点 1.一个组件所需要的数据,必须由父组件传过来,而不能像flux中直接从store取。 2.当一个组件相关数据更新时,即使父组件不需要用到这个组件,父组件还是会重新render,可能会有效率影响,或者需要写复杂的shouldComponentUpdate进行判断。 3、react组件的划分业务组件技术组件? 根据组件的职责通常把组件分为UI组件和容器组件。 UI 组件负责 UI 的呈现,容器组件负责管理数据和逻辑。 两者通过React-Redux 提供connect方法联系起来。 具体使用可以参照如下链接:http://www.ruanyifeng.com/blog/2016/09/redux_tutorial_part_three_react-redux.html 4、react生命周期函数 这个问题要考察的是组件的生命周期 一、初始化阶段: getDefaultProps:获取实例的默认属性 getInitialState:获取每个实例的初始化状态 componentWillMount:组件即将被装载、渲染到页面上 render:组件在这里生成虚拟的DOM节点 componentDidMount:组件真正在被装载之后 二、运行中状态: componentWillReceiveProps:组件将要接收到属性的时候调用 shouldComponentUpdate:组件接受到新属性或者新状态的时候(可以返回false,接收数据后不更新,阻止render调用,后面的函数不会被继续执行了) componentWillUpdate:组件即将更新不能修改属性和状态 render:组件重新描绘 componentDidUpdate:组件已经更新 三、销毁阶段: componentWillUnmount:组件即将销毁 5、react性能优化是哪个周期函数? shouldComponentUpdate 这个方法用来判断是否需要调用render方法重新描绘dom。因为dom的描绘非常消耗性能,如果我们能在shouldComponentUpdate方法中能够写出更优化的dom diff算法,可以极大的提高性能。 详细参考: https//segmentfault.com/a/1190000006254212 6、为什么虚拟dom会提高性能? 虚拟dom相当于在js和真实dom中间加了一个缓存,利用dom diff算法避免了没有必要的dom操作,从而提高性能。 具体实现步骤如下: 用 JavaScript 对象结构表示 DOM 树的结构;然后用这个树构建一个真正的 DOM 树,插到文档当中 当状态变更的时候,重新构造一棵新的对象树。然后用新的树和旧的树进行比较,记录两棵树差异 把2所记录的差异应用到步骤1所构建的真正的DOM树上,视图就更新了。 参考链接: https://www.zhihu.com/question/29504639?sort=created 7、diff算法? 把树形结构按照层级分解,只比较同级元素。 给列表结构的每个单元添加唯一的key属性,方便比较。 React 只会匹配相同 class 的 component(这里面的class指的是组件的名字) 合并操作,调用 component 的 setState 方法的时候, React 将其标记为 dirty.到每一个事件循环结束, React 检查所有标记 dirty 的 component 重新绘制. 选择性子树渲染。开发人员可以重写shouldComponentUpdate提高diff的性能。 参考链接: https//segmentfault.com/a/1190000000606216 8、react性能优化方案 (1)重写shouldComponentUpdate来避免不必要的dom操作。 (2)使用 production 版本的react.js。 (3)使用key来帮助React识别列表中所有子组件的最小变化。 参考链接: https://segmentfault.com/a/1190000006254212 9、简述flux 思想 Flux 的最大特点,就是数据的"单向流动"。 1.用户访问 View 2.View 发出用户的 Action 3.Dispatcher 收到 Action,要求 Store 进行相应的更新 4.Store 更新后,发出一个"change"事件 5.View 收到"change"事件后,更新页面 参考链接: http://www.ruanyifeng.com/blog/2016/01/flux.html 10、React项目用过什么脚手架?Mern? Yeoman? Mern:MERN是脚手架的工具,它可以很容易地使用Mongo, Express, React and NodeJS生成同构JS应用。它最大限度地减少安装时间,并得到您使用的成熟技术来加速开发。 参考链接:http://www.open-open.com/lib/view/open1455953055292.html 原文发布时间为:2018年06月14日 原文作者:红蔷薇 本文来源: 掘金 如需转载请联系原作者

优秀的个人博客,低调大师

Js面试题__附答案

1、什么是JavaScript?(这是基本题,对很多程序员来说也是送分题!) JavaScript是客户端和服务器端脚本语言,可以插入到HTML页面中,并且是目前较热门的Web开发语言。同时,JavaScript也是面向对象编程语言。 类似的基本题目还包括:JavaScript都有哪些类型?JavaScript是谁发明的?...... 2、列举Java和JavaScript之间的区别? Java是一门十分完整、成熟的编程语言。相比之下,JavaScript是一个可以被引入HTML页面的编程语言。这两种语言并不完全相互依赖,而是针对不同的意图而设计的。 Java是一种面向对象编程(OOPS)或结构化编程语言,类似的如C ++或C,而JavaScript是客户端脚本语言,它被称为非结构化编程。 3. JavaScript和ASP脚本相比,哪个更快? JavaScript更快。JavaScript是一种客户端语言,因此它不需要Web服务器的协助来执行。另一方面,ASP是服务器端语言,因此总是比JavaScript慢。值得注意的是,Javascript现在也可用于服务器端语言(nodejs)。 4、什么是负无穷大? 负无穷大是JavaScript中的一个数字,可以通过将负数除以零来得到。 5、如何将JavaScript代码分解成几行吗? 在字符串语句中可以通过在第一行末尾使用反斜杠“\”来完成 例:document.write("This is \a program"); 如果不是在字符串语句中更改为新行,那么javaScript会忽略行中的断点。 例: var x=1, y=2, z= x+y; 上面的代码是完美的,但并不建议这样做,因为阻碍了调试。 6、什么是未声明和未定义的变量? 未声明的变量是程序中不存在且未声明的变量。如果程序尝试读取未声明变量的值,则会遇到运行时错误。未定义的变量是在程序中声明但尚未给出任何值的变量。如果程序尝试读取未定义变量的值,则返回未定义的值。 7、如何编写可动态添加新元素的代码? 8、什么是全局变量?这些变量如何声明,使用全局变量有哪些问题? 全局变量是整个代码长度可用的变量,也就是说这些变量没有任何作用域。var关键字用于声明局部变量或对象。如果省略var关键字,则声明一个全局变量。 例:// Declare a global globalVariable = “Test”; 使用全局变量所面临的问题是本地和全局变量名称的冲突。此外,很难调试和测试依赖于全局变量的代码。 9、解释JavaScript中定时器的工作?如果有,也可以说明使用定时器的缺点? 定时器用于在设定的时间执行一段代码,或者在给定的时间间隔内重复该代码。这通过使用函数setTimeout,setInterval和clearInterval来完成。 setTimeout(function,delay)函数用于启动在所述延迟之后调用特定功能的定时器。 setInterval(function,delay)函数用于在提到的延迟中重复执行给定的功能,只有在取消时才停止。 clearInterval(id)函数指示定时器停止。 定时器在一个线程内运行,因此事件可能需要排队等待执行。 10、ViewState和SessionState有什么区别? “ViewState”特定于会话中的页面。 “SessionState”特定于可在Web应用程序中的所有页面上访问的用户特定数据。 11、什么是===运算符? ===被称为严格等式运算符,当两个操作数具有相同的值而没有任何类型转换时,该运算符返回true。 12、说明如何使用JavaScript提交表单? 要使用JavaScript提交表单,请使用 document.form [0] .submit(); 13、元素的样式/类如何改变? 可以通过以下方式完成: document.getElementById(“myText”).style.fontSize = “20?; 或 document.getElementById(“myText”).className = “anyclass”; 14、JavaScript中的循环结构都有什么? For、While、do-while loops 15、如何在JavaScript中将base字符串转换为integer? parseInt() 函数解析一个字符串参数,并返回一个指定基数的整数。parseInt()将要转换的字符串作为其第一个参数,第二个参数是给定字符串的基础。 为了将4F(基数16)转换为整数,所使用的代码是 :parseInt ("4F", 16); 16、说明“==”和“===”之间的区别? “==”仅检查值相等,而“===”是一个更严格的等式判定,如果两个变量的值或类型不同,则返回false。 17、3 + 2 +“7”的结果是什么? 由于3和2是整数,它们将直接相加。由于7是一个字符串,它将会被直接连接,所以结果将是57。 18、说明如何检测客户端机器上的操作系统? 为了检测客户端机器上的操作系统,应使用navigator.appVersion字符串(属性)。 19、Javascript中的NULL是什么意思? NULL用于表示无值或无对象。它意味着没有对象或空字符串,没有有效的布尔值,没有数值和数组对象。 20、delete操作符的功能是什么? delete操作符用于删除程序中的所有变量或对象,但不能删除使用VAR关键字声明的变量。 21、JavaScript中有哪些类型的弹出框? Alert、Confirm and、Prompt 22、Void(0)怎么用? Void(0)用于防止页面刷新,并在调用时传递参数“zero”。 Void(0)用于调用另一种方法而不刷新页面。 23、如何强制页面加载JavaScript中的其他页面? 必须插入以下代码才能达到预期效果: 24、escape字符是用来做什么的? 使用特殊字符(如单引号,双引号,撇号和&符号)时,将使用转义字符(反斜杠)。在字符前放置反斜杠,使其显示。 例: 25、什么是JavaScript Cookie? Cookie是用来存储计算机中的小型测试文件,当用户访问网站以存储他们需要的信息时,它将被创建。 26、解释JavaScript中的pop()方法? pop()方法与shift()方法类似,但不同之处在于Shift方法在数组的开头工作。此外,pop()方法将最后一个元素从给定的数组中取出并返回。然后改变被调用的数组。 例: var cloths = [“Shirt”, “Pant”, “TShirt”]; cloths.pop(); //Now cloth becomes Shirt,Pant 27、在JavaScript中使用innerHTML的缺点是什么? 如果在JavaScript中使用innerHTML,缺点是:内容随处可见;不能像“追加到innerHTML”一样使用;即使你使用+ = like“innerHTML = innerHTML +'html'”旧的内容仍然会被html替换;整个innerHTML内容被重新解析并构建成元素,因此它的速度要慢得多;innerHTML不提供验证,因此我们可能会在文档中插入有效的和破坏性的HTML并将其中断。 28、break和continue语句的作用? Break语句从当前循环中退出。 continue语句继续下一个循环语句。 29、在JavaScript中,dataypes的两个基本组是什么? Primitive Reference types 原始类型是数字和布尔数据类型。引用类型是更复杂的类型,如字符串和日期。 30、如何创建通用对象? 通用对象可以创建为: var I = new object(); 31、operator类型用来做什么? 'Typeof'是一个运算符,用于返回变量类型的字符串描述。 32、哪些关键字用于处理异常? try... Catch-finally用于处理JavaScript中的异常。 33、JavaScript中不同类型的错误有几种? 有三种类型的错误: Load time errors:该错误发生于加载网页时,例如出现语法错误等状况,称为加载时间错误,并且会动态生成错误。 Run time errors:由于在HTML语言中滥用命令而导致的错误。 Logical Errors:这是由于在具有不同操作的函数上执行了错误逻辑而发生的错误。 34、在JavaScript中使用的Push方法是什么? push方法用于将一个或多个元素添加或附加到数组的末尾。使用这种方法,可以通过传递多个参数来附加多个元素。 35、什么是JavaScript中的unshift方法? Unshift方法就像在数组开头工作的push方法。该方法用于将一个或多个元素添加到数组的开头。 36、对象属性如何分配? 属性按以下方式分配给对象: obj["class"] = 12; 或 obj.class = 12; 37、获得CheckBox状态的方式是什么? alert(document.getElementById('checkbox1')。checked); 如果CheckBox被检查,此警报将返回TRUE。 38、解释window.onload和onDocumentReady? 在载入页面的所有信息之前,不运行onload函数。这导致在执行任何代码之前会出现延迟。 onDocumentReady在加载DOM之后加载代码。这允许早期的代码操纵。 39、你将如何解释JavaScript中的闭包? 什么时候使用? Closure是与函数返回时保留在内存中的函数相关的本地声明变量。 例如: 40、一个值如何附加到数组? 可以以给定的方式将值附加到数组: arr [arr.length] = value; 41、解释for-in循环? for-in循环用于循环对象的属性。 for-in循环的语法是: 在每次循环中,来自对象的一个属性与变量名相关联,循环继续,直到对象的所有属性都被耗尽。 42、描述JavaScript中的匿名函数? 被声明为没有任何命名标识符的函数被称为匿名函数。一般来说,匿名函数在声明后无法访问。 匿名函数声明: 43、.call()和.apply()之间有什么区别? 函数.call()和.apply()在使用上非常相似,只是有一点区别。当程序员知道函数参数的编号时,使用.call(),因为它们必须在调用语句中被提及为参数。另一方面,当不知道数字时使用.apply(),函数.apply()期望参数为数组。 .call()和.apply()之间的基本区别在于将参数传递给函数。它们的用法可以通过给定的例子进行说明。 44、定义事件冒泡? JavaScript允许DOM元素嵌套在一起。在这种情况下,如果单击子级的处理程序,父级的处理程序也将执行同样的工作。 45、什么样的布尔运算符可以在JavaScript中使用? “And”运算符(&&),'Or'运算符(||)和'Not'运算符(!)可以在JavaScript中使用。 *运算符没有括号。 46、一个特定的框架如何使用JavaScript中的超链接定位? 可以通过使用“target”属性在超链接中包含所需帧的名称来实现。 >New Page 47、在web-garden和web-farm之间有何不同? web-garden和web-farm都是网络托管系统。唯一的区别是web-garden是在单个服务器中包含许多处理器的设置,而web-farm是使用多个服务器的较大设置。 48、如何分配对象属性? 将属性分配给对象的方式与赋值给变量值相同。例如,表单对象的操作值以下列方式分配为“‘submit”:Document.form.action =“submit” 49、在JavaScript中读取和写入文件的方法是什么? 可以通过使用JavaScript扩展(从JavaScript编辑器运行),打开文件的示例来完成: fh = fopen(getScriptPath(), 0); 50、在JavaScript中如何使用DOM? DOM代表文档对象模型,并且负责文档中各种对象的相互交互。DOM是开发网页所必需的,其中包括诸如段落,链接等对象。可以操作这些对象以包括添加或删除等操作,DOM还需要向网页添加额外的功能。除此之外,API的使用比其他更有优势。 51、JavaScript中如何使用事件处理程序? 事件是由用户生成活动(例如单击链接或填写表单)导致的操作。需要一个事件处理程序来管理所有这些事件的正确执行。事件处理程序是对象的额外属性。此属性包括事件的名称以及事件发生时采取的操作。 52、解释延迟脚本在JavaScript中的作用? 默认情况下,在页面加载期间,HTML代码的解析将暂停,直到脚本停止执行。这意味着,如果服务器速度较慢或者脚本特别沉重,则会导致网页延迟。在使用Deferred时,脚本会延迟执行直到HTML解析器运行。这减少了网页加载时间,并且它们的显示速度更快。 53、JavaScript中的各种功能组件是什么? JavaScript中的不同功能组件是: First-class函数:JavaScript中的函数被用作第一类对象。这通常意味着这些函数可以作为参数传递给其他函数,作为其他函数的值返回,分配给变量,也可以存储在数据结构中。 嵌套函数:在其他函数中定义的函数称为嵌套函数。 54、解释unshift()方法? 该方法在数组启动时起作用,与push()不同。 它将所需数量的元素添加到数组的顶部。例如: 输出如下所示: [" joseph "," Jane ", " charlie ", " john "] 55、decodeURI()和encodeURI()是什么? EncodeURl()用于将URL转换为十六进制编码。而DecodeURI()用于将编码的URL转换回正常。 56、为什么不建议在JavaScript中使用innerHTML? innerHTML内容每次刷新,因此很慢。 在innerHTML中没有验证的余地,因此,更容易在文档中插入错误代码,从而使网页不稳定。 57、如何在不支持JavaScript的旧浏览器中隐藏JavaScript代码? 在标签之后的代码中添加“ 在标签之前添加“// - >”代码中没有引号。 旧浏览器现在将JavaScript代码视为一个长的HTML注释。而支持JavaScript的浏览器则将“<! - ”和“// - >”作为一行注释。 如果对你有帮助的话,可以点赞收藏哟! 【如果大家对程序员,web前端感兴趣,想要学习的,关注一下小编吧。加群:731771211。免费赠送web前端系统的学习资料!!】

优秀的个人博客,低调大师

Java面试通关要点汇总集

框架篇 Spring BeanFactory 和 ApplicationContext 有什么区别 Spring Bean 的生命周期 Spring IOC 如何实现 说说 Spring AOP Spring AOP 实现原理 动态代理(cglib 与 JDK) Spring 事务实现方式 Spring 事务底层原理 如何自定义注解实现功能 Spring MVC 运行流程 Spring MVC 启动流程 Spring 的单例实现原理 Spring 框架中用到了哪些设计模式 Spring 其他产品(Srping Boot、Spring Cloud、Spring Secuirity、Spring Data、Spring AMQP 等) Netty 为什么选择 Netty 说说业务中,Netty 的使用场景 原生的 NIO 在 JDK 1.7 版本存在 epoll bug 什么是TCP 粘包/拆包 TCP粘包/拆包的解决办法 Netty 线程模型 说说 Netty 的零拷贝 Netty 内部执行流程 Netty 重连实现 微服务篇 微服务 前后端分离是如何做的 微服务哪些框架 你怎么理解 RPC 框架 说说 RPC 的实现原理 说说 Dubbo 的实现原理 你怎么理解 RESTful 说说如何设计一个良好的 API 如何理解 RESTful API 的幂等性 如何保证接口的幂等性 说说 CAP 定理、 BASE 理论 怎么考虑数据一致性问题 说说最终一致性的实现方案 你怎么看待微服务 微服务与 SOA 的区别 如何拆分服务 微服务如何进行数据库管理 如何应对微服务的链式调用异常 对于快速追踪与定位问题 微服务的安全 分布式 谈谈业务中使用分布式的场景 Session 分布式方案 分布式锁的场景 分布是锁的实现方案 分布式事务 集群与负载均衡的算法与实现 说说分库与分表设计 分库与分表带来的分布式困境与应对之策 安全问题 安全要素与 STRIDE 威胁 防范常见的 Web 攻击 服务端通信安全攻防 HTTPS 原理剖析 HTTPS 降级攻击 授权与认证 基于角色的访问控制 基于数据的访问控制 性能优化 性能指标有哪些 如何发现性能瓶颈 性能调优的常见手段 说说你在项目中如何进行性能调优 工程篇 需求分析 你如何对需求原型进行理解和拆分 说说你对功能性需求的理解 说说你对非功能性需求的理解 你针对产品提出哪些交互和改进意见 你如何理解用户痛点 设计能力 说说你在项目中使用过的 UML 图 你如何考虑组件化 你如何考虑服务化 你如何进行领域建模 你如何划分领域边界 说说你项目中的领域建模 说说概要设计 设计模式 你项目中有使用哪些设计模式 说说常用开源框架中设计模式使用分析 说说你对设计原则的理解 23种设计模式的设计理念 设计模式之间的异同,例如策略模式与状态模式的区别 设计模式之间的结合,例如策略模式+简单工厂模式的实践 设计模式的性能,例如单例模式哪种性能更好。 业务工程 你系统中的前后端分离是如何做的 说说你的开发流程 你和团队是如何沟通的 你如何进行代码评审 说说你对技术与业务的理解 说说你在项目中经常遇到的 Exception 说说你在项目中遇到感觉最难Bug,怎么解决的 说说你在项目中遇到印象最深困难,怎么解决的 你觉得你们项目还有哪些不足的地方 你是否遇到过 CPU 100% ,如何排查与解决 你是否遇到过 内存 OOM ,如何排查与解决 说说你对敏捷开发的实践 说说你对开发运维的实践 介绍下工作中的一个对自己最有价值的项目,以及在这个过程中的角色 软实力 说说你的亮点 说说你最近在看什么书 说说你觉得最有意义的技术书籍 工作之余做什么事情 说说个人发展方向方面的思考 说说你认为的服务端开发工程师应该具备哪些能力 说说你认为的架构师是什么样的,架构师主要做什么 说说你所理解的技术专家 点击链接加入群聊【Java架构师之路】: https://jq.qq.com/?_wv=1027&k=5ls3Ug7

资源下载

更多资源
优质分享App

优质分享App

近一个月的开发和优化,本站点的第一个app全新上线。该app采用极致压缩,本体才4.36MB。系统里面做了大量数据访问、缓存优化。方便用户在手机上查看文章。后续会推出HarmonyOS的适配版本。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。