栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 前沿技术 > 大数据 > 大数据系统

【面试问题总结】8

【面试问题总结】8

1 String为什么是final修饰的? new 一个string的过程?

之所以将String类设计为不可变类,主要是处于安全和性能考虑。
1、字符串会用来存储敏感信息,如账号,密码等。如果字符串时可变的,容易被篡改。
2、在多线程中只有不可变的对象和值是线程安全的,可以在多个线程中共享数据。由于String天然的不可变,当一个线程修改了字符串的值,只会产生一个新的字符串对象,不会对其他线程的访问产生副作用,访问的都是同样的字符串数据,不需要任何同步操作。
3、字符串大量被应用在一些结合容器之中,尤其是一些散列集合。在散列集合中存放元素都要根据对象的hashCode()方法来确定元素的位置。由于String的不可变,避免重复计算hashCode。
4、当字符串不可变时,字符串常量池才有意义。字符串常量池可以减少创建相同字面量的字符串,让不同的引用指向池中同一个字符串,为运行时节约很多堆内存。若字符串可变,字符串常量池失去意义。

例如new String(“hello”),JVM会先使用常量池来管理“hello”直接量,再调用String类的构造器来创建一个新的String对象,新创建的String对象被保存在堆内存中。

2 jvm类加载机制

总体上分为三部分:加载、连接、初始化
加载:主要做三件事:
1、根据全限定类名加载二进制字节流
2、将字节流的静态存储结构转为运行时数据区
3、生成Class对象,作为数据访问的入口
连接分为检验、准备、解析
检验分为
1、文件格式检验:验证是否符合文件格式要求
2、元数据检验:判断变量是否符合java的规范
3、字节码检验:判断方法是否符合java的规范
4、符号引用检验:判断能否找到引用的类
准备:
给静态变量分配内存,赋予初值
解析:
将常量池中的符号引用变成直接引用
初始化:执行类加载器< clinit>()方法的过程。

3说一下堆,然后minorGC的发生时机有哪些?

堆里面分为新生代、老年代和永久代。
新生代主要存放刚创建的对象,在新生代经过一定次数的GC后存活下来的对象被放到老年代。永久代主要存储静态文件(存储类的元数据,用来存储class相关信息)。
其中新生代又分为Eden、两个幸存区From和To,From和To的角色会进行互换,但是To里面一定是空的。

当Eden满了之后会触发minorGC。

4运行时数据区内存模型

有五部分:程序计数器、虚拟机栈、本地方法栈、堆、方法区
1、程序计数器里面用于存放下一条指令的内存地址。它是线程私有的。
2、虚拟机栈:它也是线程私有的,当方法被执行的时候,java虚拟机会创建一个栈帧,里面存储局部变量表、操作数栈、动态连接、方法出口。java程序当中每一个方法的执行对应着栈帧从入栈到出栈的过程。
3、本地方法栈:它是为java调用本地方法服务的
4、堆:它是线程共享的区域,主要用来存放创建的对象。
5、方法区:它也是线程共享的区域,里面存放一些常量、静态变量、类信息。

5 linkedList和 ArrayList区别 ?向他们里边添加一个元素的过程,底层数据结构怎么实现?

1、linkedList底层是双向链表实现的,ArrayList底层是数组。
2、对于插入和删除操作linkedList会比ArrayList的性能好,对于查找ArrayList会比linkedList性能好。

1、如果指定了插入位置,linkedList会遍历链表找到对应位置,进行节点的插入。ArrayList会调用System.arraycopy()方法进行数组复制,在指定位置添加数据之后,后面的数据依次往后移动。
2、如果没指定插入位置,linkedList就是直接出入在链表尾部,ArrayList就是在数组末尾插入

6 一个数组,一个字符串,数据库层面 什么怎么存储

数据库中是不允许存放数组数据的,但是在应用场景中很有可能用到数组的存储,将数组分割成多个字段显然是不现实的,
我们可以通过将数组通过一个特殊的字符连接起来,组成一个字符串,然后将字符串存入数据库

7 RabbitMq的大致架构 ? 消息丢失方案解决?

交换器,用来接收生产者发送的消息并将这些消息路由给服务器中的队列。消息交换机,它指定消息按什么规则,路由到哪个队列。
Binding(绑定)
用于消息队列和交换器之间的关联。它的作用就是把exchange和queue按照路由规则绑定起来。
rabbitmq基础概念与基本原理架构

RabbitMQ丢失消息有三种情况:
1、生产者丢消息
生产者将数据发送给MQ的时候,可能因为网络原因将数据丢失了
解决方法:
在生产者端开启/confirm/i模式。这样每次写的消息都会分配一个唯一的id,如果消息被写入了MQ,MQ会回传给生产者一个ack消息,告诉你这个消息发送ok了。如果RabbitMQ没有处理这个消息,会回调nack接口,告诉你这个消息失败了,你可以进行重试。

2、RabbitMQ自己丢消息
如果没有开启RabbitMQ的持久化,那么RabbitMQ一旦重启数据就丢了。
解决方法:
设置消息持久化到磁盘。而且持久化可以根生产者的/confirm/i机制配合起来,只有消息持久化到磁盘之后,才会通知生产者ack,这样就算在持久化之前MQ挂了,数据丢了,生产者也会重发。

3、消费端丢消息
消费者刚接到消息还没处理,消费者就挂了,这样重启之后,RabbitMQ就会认为你消费过了,消息丢失。
解决方法:
使用MQ提供的ack机制。首先关闭MQ的自动ack,然后每次确保处理完这个消息之后,在代码里手动调用ack。

8隔离级别有哪些,怎么修改隔离级别。spring中隔离级别

使用命令:set session transaction isolation level read uncommitted;
Mysql的隔离级别和Spring事务的隔离级别一样有:读未提交、读已提交、重复读、串行化。

Spring事务隔离级别详解

9 脏读怎么解决,我说了隔离级别,加锁,还问我有别的方式吗?

修改时加排他锁,直到事务提交后才释放,读取时加共享锁,读取完释放事务1读取数据时加上共享锁后(这 样在事务1读取数据的过程中,其他事务就不会修改该数据),不允许任何事物操作该数据,只能读取,之后1如果有更新操作,那么会转换为排他锁,其他事务更 无权参与进来读写,这样就防止了脏读问题。

但是当事务1读取数据过程中,有可能其他事务也读取了该数据,读取完毕后共享锁释放,此时事务1修改数据,修改 完毕提交事务,其他事务再次读取数据时候发现数据不一致,就会出现不可重复读问题,所以这样不能够避免不可重复读问题。

10 聊一下反射

java程序中的对象在运行时可以表现为两种类型,即编译时类型和运行时类型。例如Person p=new Student();它编译时类型为Person,运行时类型为Student。
有时程序在运行时接收到外部传入的一个对象,该对象的编译时类型为Object,但程序又需要调用该对象的运行时类型的方法。这就要求程序需要在运行时发现对象和类的真实信息。编译时无法预知该对象和类属于哪些类,程序只依靠运行时信息来发现该对象和类的真实信息,就需要用到反射。
1、利用反射我们可以在程序运行时获得任意一个类的Class对象,并通过这个对象查看这个类的信息。
2、我们可以通过反射创建一个类的实例,并访问该实例的成员。
3、可以通过反射生成一个类的动态代理类或动态代理对象。
应用场景:
1、使用JDBC创建数据库的连接,需要先通过反射机制加载数据库的驱动程序。
2、从框架的注解或者xml配置中解析出来的类是字符串,需要利用反射机制实例化。
3、AOP是在程序运行时创建目标对象的代理类,需要用到反射实现。

11 HTTP协议?

1、HTTP协议和TCP/IP协议族内的其他众多协议相同,用于客户端和服务器之间的通信。
请求访问文本或图像等资源的一端成为客户端,而提供资源响应的一端称为服务器端。
请求从客户端发出,服务器端响应该请求并返回。
2、HTTP是不保存状态的协议,即使用HTTP协议,每当有新的请求发送时,就会有对应的新响应产生。协议本身并不保留之前一切的请求或响应报文的信息。
3、HTTP协议使用URI定位互联网上的资源。
4、HTTP常见的请求方法有:GET、POST、PUT、HEAD等。
5、HTTP协议的初始版本中,每进行一次HTTP通信就要断开一次TCP连接。在HTTP/1.1中出现了持久连接的方法。持久连接的特点是:只要任意一端没有明确提出断开连接,则保持TCP连接状态。持久连接减少了TCP连接的重复建立和断开所造成的额外开销,减轻了服务端的负载。之后又出现了管线化,之前发送请求后需等待并收到响应,才能发送下一个请求。管线化技术出现后,不用等待响应亦可以直接发送下一个请求。这样可以做到同时并行发送多个请求,而不需要一个接一个地等待响应了。

HTTP报文大致分为报文首部和报文主体两块。两者由空行划分。

请求报文的报文首部包含:请求行、请求首部字段、通用首部字段、实体首部字段、其他
请求行中包含用于请求的方法,请求URI和HTTP版本。

响应报文的报文首部包含:状态行、响应首都字段、通用首部字段、实体首部字段、其他
状态行包含表明响应结果的状态码,原因短语和HTTP版本。

UDP协议 ?

用户数据报协议,是传输层的协议。UDP提供不可靠服务。
1、它是无连接的,时间上不存在建立连接需要的时延。适用于即时通信例如QQ音视频通话、直播等
2、分组首部开销小,UDP首部8个字节,有四个字段构成:源端口、目的端口、长度、校验和
3、UDP没有拥塞控制
4、UDP尽最大努力的交付
5、UDP是面向报文的
UDP协议的详细解析

TCP协议 ?

传输控制协议,即对数据传输进行一定的控制。
1、它是面向连接的,提供可靠传输。
2、具有校验和、序列号、确认应答、重发控制、连接管理、窗口控制等
3、通过序列号与确认应答提高可靠性
4、具有三次握手、四次挥手连接管理
5、具有流量控制让发送端根据接收端的情况发送数据
6、还有窗口控制与重发机制、以及拥塞控制。

《图解TCP/IP》–TCP和UDP

TCP 详解

tcp协议的应用有哪些?

因为它需要建立连接,提供的是可靠的服务。TCP 一般用于文件传输、发送和接收邮件、远程登录等场景。
TCP用于传输数据量大,可靠性要求高的应用。
TCP支持的应用协议:Telnet(远程登录)、FTP(文件传输协议)、SMTP(简单邮件传输协议)。

12 说一下 springboot的特点?搭建一个spring boot工程需要的流程?

从本质上说,Spring Boot就是Spring,它做了那些没有它你自己也会去做的Spring Bean配置。Spring Boot使用约定大于配置的理念让你的项目快速运行起来。使用Spring Boot很容易创建一个能独立运行、基于Spring框架的项目,使用Spring Boot只需要配置很少的Spring配置。

创建项目的时候选择Spring Initializr,之后完善项目信息,之后再勾选你需要用到的start即可。

一个请求在Spring mvc中的请求流程


DispatcherServlet:分发请求。根据请求的路径url,分发给controller的方法。

1、请求来了先去遍历HandlerMapping(url和controller方法映射)(里面封装了controller方法,拦截器),对信息封装(封装了那个controller ,拦截器)
2、知道了要去调那个controller,就去调用HandlerAdapter(Controller),在controller方法的前后可能会有拦截器拦截,所以先调拦截器的preHandle(),controller调用之后,会返回ModelAndView(数和模板路径),
3、拿到了ModelAndView,知道了视图在哪里,数据是什么,调ViewReslover,将数据和模板给他,让他解析,将数据装到模板里面去。由View具体给客户端做响应
4、调用拦截器的方法
【总结】Spring Boot、Spring、SpringMVC

作者:luckyccc
链接:https://www.nowcoder.com/discuss/834358?channel=-1&source_id=profile_follow_post_nctrack
来源:牛客网

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/730370.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号