Java 中级面试题及答案整理 (1)
12、HashMap 和 Hashtable 的区别:
HashMap 和 Hashtable 都实现了 Map 接口,但决定用哪一个之前先要弄清楚它们之间的分别。主要的区别有:线程安全性,同步(synchronization),以及速度。
HashMap 几乎可以等价于 Hashtable,除了 HashMap 是非 synchronized 的,并可以接受 null(HashMap 可以接受为 null 的键值(key)和值(value),而 Hashtable 则不行)。
HashMap 是非 synchronized,而 Hashtable 是 synchronized,这意味着 Hashtable 是线程安全的,多个线程可以共享一个 Hashtable;而如果没有正确的同步的话,多个线程是不能共享 HashMap 的。Java 5 提供了 ConcurrentHashMap,它是 HashTable 的替代,比 HashTable 的扩展性更好。
另一个区别是 HashMap 的迭代器(Iterator)是 fail-fast 迭代器,而 Hashtable 的 enumerator 迭代器不是 fail-fast 的。所以当有其它线程改变了 HashMap 的结构(增加或者移除元素),将会抛出 ConcurrentModificationException,但迭代器本身的 remove()方法移除元素则不会抛出 ConcurrentModificationException 异常。但这并不是一个一定发生的行为,要看 JVM。这条同样也是 Enumeration 和 Iterator 的区别。
由于 Hashtable 是线程安全的也是 synchronized,所以在单线程环境下它比 HashMap 要慢。如果你不需要同步,只需要单一线程,那么使用 HashMap 性能要好过 Hashtable。
HashMap 不能保证随着时间的推移 Map 中的元素次序是不变的。
13、线程安全是什么?线程不安全是什么?
线程安全就是多线程访问时,采用了加锁机制,当一个线程访问该类的某个数据时,进行保护,其他线程不能进行访问直到该线程读取完,其他线程才可使用。不会出现数据不一致或者数据污染。(Vector,HashTable)?
线程不安全就是不提供数据访问保护,有可能出现多个线程先后更改数据造成所得到的数据是脏数据。(ArrayList,LinkedList,HashMap 等)
14、线程和进程的区别?
进程和线程都是一个时间段的描述,是 CPU 工作时间段的描述,不过是颗粒大小不同;
(1)进程是资源的分配和调度的一个独立单元,而线程是 CPU 调度的基本单元
(2)同一个进程中可以包括多个线程,并且线程共享整个进程的资源(寄存器、堆栈、上下文),一个进行至少包括一个线程。
(3)进程的创建调用 fork 或者 vfork,而线程的创建调用 pthread_create,进程结束后它拥有的所有线程都将销毁,而线程的结束不会影响同个进程中的其他线程的结束
(4)线程是轻两级的进程,它的创建和销毁所需要的时间比进程小很多,所有操作系统中的执行功能都是创建线程去完成的
(5)线程中执行时一般都要进行同步和互斥,因为他们共享同一进程的所有资源
(6)线程有自己的私有属性 TCB,线程 id,寄存器、硬件上下文,而进程也有自己的私有属性进程控制块 PCB,这些私有属性是不被共享的,用来标示一个进程或一个线程的标志
15、黑盒测试、灰盒测试、白盒测试、单元测试有什么区别?
黑盒测试关注程序的功能是否正确,面向实际用户;
白盒测试关注程序源代码的内部逻辑结构是否正确,面向编程人员;
灰盒测试是介于白盒测试与黑盒测试之间的一种测试。
单元测试(Unit Testing)是对软件基本组成单元进行的测试,如函数或是一个类的方法。这里的单元,就是软件设计的最小单 《一线大厂 Java 面试题解析+后端开发学习笔记+最新架构讲解视频+实战项目源码讲义》无偿开源 威信搜索公众号【编程进阶路】 位。
16、怎么对数据库百万级数据进行优化?
使用读写分离技术(
让主数据库(master)处理事务性增、改、删操作(INSERT、UPDATE、DELETE),而从数据库(slave)处理 SELECT 查询操作
)
17、Spring Bean 的生命周期:
Bean 的建立, 由 BeanFactory 读取 Bean 定义文件,并生成各个实例
Setter 注入,执行 Bean 的属性依赖注入
BeanNameAware 的 setBeanName(), 如果实现该接口,则执行其 setBeanName 方法
BeanFactoryAware 的 setBeanFactory(),如果实现该接口,则执行其 setBeanFactory 方法
BeanPostProcessor 的 processBeforeInitialization(),如果有关联的 processor,则在 Bean 初始化之前都会执行这个实例的 processBeforeInitialization()方法
InitializingBean 的 afterPropertiesSet(),如果实现了该接口,则执行其 afterPropertiesSet()方法
Bean 定义文件中定义 init-method
BeanPostProcessors 的 processAfterInitialization(),如果有关联的 processor,则在 Bean 初始化之前都会执行这个实例的 processAfterInitialization()方法
DisposableBean 的 destroy(),在容器关闭时,如果 Bean 类实现了该接口,则执行它的 destroy()方法
Bean 定义文件中定义 destroy-method,在容器关闭时,可以在 Bean 定义文件中使用“destory-method”定义的方法
简单回答 springbean 生命周期:
(1)实例化(必须的)构造函数构造对象
(2)装配(可选的)为属性赋值
(3)回调(可选的)(容器-控制类和组件-回调类)
(4)初始化(init-method=" ")
(5)就绪
(6)销毁(destroy-method=" ")
18、springmvc 生命周期:
1A)客户端发出 http 请求,只要请求形式符合 web.xml
文件中配置的*.action 的话,就由 DispatcherServlet
来处理。
1B)DispatcherServlet 再将 http 请求委托给映射器
的对象来将 http 请求交给对应的 Action 来处理
2)映射器根据客户的 http 请求,再对比<bean name="/hello.action
如果匹配正确,再将 http 请求交给程序员写的 Action
3)执行 Action 中的业务方法,最终返回一个名叫 ModelAndView
的对象,其中封装了向视图发送的数据和视图的逻辑名
4)ModelAndView 对象随着响应到到 DispatcherServlet 中了
5)这时 DispatcherServlet 收到了 ModelAndView 对象,
它也不知道视图逻辑名是何意,又得委托一个名叫
视图解析器的对象去具体解析 ModelAndView 对象
中的内容
6)将视图解析器解析后的内容,再次交由 DispatcherServlet
核心控制器,这时核心控制器再将请求转发到具体的
视图页面,取出数据,再显示给用户
19、servlet 生命周期?
Servlet 通过调用?init ()?方法进行初始化。
Servlet 调用?service()?方法来处理客户端的请求。
Servlet 通过调用?destroy()?方法终止(结束)。
最后,Servlet 是由 JVM 的垃圾回收器进行垃圾回收的
20、ajax 怎么解决跨域?
参考:[http://blog.csdn.net/u014727260/article/details/72793459](()
① 代理(通过后台操作)
② JSONP(添加响应头,允许跨域?)
addHeader(‘Access-Control-Allow-Origin:*’);//允许所有来源访问?
addHeader(‘Access-Control-Allow-Method:POST,GET’);//允许访问的方式
③ 在 ajax 的 dataType 方式改为“jsonp”
21、Mysql 数据类型:
① 普通索引
② 唯一索引
③ 主键索引
④ 组合索引
⑤ 全文索引
参考:[https://www.cnblogs.com/luyucheng/p/6289714.html](()
22、Eureka 和 zookeeper 的区别?
① 做分布式下的服务发现还是使用 eureka 更好,也就是 AP 特性的分布式协调工具(zookeeper 因为网络故障就无法返回可用的主机)
② zookeeper 技术更加成熟,资料更多
③ Eureka。是 spring cloud 之下一个专门负责微服务服务注册和发现的组件,Eureka 就是为了服务发现而设计的
④ Zookeeper。是用来保证分布式一致性的一个软件。不是为了服务发现注册而设计的,只不过它的特性也可以被二次开发成服务发现注册中心罢了
23、SpringCloud 都有哪些组件?
Spring Cloud 为微服务架构开发涉及的配置管理,服务治理,熔断机制,智能路由,微代理,控制总线,一次性 token,全局一致性锁,leader 选举,分布式 session,集群状态管理等操作提供了一种简单的开发方式。
组件列:
Spring Cloud Config:配置管理工具,支持使用 Git 存储配置内容,支持应用配置的外部化存储,支持客户端配置信息刷新、加解密配置内容等
Spring Cloud Bus:事件、消息总线,用于在集群(例如,配置变化事件)中传播状态变化,可与 Spring Cloud Config 联合实现热部署。
Spring Cloud Netflix:针对多种 Netflix 组件提供的开发工具包,其中包括 Eureka、Hystrix、Zuul、Archaius 等。
Netflix Eureka:一个基于 rest 服务的服务治理组件,包括服务注册中心、服务注册与服务发现机制的实现,实现了云端负载均衡和中间层服务器的故障转移。
Netflix Hystrix:容错管理工具,实现断路器模式,通过控制服务的节点,从而对延迟和故障提供更强大的容错能力。
Netflix Ribbon:客户端负载均衡的服务调用组件。
Netflix Feign:基于 Ribbon 和 Hystrix 的声明式服务调用组件。
Netflix Zuul:微服务网关,提供动态路由,访问过滤等服务。
Netflix Archaius:配置管理 API,包含一系列配置管理 API,提供动态类型化属性、线程安全配置操作、轮询框架、回调机制等功能。
Spring Cloud for Cloud Foundry:通过 Oauth2 协议绑定服务到 CloudFoundry,CloudFoundry 是 VMware 推出的开源 PaaS 云平台。
Spring Cloud Sleuth:日志收集工具包,封装了 Dapper,Zipkin 和 HTrace 操作。
Spring Cloud Data Flow:大数据操作工具,通过命令行方式操作数据流。
Spring Cloud Security:安全工具包,为你的应用程序添加安全控制,主要是指 OAuth2。
Spring Cloud Consul:封装了 Consul 操作,consul 是一个服务发现与配置工具,与 Docker 容器可以无缝集成。
Spring Cloud Zookeeper:操作 Zookeeper 的工具包,用于使用 zookeeper 方式的服务注册和发现。
Spring Cloud Stream:数据流操作开发包,封装了与 Redis,Rabbit、Kafka 等发送接收消息。
评论